GPちょっとよくなった
部分木の入れ替えミスってた。
直したら3次関数を40回くらいでだいたい同定できるように。


最大ノード長で一律に切ってるので、これ以上続けてもたいして変わらない感じ。
あとゲーム(ブラフ)のコンピュータ・人対戦を書いた。これってどうやってGPに落とし込めるんだろう…
行動を要素にしてif的に書くか、あるいは可能な行動に対するスコア関数の最適化かで大きく違いそう。ブラフってのはプレーヤ数n人とすると、最大で6*n*5通りくらいしか可能な行動がないのでやりやすいと思っていたんだが、そうでもないかも…
関数の値は行動とする場合だとこんな感じか:
末端ノード: (目, 数)を取り敢えず(x, y)とする, 目を増やす/減らす、数を増やす/減らす
非末端ノード: p人前の宣言した目がxであり自分がxをm個以上持っている, p人前の宣言した目がxであり、自分がx+x’をm個以上持っている、if A then B else C、A then B、…
なんか無茶だ。というかコレで不可能な手を提案されたらやり直すのも困る。やはり可能な行動に対して価値をつける方向でやるべきかな。それなら強化学習で良いような気もするが…
そうすると関数の値はその手を選ぶ価値。
末端ノード: 目、数、定数、p人前の目、p人前の数、p人前のダイス数、自分のダイス数、自分の目xの数、…
非末端:四則演算と、おまけによく使いそうなステップ関数くらい
でいけるかな?
今Pythonで書き殴ったGPライブラリがあまりに非効率かつ汚いので、綺麗にしてから考えよう。




