ミニチェスアプリは盤面編集可能

     前回記事の内容をミニチェスアプリでもテストしてみました。チェス入門のステイルメイトの問題集を6x6のミニチェス用にアレンジして解かせてみると、元々の問題の趣旨とは違った発見があります。
     ミニチェスアプリチェスアプリと違って盤面編集機能があるので、暇な方は試してみて下さい。もしソースコードを見るつもりの方はアンパッサンとかキャスリングの実装でかなり汚くなっているチェスアプリのコードよりもミニチェスアプリの方をお勧めします。

    問題3

     元々の問題は以下の局面です。

    元の問題、初期盤面

    ステイルメイト問題3

     正解は白Qc8+で、以下黒Qxc8と進み、白がステイルメイトに持ち込むという問題です。
    これを以下のように6x6に編集してみました。

    6x6初期盤面

    ステイルメイト問題3ー1

    ここからAI同士で対戦させると以下のように進みます。

    詰みあり

    ステイルメイト問題3

     6x6に編集した結果、詰みがある局面になってしまったので黒を詰ましてしまいましたが、当然こうなるべきでしょう。
    今度は黒のキングを一路ずらして配置してみます。

    初期盤面を変更

    ステイルメイト問題3ー2

    ここからAI同士で対戦させると以下のように進みます。

    ステイルメイト

    ステイルメイト問題3

     白が劣勢ですが一旦Qc4+と黒のキングにチェックを掛けて、その後はステイルメイトが最善と判断してQc6+Qxc6とステイルメイトに持ち込みました、最善の応酬だと思います。下手に勝とうと思って白がQd5(詰めろ)なんていう手を選ぶと、黒にQd1+とチェックされてクィーンを交換後に戦力不足で白が負けてしまいます。

    問題7

     元々の問題は以下の局面です。

    元の問題、初期盤面

    ステイルメイト問題7

     正解は白Qc4+Qxc4で白がステイルメイトに持ち込むという問題です。
    これを以下のように6x6に編集してみました。

    6x6初期盤面

    ステイルメイト問題7ー1

    ここからAI同士で対戦させると以下のように進みます。

    白、負けは避けられない

    ステイルメイト問題7

     元々の問題のようにステイルメイトを狙って白がQa4+なんてやると、黒がQxa4とクィーンで取ってくれれば良いのですが、以下のようにRxa4とルークで白のクィーンを取られて

    黒はステイルメイトを避ける

    ステイルメイト問題7ー2

     白はc3しか指す手がなくなり黒Qb3#とチェックメイトになります。結局この問題は白の負けが避けられないので、上記の変化は最善の応酬だったことが分かります。もちろん黒がルークで白のクィーンを取る(Rxa4)ことも確認済みです。

      === intro07-2
        --- problem -7-2
    
    6|♜| | | | | |
    5| |♛| | | |♟|
    4|♕| | | | |♚|
    3| | | | |♟| |
    2| | |♙|♟|♙| |
    1| | | |♔| | |
      a b c d e f
    
          ✔ expects checkmate -7-2 (206ms)
    ♕
    6| | | | | | |
    5| |♛| | | |♟|
    4|♜| | | | |♚|
    3| | | | |♟| |
    2| | |♙|♟|♙| |
    1| | | |♔| | |
      a b c d e f
    

     チェスアプリミニチェスアプリも多くのソースコードは同じなので問題がなくて当然なのですが、ミニチェスアプリに関してはmochachaiのテストを省略していたので、あらためてテストスクリプトを書いて確認してみました。

    ステイルメイトの評価値について

     前回の記事で先手勝ちの評価値を50000、後手勝ちの評価値を-50000、ステイルメイトの局面に掛ける係数を-0.0009にして様子を見ると書きましたが、-0.0009という値があまりにも小さすぎて奇異に感じるので先手勝ちを500、後手勝ちを-500、係数を-0.09にして試してみたのですが、今度は駒の重みに使ってる値とバランスが取れず?に不都合が出てきたので止めました。もし値を変えるとしたら駒の重みの数値も全面的に見直さないといけないんだろうなぁと思っていたところ、タイミング良く?X(Twitter)やねうら王開発者のポストを見かけました。
     やねうら王では400,-400を最大・最小値として使用しているそうで、以前やねうら王をインストールした時(「Ubuntuでやねうら王」)のソースをgrepすると確かにそのようです(eval_limit定数)。やねうら王のソースを読んでみてもいいのですが、理解するのは大変でしょうし何かアイデアが浮かばない限り当面はこのままにしておくつもりです。

    不都合とは何か…自分のアプリの場合、単純に評価値の最大・最小値を小さな値にすると「相手キングを積極的に詰ましにいかなくなる」、「千日手になりやすくなる」という現象を確認してます。