2013-04-14 44 views
1

我想在C中編寫遺傳算法來優化10個變量(x1到x10)的函數。但是我無法弄清楚我應該使用哪種編碼。我主要看到二進制編碼在例子中使用,但在我的情況下,變量可以採取真正的價值。另外,值是編碼這些類型的問題的一個很好的選擇?哪個編碼用於遺傳算法?

回答

3

當兩個非常接近最佳值的答案在合併時會使其他元素非常接近最優值時,最好使用遺傳算法。純二進制編碼的問題是,如果你不檢查你的交叉你最終得到兩個答案,這可能與原始答案沒有太大關係。

也就是說,這只是一個真正的問題,如果您的變量數量非常小,並且變量中的數據量很大。至於挑選編碼,它更像是一門藝術而不是科學,它取決於你的問題。我會建議使用符合您想要的精度的編碼。如果使用10個變量,您不會錯誤地編碼它,但8位ASCII編碼器可能會正常工作。

希望有所幫助。

4

對於真正有價值的問題,我會建議嘗試CMA-ES或其他ES變種。當然,CMA-ES是目前針對實值問題的最新技術。它旨在快速找到多維問題的良好解決方案。有在Hansen's page可用的實現。在HeuristicLab的工作中還有一個C#實現。進化策略是專爲實值優化問題設計的算法。它們與遺傳算法非常相似(都是在同一時間發明的,但在不同的地方)。主要的區別在於ES的主要驅動因素是突變,並且它突出了突變強度的適應性。沒有這種適應性,(局部)最優化不能及時定位。 CMA-ES易於配置,它需要的只是初始標準偏差和可選的羣體大小(否則有一個公式可以根據問題的大小來估計)。遺傳算法當然也可以應用,但是你必須使用一些特定的算子,它們只能在非常小的程度上變異變量。例如Mühlenbein提供的繁殖者遺傳算法。然而,通常遺傳算法更適合需要正確組合的問題。例如。哪些項目要包括在揹包問題中,哪些功能和終端要與公式結合(遺傳編程)。問題少了,你需要爲某些東西找到正確的價值。雖然遺傳算法有多種變體可以解決這些問題,但請注意Real編碼遺傳算法(RCGA或RGA)。

適用於實值問題的另一種算法是粒子羣優化算法,但在我看來,它很難配置。我會從SPSO-2011開始2011標準PSO。

如果您的問題包含整數變量,則選擇變得更加困難。當變量是離散的時候,演化策略表現得並不好,因爲整數變量的自適應方案是不同的。遺傳算法再次成爲一個有趣的第一選擇算法。

+0

感謝您的詳細解答! – vjain27