我想在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%
或类似的东西。
请分享一些您已经编写的代码。 – lintmouse
我不会尝试计算一种正确性,但计算错误:错误的字母,错误的字母顺序等。这通常更容易。 – Sirko
https://en.wikipedia.org/wiki/Levenshtein_distance – amit