2015-08-14 45 views
-1

我想在c(为学校研究项目)做一个非常简单的遗传算法。我对计算健身比例感到困惑。简单的遗传算法健身功能

我想从用户输入中匹配一个随机字符串,用字典单词。 (可以想象一个拼字游戏算法或其他任何东西)

例如,当用户输入是“你好”和字典单词“你好”, 两个字符串匹配,100%的适应度应该是正确的。对于“hellp”和“hello”,几乎100%的健身和“uryyb”健身的健身应该(远)低于100%。

也许有人知道如何做健身功能或知道(一般)这种健身功能的参考?


在这里,我分配内存的字典中的字

int row; 

//alloceer eerst amount_words void * 
woorden = (char **) malloc(amount_words * (len + 1)); 

for(row = 0; row <= amount_words; row++) 
woorden[row] = (char *) malloc (len + 1); 

return; 

阵列这些也可以被释放:

int row; 

for(row = 0; row <= amount_words; row++) 
free(woorden[row]); 

free(woorden); 

return; 

在这里,我打开一个词典文件。

FILE *f; 
int amount_words = 0; 
char woord[40]; 

f = fopen("words.txt", "r"); 

while(!feof(f)) { 
fscanf(f, "%s\n", woord); 
if(strlen(woord) == len) { 
    amount_words++; 
    if(!is_valid_str(woord) ) 
    amount_words--; 
} 
} 
fclose(f); 

return amount_words; 

我粗暴地剥去字符:

char is_valid_str(char *str ) 
{ 
    int i; 
    for(i=0; i <= zoek_str_len - 1; i++) 
    if(str[i] < 'a' || str[i] > 'z') 
     return FALSE; 
    return TRUE; 
} 

我计算一定长度的话

amount_len_words(int len) 
{ 
FILE *f; 
int amount_words = 0; 
char woord[40]; 

f = fopen("words.txt", "r"); 

while(!feof(f)) { 
fscanf(f, "%s\n", woord); 
if(strlen(woord) == len) { 
    amount_words++; 
    if(!is_valid_str(woord) ) 
    amount_words--; 
} 
} 
fclose(f); 

return amount_words; 

} 

我读字的阵列,一定长度的量

FILE *f; 
int i=0; 
int lenwords; 
char woord[40]; 

lenwords = amount_len_words(len); 
alloc_woorden(lenwords, len); 

f = fopen("words.txt", "r"); 
while(!feof(f)) { 
    fscanf(f,"%s\n", woord); 
    if(strlen(woord) == len) { 
    if(is_valid_str(woord)) { 
    strncpy(woorden[i++], woord, len); 
    //printf("->%s\n", woorden[i]); 
    } 
} 
} 

for(i=0;i < lenwords;i++) { 
printf("%s\n", woorden[i]); 
} 

这是主程序

int i; 
char zoek_str[40]; 

if(argc <= 1) { 
printf("gebruik: %s zoek_string\n", argv[0]); 
return 0; 
} 

if(strlen(argv[1]) > 39) { 
printf("Zoek string maximaal 39 lowercase karakters.\n"); 
return 0; 
} 

strcpy(zoek_str, argv[1]); 
zoek_str_len = strlen (zoek_str); 

if(!is_valid_str(zoek_str)) { 
printf("Ongeldige zoek string. Neemt alleen lowercase karakters!\n"); 
return 0; 
} 

printf("%s\n",zoek_str); 

init_words(zoek_str_len); 

return 0; 
} 

这两个是我目前正在纳闷的功能:

double calculate_fitness(char *zoek) 
{ 

} 

而且

void mutate(char *arg) 
{ 

} 

之后我会被一代一代计算。

注意,我只在固定长度字符串前搜索:strlen的所有这些的(的argv [1])

示例输出可以是:

generation string  word  percentage 

1    hfllr  hello  89.4% 

2    hellq  hello  90.3% 

3    hellp  hello  95.3% 

4    hello  hello  100% 

或类似的东西。

+0

请分享一些您已经编写的代码。 – lintmouse

+0

我不会尝试计算一种正确性,但计算错误:错误的字母,错误的字母顺序等。这通常更容易。 – Sirko

+0

https://en.wikipedia.org/wiki/Levenshtein_distance – amit

回答

0

通过逐字母比较两个字符串,度量可能是正确的/ max_length,其中'correct'是匹配字母的数量,'max_length'是最长字符串的长度。

对于更多参与的事情,您可以查看编辑距离的概念。

+0

我试着做类似的事情,迭代通过逐个字符串字符,计算每个字符的偏移量,生成0到max_length * max_distance之间的距离变量,并从中计算百分比,但Levenshtein算法看起来好多了。 –

0

首先,您需要一个关于“字符串之间的距离”的度量。一种常用的方法是Levenshtein distance,它将两个字符串之间的距离测量为将一个字符串更改为另一个字符串所需的单字符编辑(即插入,删除或替换)的最小数量。

使用Google搜索,您可以找到多个代码示例,了解如何计算此类距离。一旦你有了距离,你的健身应该与它成反比。