简易遗传算法适应度函数

时间:2015-08-14 14:21:47

标签: algorithm

我试图在c中做一个非常简单的遗传算法(用于学校研究项目)。我有点坚持计算健身百分比。

我尝试将来自用户输入的随机字符串与字典字匹配。 (可以想象一个拼字游戏算法或其他任何东西)

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

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

这里我为字典单词数组分配内存

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
      classpath:/jpaContext.xml, /WEB-INF/config/security-config.xml
</param-value>
</context-param>

这些也可以被释放:

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 )
{

}

此后我会逐代计算。

请注意,我只搜索固定长度的字符串ex:strlen(argv [1])

所有这些的示例输出可能是:

void mutate( char *arg )
{

}

或类似的东西。

3 个答案:

答案 0 :(得分:0)

通过逐个字母地比较两个字符串,度量可以是正确的/ max_length,其中&#39;正确&#39;是匹配的字母数和&#39; max_length&#39;是最长字符串的长度。

对于更复杂的内容,您可以查找编辑距离的概念。

答案 1 :(得分:0)

请参阅Edit distance

另见Levenshtein distance

基本上,您要测量的是将一个字符串转换为另一个字符串所需的最小操作次数。

答案 2 :(得分:0)

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

通过Google搜索,您可以找到有关如何计算此类距离的多个代码示例。一旦你有了距离,你的适应度应与它成反比。