ちょっとだけ進展
というか、問題点が見えてきました。
まず、以下の条件で学習させました。
- 先手は1手読み。方策はε-greedyでε*1は0.01。
- 後手は5二飛と8二飛を繰り返し、王手されたら投了。
- 先手と後手の評価関数は別のインスタンスとする*2。
- 報酬は勝ったら1、負けたら-1、一手指して決着がつかなかったら-0.01。
んで、700局ほど学習後の典型的な終了局面は以下の通り。(^付きは先手の駒、v付きは後手の駒。)
21:04:54 @ null::main() > +---+---+---+---+---+---+---+---+---+ 21:04:54 @ null::main() > |v香|v桂|v銀|v金|v王|v金|v銀|v桂|v香| 21:04:54 @ null::main() > +---+---+---+---+---+---+---+---+---+ 21:04:54 @ null::main() > |___|___|___|___|v飛|___|___|v角|___| 21:04:54 @ null::main() > +---+---+---+---+---+---+---+---+---+ 21:04:54 @ null::main() > |v歩|v歩|v歩|v歩|v歩|v歩|^馬|v歩|v歩| 21:04:54 @ null::main() > +---+---+---+---+---+---+---+---+---+ 21:04:54 @ null::main() > |___|___|___|___|___|___|___|___|___| 21:04:54 @ null::main() > +---+---+---+---+---+---+---+---+---+ 21:04:54 @ null::main() > |___|___|___|___|___|___|___|___|___| 21:04:54 @ null::main() > +---+---+---+---+---+---+---+---+---+ 21:04:54 @ null::main() > |___|^歩|^歩|___|___|___|___|^歩|___| 21:04:54 @ null::main() > +---+---+---+---+---+---+---+---+---+ 21:04:54 @ null::main() > |^歩|___|___|^歩|^歩|^歩|^歩|___|^歩| 21:04:54 @ null::main() > +---+---+---+---+---+---+---+---+---+ 21:04:54 @ null::main() > |___|___|___|___|___|___|___|^飛|___| 21:04:54 @ null::main() > +---+---+---+---+---+---+---+---+---+ 21:04:54 @ null::main() > |^香|^桂|^銀|^金|^王|^金|^銀|^桂|^香| 21:04:54 @ null::main() > +---+---+---+---+---+---+---+---+---+ 21:04:54 @ null::main() > 歩,桂,香,銀,金,角,飛 21:04:54 @ null::main() > 1, 0, 0, 0, 0, 0, 0, 21:04:54 @ null::main() > 0, 0, 0, 0, 0, 0, 0, 21:04:54 @ null::main() > 手番 : 後手 21:04:54 @ null::main() > 手数 : 7
こういう終了図が何百局も続きます。
結局、勝つ為に必要なのは3三に馬がいる事なのか2六に歩がいる事なのか、それとも他の特徴なのかが理解出来ていない、というのが問題点。
んで、そうなる原因は、探査(色々な行動を試して、良い結果になるか悪い結果になるかを調べる)のが上手く行ってないのだと予測。
という訳でεをもうちょっと大きくしてリトライしてみます。