GAの練習
今日は自分の誕生日。まあそれはそれとして。
GAのプログラミング。
練習がてら、三次曲線の問題を考える。
あれこれ本から持ってきたり書き換えたりして係数を求めてみた。
f(x)=a*x^3-b*x^2+c*x
のときのa,b,cを求める。
求める係数は3つなので実数型遺伝子だと遺伝子の因子が3つとなる。
3つだと交叉や突然変異による多様性が弱く、解が収束しにくかった。
各係数を分解して因子を増やす手も考えたが、組み合わせが複数できて多峰性が強くなるかも。
大人しくビット型にして2進数化した。
グレイ型は面倒なので使わず^ー^;;
9ビット(512)で離散幅を0.1にしたので、0~51.2まで乱数で表現できる。
つまり、3*9で遺伝子長は27になるわけだ。
実行してみたものの最初は思うとおりにならず困った。
結局のところ、評価関数というか、どれだけ適合しているかの指標を求める式が一番重要だと体験から理解できた。
評価関数を見直し、平方誤差の累計を逆数した形にすることにした。
ルーレットでは、適合度の大きさに比例して親の個体を選定するので、この形にすれば誤差が小さいものをより重み付けができる。
早期収束する危険もあるが、このさじ加減は解こうとする問題によってやり方を調整する必要があるかな。
最終的には下図の通り。
ピッタリとは行かないが、それなりに良い数字が出た。
世代交代数を増やせば、多少の改善はできるかもしれないが計算コストと精度を天秤にかけるとどうなんだろう。
厳密解が必要という問題には、GAは相応しくないかもしれない。
実行する度に答えが変わるし。
個人的には、この曖昧さが気に入った。
プログラミング的にも楽だしね。
エンジニアリング的によりベターな解を求めたいという時に使える。
理論解が存在し、頑張れば解けるようなのには向いてない。(今回みたいなの)
そこは頑張って解こうよってことだ。
ということで、応用としてもう少し複雑な問題に挑戦してみることにする。