2010-10-07 20 views
4

我想解決一個問題,使用遺傳算法。實數的染色體表示?

問題是要找到一組優化函數的整型和實型值。

我需要使用二進制字符串來表示問題(僅僅是因爲我理解交叉/突變等概念,當應用於二進制字符串染色體時更好)。

候選解S是集合{I1,I2,... IN,R1,R2,RM}

當我變量是整數,R參數是浮點數。

我希望能夠將候選解決方案S轉換爲二進制字符串,但我不知道如何編碼浮點數。

有關如何將集合S編碼到染色體中的任何想法?

儘管解決方案應該是語言無關的,我的語言的首選選擇(在這個特殊的任務遞減優先順序排列)是:

的Python,C++,C

BTW,我編碼使用的問題Pyevolve

回答

0

可以使用struct模塊中提供的工具將二進制數據打包到緩衝區中。看到這裏:http://docs.python.org/library/struct.html

這就是說,我個人喜歡Python,但是:如果你想重複和有效地採取一組整數和浮點數,把它當作一個大的比特位,並將位運算應用於它,不要以爲Python是語言的最佳選擇。這在更低級別的語言中更直接(並且更快) - 我願意用C語言。

祝您好運!

1

不,我認爲你的問題的二進制表示是錯誤的。您的基本數據不是二進制的,那麼,爲什麼使用二進制?對實數和整數進行變異和交叉,而不是二進制表示。

最簡單的交叉:第一個父親:ABCDE其中A,B,...是浮點數,第二個父母是MNOPQ。隨機選擇D,第一個春天:ABCDQ,第二個:MNOPE。

+0

問題(正如我所說),是我不知道如何做浮動變量的交叉和變異。你能通過一個例子(甚至是一個鏈接)來展示,如何編碼這樣一個染色體,以及交叉和變異如何應用於這樣一個染色體? – skyeagle 2010-10-07 22:19:14

+0

你可以用你認爲合適的方式定義交叉。我也建議不要製作二進制字符串,因爲這可能會產生更糟糕的結果,因爲切片可能發生在整數或浮點變量「內部」。 – 2010-10-08 11:07:55

0

使用IEEE754表示法表示浮點數和二進制補碼錶示法用於整數。或者,使用整數和浮點數,在您的計算機已經使用這些二進制表示的幕後知識中是安全的。

0

如果我理解正確的問題,這完全是語言不可知的。您應該能夠在標準化的IEEE表示中表示浮點數。這是一個tutorial。一旦你有了那個表示,你就不會發生什麼,你只需要在你的位上應用任何交叉點(單點,雙點)。

1

我會建議重新考慮,如果你真的需要位串表示..從浮點到位的轉換和返回有點多。如果你只能保持浮點值即一個候選解決方案是一個由N個浮點數組成的數組,您可以輕鬆地將其傳遞給您的評估函數(目標函數)。然後使用交叉方法,如模擬二進制交叉(SBX,http://www.slideshare.net/paskorn/self-adaptive-simulated-binary-crossover-presentation),它模仿將浮點數轉換爲二進制表示並在其上執行交叉之後得到的效果。 SBX的結果相當不錯,而且如果你處理比特串會發生什麼事情的類比會變得非常清晰......在這個幻燈片中它看起來很像..但是這一切都歸結爲幾行實施sbx交叉。