2015-07-22 16 views
1

最近我決定接受進化規劃的挑戰,並且在Rosetta Code發佈的問題上說,給定一個目標字符串,將隨機生成的字符串進行變異,直到它匹配目標。 我已經設法做了突變,但我的適應度函數錯誤,但我不知道爲什麼。我的健身功能是:進化算法打到一個不變的適應值

int 
closeness (char* string, char* target, int n) 
{ 
    int fit = 0, i, j; 

    if (n == 0) return 0; 

    if (!strcmp (string, target)) return 99999999; //if strings match, no need to iterate 

    for (i = n - 1; i > 0; i--) 
     { 
     if ((string[i] == target[i])) fit++; //fit gets increased by each matching letter. 
     } 

    return fit; 

而且,爲了不混亂整個帖子,here's the full code (Pastebin)
任何幫助是讚賞球員。

樣本輸出(用於目標字符串 「記錯」):

best match: ecskyzfjh in generation 1, specimen 0 with fitness 0 
best match: ecsuyzfjh in generation 2, specimen 0 with fitness 0 
best match: ecsuyzfjh in generation 3, specimen 0 with fitness 0 
best match: vc uyzfjh in generation 4, specimen 0 with fitness 0 
best match: vc uyzfjh in generation 5, specimen 0 with fitness 0 
best match: ve uyzfjh in generation 6, specimen 4 with fitness 1 
best match: ve lyzfjh in generation 7, specimen 4 with fitness 1 
best match: ve lyzfjh in generation 8, specimen 4 with fitness 1 
best match: ve lyzfjh in generation 9, specimen 4 with fitness 1 
best match: ve lyzfjh in generation 10, specimen 4 with fitness 1 
best match: vg lyzfjh in generation 11, specimen 4 with fitness 1 
best match: vgalyzfjh in generation 12, specimen 4 with fitness 1 
best match: vgalyzfjh in generation 13, specimen 4 with fitness 1 
best match: vgalyzfjh in generation 14, specimen 4 with fitness 1 
best match: ugalyzfjh in generation 15, specimen 4 with fitness 1 
best match: ugalyzrjh in generation 16, specimen 4 with fitness 1 
best match: ugalyhtjh in generation 17, specimen 4 with fitness 1 
best match: ugalyhtjh in generation 18, specimen 4 with fitness 1 
best match: ugalyhtjh in generation 19, specimen 4 with fitness 1 
best match: ugalyhtjz in generation 20, specimen 4 with fitness 1 
best match: ugalyhtjz in generation 21, specimen 4 with fitness 1 
best match: ugalyht l in generation 22, specimen 4 with fitness 1 
best match: ugalyht l in generation 23, specimen 4 with fitness 1 
best match: ugalyht l in generation 24, specimen 4 with fitness 1 
best match: galyyt l in generation 25, specimen 4 with fitness 1 
best match: galyyt l in generation 26, specimen 4 with fitness 1 
best match: yalyyt l in generation 27, specimen 4 with fitness 1 
best match: yalyytil in generation 28, specimen 4 with fitness 1 
best match: yalqytil in generation 29, specimen 4 with fitness 1 
best match: pyajqytil in generation 30, specimen 4 with fitness 1 
best match: pyajqytil in generation 31, specimen 4 with fitness 1 
best match: pyajqytio in generation 32, specimen 4 with fitness 1 
best match: pyajqytio in generation 33, specimen 4 with fitness 1 
best match: pyazqytio in generation 34, specimen 4 with fitness 1 
best match: pyazqytio in generation 35, specimen 4 with fitness 1 
best match: pyazqytio in generation 36, specimen 4 with fitness 1 
best match: pyazqptio in generation 37, specimen 4 with fitness 1 
best match: pyazoztuo in generation 38, specimen 4 with fitness 1 
best match: pyazoztuo in generation 39, specimen 4 with fitness 1 
best match: pyazoztux in generation 40, specimen 4 with fitness 1 
best match: hyazont x in generation 41, specimen 4 with fitness 1 
best match: hyazont y in generation 42, specimen 4 with fitness 1 
best match: hyazontay in generation 43, specimen 4 with fitness 1 
best match: hyuzoltay in generation 44, specimen 4 with fitness 1 
best match: hyuyoltay in generation 45, specimen 4 with fitness 1 
best match: hyuyoltay in generation 46, specimen 4 with fitness 1 
best match: hyuyoltay in generation 47, specimen 4 with fitness 1 
best match: hvuyoltay in generation 48, specimen 4 with fitness 1 
best match: hvuyoltay in generation 49, specimen 4 with fitness 1 
best match: hvlyoltly in generation 50, specimen 4 with fitness 1 
best match: hvlyoltly in generation 51, specimen 4 with fitness 1 
best match: hvlynltlv in generation 52, specimen 4 with fitness 1 
best match: hvlynltlv in generation 53, specimen 4 with fitness 1 
best match: hvlynltlv in generation 54, specimen 4 with fitness 1 
best match: hvlexltxv in generation 55, specimen 4 with fitness 1 
best match: hvlexltev in generation 56, specimen 4 with fitness 1 
best match: hvlexltev in generation 57, specimen 4 with fitness 1 
best match: hvlexltev in generation 58, specimen 4 with fitness 1 
best match: lvlexltev in generation 59, specimen 4 with fitness 1 
best match: lvlexltem in generation 60, specimen 4 with fitness 1 
best match: lvlexltem in generation 61, specimen 4 with fitness 1 
best match: lqlexlpem in generation 62, specimen 4 with fitness 1 
best match: lqlexdpem in generation 63, specimen 4 with fitness 1 
best match: lylaxdpem in generation 64, specimen 4 with fitness 1 
best match: lylaxdqem in generation 65, specimen 4 with fitness 1 
best match: lylsxdqxm in generation 66, specimen 4 with fitness 1 
best match: lylsidqxm in generation 67, specimen 4 with fitness 1 
best match: in generation 68, specimen 4 with fitness 1 
best match: in generation 69, specimen 4 with fitness 1 
best match: in generation 70, specimen 4 with fitness 1 
best match: in generation 71, specimen 4 with fitness 1 
best match: in generation 72, specimen 4 with fitness 1 
best match: ynldqxq q in generation 73, specimen 4 with fitness 1 
best match: ynhdqxq q in generation 74, specimen 4 with fitness 1 
best match: znhdqxqkq in generation 75, specimen 4 with fitness 1 
best match: znhdqxqqq in generation 76, specimen 4 with fitness 1 
best match: znbdqxqqq in generation 77, specimen 4 with fitness 1 
best match: znbjqxqqq in generation 78, specimen 4 with fitness 1 
best match: zbbjqxqqq in generation 79, specimen 4 with fitness 1 
best match: zbbjqxqpq in generation 80, specimen 4 with fitness 1 
best match: zbbjqxqpq in generation 81, specimen 4 with fitness 1 
best match: bbjqxqpq in generation 82, specimen 4 with fitness 1 
best match: bbjqxqpq in generation 83, specimen 4 with fitness 1 
best match: bbjqxlpq in generation 84, specimen 4 with fitness 1 
best match: brjqxaaq in generation 85, specimen 4 with fitness 1 
best match: brjqxaaq in generation 86, specimen 4 with fitness 1 
best match: prfqmaaq in generation 87, specimen 4 with fitness 1 
best match: xprfqmaaq in generation 88, specimen 4 with fitness 1 
best match: xprfrzaad in generation 89, specimen 4 with fitness 1 
best match: xpzfrxaad in generation 90, specimen 4 with fitness 1 
best match: xpefrxaad in generation 91, specimen 4 with fitness 1 
best match: xgefrxaad in generation 92, specimen 4 with fitness 1 
best match: xgefruaod in generation 93, specimen 4 with fitness 1 
best match: dgefruaod in generation 94, specimen 4 with fitness 1 
best match: dgefruaod in generation 95, specimen 4 with fitness 1 
best match: dge in generation 96, specimen 4 with fitness 1 
best match: in generation 97, specimen 4 with fitness 1 
best match: in generation 98, specimen 4 with fitness 1 
best match: in generation 99, specimen 4 with fitness 1 
best match: in generation 100, specimen 4 with fitness 1 

對於大多數人的預期健身將爲0

+0

指定樣本輸入,您期望的健身值以及您實際得到的健身值。 –

+0

我不能這樣做,因爲函數是在一個循環內部進行迭代,直到匹配的字符串與原始字符串相同。 – Pedro

+0

所以你不能使用printf打印出來,因爲它改變了,你也可以不使用調試器? – Cobusve

回答

0

的調用你的函數是:

健身[ i] =接近度(標本[i],目標,尺寸);

和大小是:

char target [] =「methinks」; size = sizeof(target);

c中的每個字符串都以char'\ 0'結尾,因此所有字符串函數都知道字符串結束的位置。如果你開始在位置sizeof(target)-1比較兩個字符串,它將首先比較兩個'\ 0'(邏輯上相等),然後比較其餘的。

此外我想改變環路:

爲(I = N - 1; i> = 0;我 - )

否則,第一個字符將不被比較。

讓我知道,如果這解決了你的問題。 ;)

0

下面是我在上面評論中提到的一個快速實現。它消除了特殊情況檢查,因爲循環無論如何照顧它。沒有必要使用n,因爲您使用strcmp意味着字符串以null結尾。它不會檢查是否平等,並且會發出魔法值,因爲您已經知道完全匹配會返回最大值。

我能想到的唯一可能的錯誤是,如果您在之前通過n = 0的情況下沒有終止字符串 - 這沒有機會退出。但是,如果您的空字符串以null開頭,那麼它是安全的。

請注意,我沒有真正嘗試編譯或測試代碼。

int closeness(char* string, char* target) 
{ 
    int fit = 0; 
    int index = 0; 
    while(string[index] && target[index]) 
    { 
     if(string[index] == target[index]) 
      fit++; 
     index++; 
    } 
    return fit; 
}