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

公平ゲームとNim、Grundy数

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
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