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の方でしょうか。
また調べてみます。