我工作的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的輸入來自神經網絡,權重存儲在一個多維數組中,這樣數組第一維的第一個元素就是第一個層的權重,而最後一個元素是最後一個圖層的權重,第二個維度是每個節點的權重等等。
嗯,這很有趣,你有沒有交叉需要的部分鏈接,只是突變?我認爲跨界是GAs的主要觀點。 關於第一層與最後一個權重的交叉權重,這不應該發生,交叉將跨越權重。就像一個統一的交叉。所以第一層的重量11只會與另一個基因第一層的重量11相交。 但現在你讓我考慮了逐層交叉。並且擺脫重量,只需將基因1的第1層改爲基因2的第1層,反之亦然。 –
GAs w/o crossover可以被看作是一種廣義模擬退火(在SA中,就好像你有一個單獨的個體,而不是一個總體,它會發生突變以解決最小化問題)。你可以看看http://baibook.epfl.ch。它並不是很短,但您可能會發現不同的有趣評論交叉,以及許多進一步研究的指針。 – Saphrosit
由於網絡的高度對稱性(非常不同的網絡可能會帶來非常相似/好的結果,而將它們組合起來會使中間的某些東西具有非常低的性能),交叉網絡在處理NN時尤其有點微妙。再次,沒有最後的話可以說(直到現在,據我所知)。試試吧,如果它工作的很好!畢竟,這也是試錯學習的理念! :) – Saphrosit