やねうら王プロジェクトでは、やねうら王の支援者向けにやねうら王News Letterというのを発行している。(FANBOX/GitHub Sponsors)
このNews Letterのなかで、(今年の5月から毎月)新ペタショック定跡という巨大定跡を頒布している。
新ペタショック定跡500万局面の頒布
本日(2025年10月31日)のやねうら王News Letterでは、新ペタショック定跡500万局面を頒布した。
1局面につき、2億ノード(局面)程度探索させ、定跡を掘っている。
新ペタショック定跡の次に掘る局面を求めるアルゴリズム
このような自動定跡生成において、次に探索する局面をどうやって決定するのかという問題がある。
新ペタショック定跡では、以下のアルゴリズムを用いている。
いま、先手番用の定跡を生成することを考える。
(平手の)開始局面は先手番である。ここからスタートする。
- いま先手番の定跡を考えているので、自分は先手番であり、自分の手番では定跡上のこの局面のbestmove(一番評価値の良い指し手)を選択して1手進める。
- そうすると後手番になる。後手番は自分の手番ではないので、相手はbestmoveを指すとは限らない。そこで、定跡上でbestmoveの評価値から、EvalDiff(5~30ぐらいの定数)さがるような指し手も指すと考える。これらの指し手(複数)で1手進める。
- 1.に戻る。
このように指し手で局面を進めていくと、どこかで定跡を抜ける。この抜ける最後の局面の集合を先端局面(frontier nodes)と呼ぶ。
この定跡を抜けたところが定跡生成のための新たな思考対象局面である。
後手番の定跡を生成するときも同様である。上の説明の「先手」と「後手」を入れ替えたものとなる。
peta nextコマンド
この一連の処理を(ペタショック定跡で次に掘る局面を求めることから)「peta next」と私は呼んでいる。
やねうら王V8.00系にはこれに近いコマンドがあったのだが、出来がいまひとつ気に入らなかったので、やねうら王V9.00系では削除した。
peta nextを行うPython製のスクリプトを準備中である。
frontier nodes
新ペタショック定跡500万局面時点では、EvalDiff=30において、定跡の先端局面は、25万局面程度のようである。
つまりは、500万局面搭載していても、(自分が実戦のときに定跡のbestmoveを選択しつづけるなら)定跡を抜ける時の局面の数は25万局面程度しかないということでもある。
定跡を生成する思考エンジンのアップデートについて
ところで、このような方法で定跡を掘っていくときに、探索する思考エンジンのアップデートを行いたいことがある。
アップデートを行うと、より良い指し手になることが多いが、評価値の性質が変わって困ることがある。
例えば、スケールの問題である。以前の思考エンジンでは、角換わりのある局面は先手+100と返してくれていたのに、思考エンジンをアップデートした結果、+50になってしまったとする。このような局面が多いと、すでに掘ってある定跡全体との整合性がとれなくなってしまう。
それで、私はこういう場合、peta nextで一度EvalDiffを大きめ(30~50)に設定して、先端局面を掘っていくことにしている。
上に書いたように、自分がベストを尽くし、相手がEvalDiffの範囲内の指し手しか選択しないなら、定跡を抜けるときに到達する局面は、この先端局面しかないので、これらの局面を延長しておけば、定跡ツリーの末端の局面の評価値が初期局面の方向に向かって上がってくるので、おおよそ定跡全体を更新したことになるわけである。(詳しい原理は割愛)
ともかく、思考エンジンをアップデートした際には、整合性があまりよろしくない定跡になっているので、しばらく定跡のリリースができないということがある。
定跡を掘るのに使っているやねうら王のエンジンを先々月にやねうら王V8.60からやねうら王V9.00系に移行したのだが、置き換えてしばらくの間の定跡はあまり質がよろしくない。今回頒布する500万局面は、置き換える前のものなので、この問題はなさそうだが、来月以降に頒布する新ペタショック定跡では、この問題が出るかもしれない…。(現在調査中)
追記 2025/11/01 2:00
少し書き忘れていたことがあるので追記する。
初期のpeta nextコマンド(やねうら王V8.00系に搭載)では、先手、後手ともにbestmoveの評価値からEvalDiff下がる指し手で局面を進めていた。
この場合、該当する指し手が各局面に2手ずつあるとして、100手先だと局面数は2の100乗にもなる。
ところが、上で書いたように自分の手番のときはbestmoveを選択すると仮定できるなら、100手先でも2の50乗で済む。これは、「2の100乗」の平方根である。
このように「自分手番ではbestmoveのみを選択する」というのが自動定跡生成において重要なテクニックなのだが、私は、将棋自体の真理が知りたいと思っていたので、WCSC35(今年の5月に開催された第35回世界コンピュータ将棋選手権)時点では、このテクニックを使っていなかった。
しかしこれだと容易に組み合わせ爆発をしてしまい、深くまで調べた定跡にならないので、WCSC35以降に上記のようなアルゴリズムに変更した。
さらにそのあと、これでも尚、組み合わせ爆発は起こるので、次のように考え、peta nextコマンドに改良を施した。
定跡の相手番の局面でbestmoveの評価値からEvalDiff下がる指し手で1手進めるのだが、それだと、相手だけが(定跡上の評価値の)悪い指し手を選択するので、少しずつ評価値を落としていくことになる。しかし、開始局面の評価値からあまりに評価を落とした局面は自分手番から見ると非常にありがたい局面であり、そんな局面の定跡を調べても仕方がない。
つまり、その局面のbestmoveの評価値を e として、以前のアルゴリズムでは、相手番の局面では、評価値が [e – EvalDiff , e] 範囲の指し手を展開していたが、改良案として、開始局面の評価値を s として、相手番の局面では、評価値が [s – EvalDiff, e] の範囲の指し手までしか展開しないことにした。
こうすることにより、開始局面から大幅に評価値を下げている局面では指し手をあまり展開しなくなり、かなり組み合わせ爆発を抑えられるのである。
この改良をしたのが今年の6月ごろである。
この改良により、定跡対象局面が大幅に厳選されることになり、かなり効率的に定跡を生成できるようになった。