将棋ソフトは不成を生成するとどれくらい弱くなりますか?

歩の不成や香の敵陣2段目での不成、そして大駒の不成は打ち歩詰めが絡まない限り読む必要がない。なので、本来は読みの末端で打ち歩詰めが出現してから、その手前の局面でだけ不成の指し手を生成すればすれば良い。

しかし、そのように読みの最中で不成の情報を手前の局面に伝播させていくのはわりと面倒事が多く、実際にこれをやっているソフトはないと思われる。

そこで何も考えずにすべての局面で不成の指し手も生成してはどうだろうか。Bonanzaの時代(10年近く前)から、そのように不成の指し手を生成すると、生成しない場合に比べて弱いことが知られていた。不成を読むことで勝ちを拾えるメリットより、各局面での分岐が増えるデメリットのほうが上回るためだ。

これは現代の将棋ソフトでも同じであろうか?

いまどきのCPUで比較テストをしたかったのだが、「最新の評価関数持ってないからできない」とこのブログで書いたところ、透。さんが3000局ぶん回して結果を送ってくださったので以下に掲載しておきます。

対局環境

・Xeon E5-4667 v3 16c32t
・全コア2.90 GHzで動作させてます
・DDR4-17000 PC4-2133 ECC Registered
・8GB×8 64GB
・備考 CHINEBENCH 2200cb 1秒1000万ノード弱
・Threads = 16 , Hash = 8192
・やねうら王 + orqhaより若干良さそうな評価関数

1秒 451-24-525
2秒 419-62-519
4秒 422-93-485

結論) 最新ソフト+最新評価関数でも不成を生成するとR30程度弱くなるようです。

あと対局時間が長くなってくると引き分けが顕著に増えてくるのも興味深い特徴ですね。(256手引き分けに設定しているため、対局が長手数化して256手に到達しているのかも…)
いずれにせよ、貴重な資料を提供していただき、ありがとうございました! > 透。さん

将棋ソフトは不成を生成するとどれくらい弱くなりますか?」への12件のフィードバック

  1. 「手前の局面に伝播させていく」のではなく、シンプルに「打ち歩詰めが出現した場合だけ、不成を含めた読みをゼロからやり直す」のではダメなのでしょうか?
    少なくとも、すべての局面で不成を考慮するよりは効率的だと思うのですが。

      • しかしその状況は不成を考慮しない既存の一般的なAIと同じですよね?それでも既存AIは、不成を含んだ真の最善手に比べれば悪手かもしれないけど、なんらかの手Xを指せる。
        であれば、Xを指すか、残り時間(0.1秒しかないならあきらめるけど、8.5秒残っていることもあるかもしれない)を使って、不成を含めてゼロから探索するか、選べるほうがよいような。

        • > しかしその状況は不成を考慮しない既存の一般的なAIと同じですよね?

          末尾の局面で不成の詰みを発見したかを調べるコストがあるのでその分だけ損なような…。

          > 不成を含めてゼロから探索するか、選べるほうがよいような。

          そうですね。その実装で良ければお手軽ですね。(レート向上する気がしないので私は実装しないですが…)

  2. 上記の”匿名さん”の投稿について

    横から失礼します 現在 TOPクラスのエンジンは
    最新のCPUでは実戦の三十数手の詰みを1秒以内で
    読み切ります(安いノートパソコンでも3秒位?)
    少し位コスト(ロスタイム)を消費しても打ち歩詰
    回避のための不成を読んで不詰を回避できれば充分
    に価値があると思いますし他のGUIに無い特長として
    アピール出来て販売数が伸びる可能性が増えると
    思いますので「打ち歩詰めが出現した場合だけ不成を
    含めた読みをゼロからやり直す」を検討願います
    レートが向上しなくてもほとんど下がらなければ充分
    だと思います

    • 末尾の局面で不詰があるかどうかはGUI側で処理できる問題ではないのですが(エンジン側の問題なのですが)、エンジン側、強さに寄与しない改造ってあまりしたくないので(ソースコードがいたずらに複雑になるので)、まあ…気が向いたらということで。

  3. 飛角歩や香(2段目)の不成については、打歩詰がからまなくても成立可能かと思います。
    連続王手の千日手で負けてしまうのを回避するのが目的です。
    以下は飛の例(▲1一飛不成)です。

    後手の持駒:なし
    9 8 7 6 5 4 3 2 1
    +—————————+
    | 玉v銀vと ・ ・ 飛 ・ ・ ・|一
    |v桂vとvと ・ ・ ・ ・v玉 ・|二
    |vとvとvと ・ ・ 香v桂v桂 香|三
    | ・ ・ ・ ・ ・ ・ ・ ・ ・|四
    | ・ ・ ・ ・v歩v歩v歩v歩v歩|五
    | ・ ・ ・ ・vとvとvとvとvと|六
    | ・ ・ ・ ・vとvとv香v香v桂|七
    | ・ ・ ・ ・v銀v銀v銀v金v金|八
    | ・ ・ ・ ・v金v金v角v角v飛|九
    +—————————+
    先手の持駒:なし

    • 連続王手の千日手回避の意味でしたら、歩の不成も、次に歩を成ると連続王手の千日手が成立してしまうけども、歩を不成にしてサイクルを回避してから詰ませる(GHI問題)みたいな局面も作れるような?(作れない?)

  4. この問題は打ち歩詰めの局面がコーナーケースすぎてほとんど発生しないことにあると思われます。
    終盤だと「今どきのCPUで1分思考しても詰むか詰まないかわからない局面」の方が圧倒的に多い。
    なので打ち歩詰めを考慮するよりも少しでも先を読んだ方が良くなってしまう。
    極論を言えば打ち歩詰めや連続王手の千日手の判定ロジックを削除した方が強いのではないか。
    それだとたまにイリーガルムーブになるから不誠実なプログラムだと叩かれますか?

    • 連続王手の判定自体はそれほど大きなコストではなく、また、連続王手の判定のときに通常の千日手や劣等・優等局面の判定もついでに行えるので、この一連の処理は削るよりはあったほうが強いはずです。(`・ω・´)b

やねうらお へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です