Upgrade to Pro — share decks privately, control downloads, hide ads and more …

公平ゲームとNim、Grundy数

Avatar for R.K. R.K.
August 17, 2020

 公平ゲームとNim、Grundy数

Avatar for R.K.

R.K.

August 17, 2020
Tweet

More Decks by R.K.

Other Decks in Programming

Transcript

  1. 情報完備ゲームの最適⼿の探索 • 例としてオセロを考える • 盤⾯のパターンを考えると3!×! ≅ 3×10#$。全探索はすでに怪しい。 • 最適解を求めるのは難しそう…。 •

    minmax法、alpha-beta法などと呼ばれるアルゴリズムがある • 理論上は最適解を得られるが、時間がかかる。 • 途中で探索を打ち切ることにより、近似的な解を得る。 • あるいは、機械学習の出番… • ⼀般に、ゲームの最適⼿の探索は難しい!
  2. 必勝・必敗を決める • ⼀つ戻る。 • 元のノードは必勝。 • ⾏き先が1つでそれが必勝 の場合は必敗。 • ⾏き先に未訪問がある場合

    は「暫定的に必敗(L)」か つ未訪問のままにし、そこ でその頂点の探索は打ち切 る。 (L) W (L) L W L 最終状態 初期状態
  3. Grundy数の利点 • 単純に必勝必敗だけを求めるためには( + )だけの計算量が かかるが、 , はとても⼤きいことが多い。 • 例えば次ページ以降に⽰すNimと⾔うゲームでは、

    = %と指数関数 で表される。 • この場合、 擬多項式時間アルゴリズムであるということになる。 • Grundy数を使うと、ゲームを複数のゲームに分解して考えるこ とで計算量を削減することが出来る!
  4. Nim • このゲームの必勝必敗を求めたい。 • ゲームの状態数は、番⽬の⼭の⽯の数 を! とすれば、∏!"# $ (! +1)通り。

    • 愚直に必勝・必敗を求めると、計算量は ! の制約を1 ≤ ! ≤ とすれば辺の数を 無視しても(%)。指数関数的に増加し てしまう! • 何とか削減したい。 真ん中から 3つ取り除く
  5. NimのGrundy数 • 答え:XOR演算 • 2 xor 4 xor 3 =

    5 • よって右の状態のGrundy数は5 • ゆえに先攻の勝ち • N個のXORを求めるので() !
  6. XOR演算 • 2進数に対する演算。 • 各ビットごとに⾒て、1の数が奇 数個なら1、偶数個なら0とする 演算。 • 結合法則、交換法則が成り⽴つ。 •

    Python、C++では演算⼦は「^」 • 項が2つのとき、指定したbitのみ 反転する演算と捉えることも出 来る。 • 桁ごとのmod 2の⾜し算とも考え られる。 010 = 2 100 = 4 xor 011 = 3 ────── 101 = 5
  7. XORがGrundy数になる証明 • 2. ⾃分より⼩さい任意のGrundy数の状態に 移動できる。 • まず、必ず0の状態に移動できることを⽰す。 • XOR結果の数をSとする。Sの1であるbitの うち最⾼位の位置と同じ位置のbitが1である

    数がXOR演算される数の中に必ず存在する。 • XOR結果のbitが1であるとは、その位置の bitが1である数が奇数個≠0であることを表 すため。 010 = 2 100 = 4 xor 011 = 3 ────── 101 = 5
  8. XORがGrundy数になる証明 • この数を変化させる。 • この数は、2進数で0xy (x,y = 0,1)と表さ れる任意の数に変化させられる。 •

    2進数の数の変化を考えれば⾃明。 • x、yをうまく調整し、Grundy数を0にす ることが出来る。 010 = 2 001 = 1 xor 011 = 3 ────── 000 = 0
  9. XORがGrundy数になる証明 • 今のを数式で表す。 2 xor 4 xor 3 = 5

    Grundy数を0にしたいので両辺にxor 5すると。 2 xor 4 xor 3 xor 5 = 5 xor 5 = 0 前までの議論により、4 xor 5 < 4が分かり、 結合法則が成り⽴つので、 2 xor (4 xor 5) xor 3 = 0 4を(4 xor (Grundy数))に変えれば0に変えられ る。 010 = 2 001 = 1 xor 011 = 3 ────── 000 = 0
  10. XORがGrundy数になる証明 • 次に、その頂点のGrundy数以下の任意の状態に移動できるこ とを⽰す。 • 前ページの数式を⽤いる。 2 xor 4 xor

    3 = 5 移動先のGrundy数をhとして、両辺xor 5 xor hすると、 2 xor 4 xor 3 xor 5 xor h = 5 xor 5 xor h = h よって、それぞれの⼭の⽯の数s=2,4,3のうち、s xor 5 xor h < sを満たすsが存在すれば、sをs xor 5 xor hに変化させることで Grundy数をhに変化させられる。
  11. XORがGrundy数になる証明 • s xor 5 xor h < sとなるようなsを探す。 •

    次の条件を考える。 • sの1であるbitの最⾼位と(5 xor h)の1であるbitの最⾼位が等しい。 • これは、上記の不等式よりも厳しい条件。 • このとき、5はもとのGrundy数であるからh<5であることに注 意する。
  12. XORがGrundy数になる証明 • (5 xor h)の1であるbitの最⾼位が n桁⽬であるとする。このとき、 5のn桁⽬のbitが1であり、hのn 桁⽬のbitが0になる。 • n桁⽬より⼤きい桁では、XOR演算

    がすべて0のため同じ数。 • このとき、5のn桁⽬のbitが0でhの n桁⽬のbitが1になってしまうと、 それより上位の桁の数は等しいた めh>5になってしまう。 101 = 5 xor 011 = h=3 (例) ────── 110
  13. XORがGrundy数になる証明 • 5(=Grundy数)のn桁⽬は1なので、⽯の⼭の中にもn桁⽬のbit が1の⽯の⼭が存在する。 • 0になることの証明と同じ議論。 • (5 xor h)の1であるbitの最⾼位はn桁⽬で、同じ桁が1である

    ⽯の数が存在するため、0に出来ることの証明の議論において 5を(5 xor h)と読み替えれば同様に証明することが出来る。 • よって⽰された。
  14. 解法 • 例:540 = 2&×3'×5 • 指数の部分(2、3、1)を⽯の数としたNimに帰着できる! • 答えは2 xor

    3 xor 1=0よりBobの勝ち。 • 素因数分解の計算量が( ) • 素因数分解をしながらXORを計算することが出来る。 • よって全体でも計算量( )
  15. Grundy数を考える 1 2 3 = 3の場合 0 1 2 3

    0 同様にGrundy数を考えていくと… ⽯の数を + 1で割ったあまりになっている! (1)で求められる!
  16. NimK • ⽯が積まれたN個の⼭がある。 • 1個以上個以下の⼭を選び、1個以上 個以下の⽯を取り除く。 • ⽯を0個にしたほうが勝ち。 • =

    1のとき = 1しかありえないので 今までの議論と同じ。 • ≥ 2のときのGrundy数は? 真ん中から3つ、 右から1つ 取り除く
  17. ≥ 2のGrundy数 • 2進数に展開し、⾜し算をする。 • それぞれの桁でmod ( + 1)を取る。 •

    + 1進数と考えれば1つのGrundy数として 捉えられる! • = 1のときmod 2の⾜し算=XOR • これがGrundy数になることは、 = 1のと きとほぼ同様にして証明できる。 010 = 2 110 = 6 + 011 = 3 ────── 131 ────── 101 (mod 3をとる) = 2の例
  18. 参考⽂献 • 岡⽥章 (2014). 『ゲーム理論・⼊⾨』. 有斐閣 • Grundy数(Nim数, Nimber)の理論 -

    https://www.creativ.xyz/grundy-number-1065/ • 競プロにおけるNim、Grundy数とNimK - http://yang33- kassa.hatenablog.com/entry/2017/12/21/202812