wvogel日記

自分用の技術備忘録が多めです.

GA

最近javascriptとかC#ばかり書いていたので、久々にHaskell遺伝的プログラミングをしてみた。

遺伝的アルゴリズム
こちらのサイトを参考にして、
関数の最大値を見つけてくるようなものを作成しました。

ココにソース置いてます。

何度か実行してみた結果、淘汰アルゴリズムが適当すぎるせいだと思われますが、うまく成功するときとそうでないときがありました。

*突然変異体は、単純に遺伝子を逆転するだけです。
*淘汰は、採用する20組の値のうち5つは優秀な遺伝子、残りの15個は優秀な遺伝子を除いたものから適当に採取しています。
この部分が適当で、重み付けによる取捨選択などを考えると、多分もっと精度があがると思います。

10世代後の結果は次の要になりました。
元にしたwebページで扱っている関数と同様のものを使用しました。

(x,y) = (0.14137567651336339,1.8492695411168283)
(x,y) = (0.14137567651336339,1.8492695411168283)
(x,y) = (0.14137567651336339,1.8492695411168283)
(x,y) = (0.14119352454521614,1.8492927359668734)
(x,y) = (0.14119352454521614,1.8492927359668734)
(x,y) = (0.19073504518036383,1.5554960564844085)
(x,y) = (0.5161938821734259,1.4307998378411195)
(x,y) = (0.14145387788188732,1.849256952542349)
(x,y) = (0.17511003027918842,1.7050731186888792)
(x,y) = (0.5163760341415731,1.4317591516574983)
(x,y) = (0.17511003027918842,1.7050731186888792)
(x,y) = (0.5161938821734259,1.4307998378411195)
(x,y) = (0.6414543547195003,0.7624048185329186)
(x,y) = (0.14141859189852896,1.8492628283604704)
(x,y) = (0.14137567651336339,1.8492695411168283)
(x,y) = (1.1082659800205041e-2,-1.604856294976749e-2)
(x,y) = (0.6281925470281096,0.9210200851183818)
(x,y) = (1.1082659800205041e-2,-1.604856294976749e-2)
(x,y) = (0.6413761533509763,0.7633492029481772)
(x,y) = (0.13217652528431442,1.8396347036950536)

ということで、名前だけ聞いていて触ったことのなかったGAでしたー。
アニーリング法と同じように、局所解に落ち込むのを回避できる点で、使い道が広そうです。


プログラム自身が進化していく、と聞いた覚えがあるのはPの方でしょうか。
また調べてみます。