2015-05-16 49 views
1

我工作的GA遺傳算法中 - 穿越多維數組

的這個問題,我曾經通過簡單的劈裂一半的陣列,使新的基因出各佔一半的做了一個常規的1名維數組交叉。但現在我與多維數組。

我該如何做一個跨多維數組?

例:

array1 = [ 
    [[1, 2], 
    [3, 4]], 
    [[5, 6], 
    [7, 8]] 
] 

array2 = [ 
    [[10, 9], 
    [8, 7]], 
    [[6, 5], 
    [4, 3]] 
] 


Desired_array1 = [ 
    [[1, 9], 
    [3, 7]], 
    [[5, 5], 
    [7, 3]] 
] 

Desired_array2 = [ 
    [[10, 2], 
    [8, 4]], 
    [[6, 6], 
    [4, 8]] 
] 

當然在這種情況下,最內陣列大小爲2組的元素,但它可以是任何尺寸,且交叉點可以在任何點上,而不是限制性的交叉點的另一個數列的其他數列。

我的想法是製作一個具有相同結構的空陣列並用每個「染色體」填充元素。完全避免「分裂」。但是這可能會讓遺傳算法慢很多。

另一個想法是通過對數組進行平坦化,做一個正常的1維交叉,而不是將平坦化數組轉換爲原始結構。

那麼,我該怎麼辦?我似乎沒有在GA中使用多維數組,我用這種方式做錯了嗎?我應該改變輸入到一個常規的1維數組,並做簡單的交叉?

順便說一下,GA的輸入來自神經網絡,權重存儲在一個多維數組中,這樣數組第一維的第一個元素就是第一個層的權重,而最後一個元素是最後一個圖層的權重,第二個維度是每個節點的權重等等。

回答

0

沒有標準的交叉方式。據我所知,對於一種交叉類型的收斂率w.r.t沒有確定的結果。到另一個或w.r.t.沒有交叉(有時根本不使用交叉,在這些情況下,進化只是基於突變)。
由於交叉引起的遺傳算法收斂速度的提高是研究的問題。然而,到目前爲止,猜測你不能確定你的選擇是最好的(你也可以嘗試與不同類型的交叉進行比較,但這不會導致一般結果)。然而,GAs的強度並不是速度,而是適應不同問題的能力,所以只要結果令人滿意(除非性能提高實際上是您的目標),我不會過多擔心性能。:)

對於你的情況,由於你的基因代表了神經網絡的權重,所以你可以應用交叉「每層圖層」(一看就應該是像並行運行幾個GA一樣,一個網絡的每一層)。不能保證這比在整個多維數組中應用一個大交叉更好(即使它看起來更合理,因爲您正在將交叉應用到「可比較」的基因上......否則,您可能會有您的算法來切換最後一個的權重層與第一的權重,我不明白爲什麼這應該提高整體表現)。

+0

嗯,這很有趣,你有沒有交叉需要的部分鏈接,只是突變?我認爲跨界是GAs的主要觀點。 關於第一層與最後一個權重的交叉權重,這不應該發生,交叉將跨越權重。就像一個統一的交叉。所以第一層的重量11只會與另一個基因第一層的重量11相交。 但現在你讓我考慮了逐層交叉。並且擺脫重量,只需將基因1的第1層改爲基因2的第1層,反之亦然。 –

+0

GAs w/o crossover可以被看作是一種廣義模擬退火(在SA中,就好像你有一個單獨的個體,而不是一個總體,它會發生突變以解決最小化問題)。你可以看看http://baibook.epfl.ch。它並不是很短,但您可能會發現不同的有趣評論交叉,以及許多進一步研究的指針。 – Saphrosit

+0

由於網絡的高度對稱性(非常不同的網絡可能會帶來非常相似/好的結果,而將它們組合起來會使中間的某些東西具有非常低的性能),交叉網絡在處理NN時尤其有點微妙。再次,沒有最後的話可以說(直到現在,據我所知)。試試吧,如果它工作的很好!畢竟,這也是試錯學習的理念! :) – Saphrosit

0

所有的想法都很好,而且您的表示還可以。如果2D對你更好,你不需要使用一維數組作爲表示。哪一個交叉算子是最合適的,真的取決於你的矩陣代表什麼。一般來說,沒有人能夠說出什麼更合適,這是非常依賴問題的。例如,您可以基於一條線將交叉點切分爲兩部分,即任意角度和位置... 您可以生成從0開始的矢量的隨機參數dx,dy(double) 0,並且可能還會沿着矩形的邊緣(頂部或左側)移動它。該行將矩陣分成兩部分 - 一部分的等位基因從第一個父母開始,另一部分的等位基因將從另一個父母開始。

爲了簡化這一點,您只能使用與矩形邊界平行的線。或者你可以創建自己的操作符,或者如何實現這個操作,這一切都取決於基因型的哪些部分是合理的。

0

我不會添加任何東西給已經存在的答案,但對於一些奇怪的巧合,我已經在c#中開發了一個程序來做你正在嘗試做的事情(在我的情況下,我不使用多維輸入,但我在多維權重矩陣上應用交叉)。 該項目是開源,開源here

你可以從here

下載的二進制文件,我已經使用this紙crossOvering。