王将の移動範囲の評価・学習を実装
去年のアルゴリズムをほぼそのまま移植。一部の低レベルな処理を工夫したのでちょっとは速くなってるはず。
てか、去年のが遅すぎたんですよね。ほぼ50%の確率で分岐するif文が3つ連続であったんですから。
それはさておき、アルゴリズムをざくっと説明すると、
- あるマスに先手の駒が無い
- かつ、そのマスに後手の駒が利いていない
ならば、そのマスは「先手玉が移動しても安全なマス」だと判断します。
で、
- 先手玉の8近傍にあり、かつ、先手玉が移動しても安全なマスは、先手玉が距離1で移動可能なマスである
- あるマスが先手玉が距離n*1で移動可能なマスならば、そのマスの8近傍のうち先手玉が移動しても安全なマスは先手玉が距離n+1で移動可能なマスである
ってルールに基づいて距離1〜10位*2の安全に移動可能なマスの数を数えます。あ、2番目の方で8近傍を見る時に、既に距離n未満で移動可能って判明しているマスは無視します。
最後に距離nのマスの数×距離nの1マスあたりのポイントを、1 <= n <= 10の範囲で計算して評価値に加えます。
1マスあたりのポイントは例によって自動学習で決める事にしました。
前にも書きましたけど、逃げるのが上手くなったり、逆に早めに逃げ道をふさいだりってのが得意になります。あ、壁になってる囲いの駒をむやみに取らない、って事もありました。
多分、距離nの安全なマスを一個増やしたり減らしたりすると、そこから繋がっている距離n+1以上のマスが一気に増えたり減ったりするからでしょう。
って、こんな解説書いてる場合じゃないって今気付きました。急いでもう一個評価項目を作ります。