遺伝的アルゴリズムの入門として、Machine Learning: Introduction to Genetic Algorithms | Burak Kanber’s Blog がわかりやすかったので、Rubyで試してみた。
件の記事はHello, world!
という文字列を遺伝的アルゴリズムで生成する、という内容。仕組みは、13個の文字(0~255のasciiコード)が遺伝情報。世代を進めるには、それぞれの個体の答えとの差の二乗和をコストとして計算する。コストが小さいトップの2つの個体同士を交配させ(それぞれの遺伝子を真ん中で分割して、つなぎ替える)、新しい子供2匹を誕生させる。そしてドベの2つを殺す。なので世代が進んでも全体の個数は保たれる。そしてすべての個体を50%の確率で突然変異(1文字をasciiコードで1増やす、または減らす)させる。
class Gene |
- 実際の動作を見るには:http://codepad.org/A1imEb3P 運がよいと成功する。
- 20個体で走らせて、だいたい1000世代くらいで答えにたどり着く。
- 「これは遅い、しかしどこが非効率かを見つけ、直するのは簡単だろう」というんだけど、どこが問題なのかわからない…
- 個体数を100とかに増やすと、世代数は減る。が、増やしすぎると負荷がかかる。
- 交配させるときに常に真ん中でつなぎ変えてるのは、2回繰り返すと元に戻ってしまうけどいいのか?試しにつなぎ替えるピボットの位置を乱数で選んでも、世代数はあまり変わらないようだ。
- 突然変異の割合が50%って相当高いように思うけど、割合を下げると世代がかかるようになる。
- 突然変異で変化するのが、+1または-1だと正解にたどり着くまでに時間がかかるんじゃないか、とも思って完全にランダムにすると、より時間がかかるようになる。これは+1または-1の場合、50%の確率で正解に近づくのに対し、ランダムにしてしまうと最終的に1/256になってしまうからかもしれない。