2010-10-04 130 views
2

我開始鑽研GA到這裏來研究一下,我似乎無法找到交叉代斷點的答案。舉例來說,如果我開始與家長:
Father = [A,B,B,A,C]
Mother = [D,D,B,A,A]
交叉算法的實現

在什麼時候我能legitmately停止生產兒童證明所有可能的組合已經用盡?代碼如下:

void reproduce(String[] father, String[] mother) {
double choice = Math.random() * 100;
if((int) choice % 10 < 2){
//start at father[1] and swap.
//Continue for other choices

這是一小片,以我利用邏輯。所以我的問題回來了,我如何合理地確定何時停止創建孩子?或者,這只是一個數學問題,我應該只看一個直排列生成器,而忽略GA?

+0

我寧願認爲遺傳算法的重點在於尋找解決問題的啓發式方法,並非詳盡無遺。如果你不得不嘗試每種組合,那麼你可以在沒有GAs的情況下解決問題。 – 2010-10-04 00:40:07

+0

這可能更接近我們所需要的,因爲GA對我而言是新的東西,這就是爲什麼我似乎回到徹底搜索,因爲它是我熟悉的。 – Woot4Moo 2010-10-04 00:44:04

+0

GA最適合那些無法徹底解決的問題。當我在一家工程公司工作以解決*許多*變量和約束條件下的複雜非線性方程時,我們使用了類似的東西。 – 2010-10-04 00:45:32

回答

2

首先,這應該是一個不錯的方式,讓孩子離開父母。這是一個單點交叉。

public String[] reproduce(String[] father, String[] mother) { 
    int[] child=new String[father.length]; 
    int crossPoint = Math.random()*father.length;//make a crossover point 
    for (int i=0;i<father.length;++i) 
    { 
    if (i<crossPoint) 
     child[i]=father[i]; 
    else 
     child[i]=mother[i]; 
    } 
    return child; 
} 

沒有咖啡,所以沒有保證。你可能想要檢查一個錯誤。

+0

所以我們可以假設我們正在設置一個可以生成的排列的限制,儘管世代數可以>限制 – Woot4Moo 2010-10-04 13:17:45

+0

不確定你的意思......你不限制排列,你只是採取儘可能多的隨機孩子,以填補目前的代人隊伍(大約1000人左右)。正如託尼恩尼斯指出的那樣,它是啓發式的。你不會限制100000000000000000000000000的排列,你儘可能多地處理。 – Ishtar 2010-10-04 13:48:12

+0

這是早,我是半散漫= p – Woot4Moo 2010-10-04 15:45:52

1

由於您正在使用隨機數字進行更改,因此您不能保證在X孩子之後您將嘗試所有內容。如果你想嘗試每個選項,你不應該使用隨機數字。所以是的,用一個直排列生成器並忽略GA。

+0

如果我想以託尼的方式探索這種啓發式的方法,那麼這個需要怎麼改變? – Woot4Moo 2010-10-04 00:50:31

+0

將啓發式算法看作「好但不完美」的算法。你怎麼做取決於問題。 如果你想繼續使用GA的想法,但使用啓發式的方式選擇一個,我會使用貪婪的遞歸算法。選擇任何可能的孩子,然後再創建一個與第一個孩子只有一個基因不同的孩子。比較兩者,以及再次運行這個過程後,哪個孩子更好。繼續這樣做直到你找到一個更好的孩子,那麼所有的兄弟姐妹都會有一個基因與之不同。 – AmaDaden 2010-10-04 20:13:18