思うだけで学ばない日記 2.0

思うだけで学ばない日記から移転しました☆!よろしくお願いします。

df-pn探索おさらい

df-pnが難しいという声がちらほら見聞されるが、ポイントを正しく押さえればこれはさほど難しくはない。

準備

まず「詰み」(=必至)を自明なものとそうでないものに分けよう。

自明な詰み
そのノードの局面を見るだけで判断がつき、子ノードを見る必要がない形の詰み。

これは通常のゲームのルールの下では勝負がつくことと同義だ。例えば、将棋なら片方(敗者)の玉が取られた(事後の)局面、五目並べなら片方(勝者)の石が5個(以上)並んだ(同じく事後の)局面等。
敗北した側にもはや合法手は残されていないから、そうした局面のノードはそもそも子ノードを持たない(葉ノードである)。子ノードを持つ自明な詰みとしては、局面のハッシュ辞書等にすでに詰み登録がなされているケース等がある。

df-pn探索のねらい

df-pn探索の第一目的は実は次の仮説の検証である(後述するように、必ずしも勝負に勝つことではない)。

  • pの手番であるノードnにおいてpによる-pの詰みが成立している

この仮説の「証明」は、ノードnを根とする部分ゲーム木の全ての葉ノードについて、pによる-pの自明な詰みが成立することを示すことで可能だ。
一方「反証」は、反例を1つ挙げることでなされる。すなわち、ノードnを根とする部分ゲーム木の中に、-pによるpの自明な詰み(攻守が反転していることに注意)が存在することをただ1例挙げればいい。
さて、「証明」のための葉ノードの列挙だが、それはnが自明な詰みである場合を除き、ノード数の爆発により現実的には不可能だと思われるかもしれない。しかしノードnで真に詰みが成立するなら、中間ノード総数はともかく、葉ノードの個数は

  • たかが知れている

はずなのだ。このことは、将棋で言うなら、詰まされる側の玉が盤上を際限無くは逃げられない(高々数百手で取られる)上に、攻方がそれを取れるマスがさらに限られることから想像がつく。一方、葉ノードを見もせずにそれを自明な詰みか否か言うことは(そうせずに済む数学的定理を見つけたのでもない限り)不可能だから、一般に、詰みを証明するにはやはり全ての葉ノードを列挙して、自明な詰みであることを確かめねばならない。問題はその全数列挙をいかに効率よくやるかだ。
(枝のカットにより到達しない葉ノードが発生しても完全探索になる一般のαβ探索とは趣が異なる。)

証明数と反証数

定義は下記のとおり。

証明数
そのノードが攻方による詰みであることを証明するために、攻方による自明な詰みであることを示す必要がある葉ノード子ノード以下のノード(子孫)の最小個数
反証数
そのノードが攻方による詰みでないことを証明するために、受方による自明な詰みであることを示す必要がある葉ノード子ノード以下のノードの最小個数

で、攻方pによる受方-pの自明な詰みが生じたノード(必然的に-pの手番)では証明数=0、反証数=∞とする。これは詰みの証明にもはや子ノード以下を見る必要がないことと、反証が不可能なことを表す。
一方、受方-pによる攻方pの自明な詰みが生じたノード(必然的にpの手版)では証明数=∞、反証数=0とする。これは証明が不可能(反証された)ことと、反証にもはや子ノード以下を見る必要がないことを表す。
また、予定した探索深度に達してなお葉ノードに達しなかった場合は、少なくともさらに先のノードを1個以上見なければ証明も反証もできないから、証明数=反証数=1とする(以下不明ノードという)。

df-pn探索の原理

さて手番をよく意識しよう。次のことは明らかだ。

  • pの手番のノードの反証数は、さらに1つ先のpの手番のノード(=孫ノード)の反証数の合計である。
  • -pの手版のノードの証明数は、さらに1つ先の-pの手版のノード(=孫ノード)の証明数の合計である。

一方、葉ノードまでの最短の手筋を効率よく求めるには、攻方は詰みを証明するノード数が最小となる手を選び、受方は攻方に協力して、詰みを反証するノード数が最小となる手を選ぶのがいい。
詰みを証明するノード数が最小となる手はただちには知りようがないが、証明数最小のノードを選ぶことで推定できると仮定する。同様に、
詰みを反証するノード数が最小となる手はただちには知りようがないが、反証数最小のノードを選ぶことで推定できると仮定する。
総合すると、例の再帰計算規則が導かれる。

  • 攻方pの手版のノードにおいて: 証明数=min{子ノードの証明数}, 反証数=Σ{子ノードの反証数}
  • 受方-pの手版のノードにおいて: 証明数=Σ{子ノードの証明数}, 反証数=min{子ノードの反証数}

さて天下りに与えた証明数、反証数だが、証明数と反証数それぞれの上限でカットしても、全ての葉ノードと不明ノードが1回以上参照されるという顕著な性質がある(上記再帰計算規則より示せる)。これで、詰み証明または反証に十分な葉ノードの全数列挙を、枝をカットしつつ効率的に実現できる。
この程度の話ならちょっと考えればまともに論文を読まずとも(マテ

df-pn探索によって求めた手筋は強いか?

ノードnが真に攻方による詰みであることが証明された場合、df-pnが示す通りに指して負けるはずはない。よってその場合の強さに問題はない。
一方、証明が成らなかった場合ははっきり言って弱いはず。上記の通り、df-pnで得られる手筋は受方の協力の下に得られるようなものだからだ(探索の目的が違う)。
例えば、ただの一手で受方の必勝ノードに転がり込むような危険なノードを通る手筋が生成されかねない。
トップレベルの思考ルーチンの実態はよく知らんが、df-pnで詰みが証明されなかった場合は明らかに別手段で「勝負強い」最善手を捜さねばならない。

子ノードの反証数=親ノードの証明数とみなす考え方は微妙に間違い

T/O
多分探索効率の低下という形で影響が出るはず。