我试图在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 )
{
}
或类似的东西。
答案 0 :(得分:0)
通过逐个字母地比较两个字符串,度量可以是正确的/ max_length,其中&#39;正确&#39;是匹配的字母数和&#39; max_length&#39;是最长字符串的长度。
对于更复杂的内容,您可以查找编辑距离的概念。
答案 1 :(得分:0)
答案 2 :(得分:0)
首先,您需要一个关于“字符串之间的距离”的指标。常用的是Levenshtein distance,它测量两个字符串之间的距离,作为将一个字符串更改为另一个字符串所需的最小单字符编辑数(即插入,删除或替换)。
通过Google搜索,您可以找到有关如何计算此类距离的多个代码示例。一旦你有了距离,你的适应度应与它成反比。