Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
公平ゲームとNim、Grundy数
Search
R.K.
August 17, 2020
Programming
0
220
公平ゲームとNim、Grundy数
R.K.
August 17, 2020
Tweet
Share
More Decks by R.K.
See All by R.K.
Scratchからアルゴリズムへ 〜二分探索〜
asmape0104
0
910
Other Decks in Programming
See All in Programming
Go製CLIツールをnpmで配布するには
syumai
1
920
商品比較サービス「マイベスト」における パーソナライズレコメンドの第一歩
ucchiii43
0
230
Vibe coding コードレビュー
kinopeee
0
350
変化を楽しむエンジニアリング ~ いままでとこれから ~
murajun1978
0
590
코딩 에이전트 체크리스트: Claude Code ver.
nacyot
0
1k
CIを整備してメンテナンスを生成AIに任せる
hazumirr
0
370
AI Ramen Fight
yusukebe
0
120
オンコール⼊⾨〜ページャーが鳴る前に、あなたが備えられること〜 / Before The Pager Rings
yktakaha4
2
1.2k
バイブコーディング超えてバイブデプロイ〜CloudflareMCPで実現する、未来のアプリケーションデリバリー〜
azukiazusa1
2
740
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
0
600
PHPカンファレンス関西2025 基調講演
sugimotokei
6
1k
Strands Agents で実現する名刺解析アーキテクチャ
omiya0555
1
110
Featured
See All Featured
Designing for Performance
lara
610
69k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
110
19k
Typedesign – Prime Four
hannesfritz
42
2.7k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Testing 201, or: Great Expectations
jmmastey
43
7.6k
Balancing Empowerment & Direction
lara
1
510
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1k
Six Lessons from altMBA
skipperchong
28
3.9k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
RailsConf 2023
tenderlove
30
1.2k
For a Future-Friendly Web
brad_frost
179
9.8k
Transcript
公平ゲームと Nim、Grundy数 あすまるびぃ (@asmape_RK)
このスライドについて • このスライドは、東京⼤学⼯学部電⼦情報⼯学科・電気電⼦⼯ 学科の授業である、アルゴリズム(https://iis- lab.org/algorithms2020)の期末レポート課題として制作され たものを⼀般に公開したものになります。 本スライドの内容に関して、お気づきの点やさらに良くするた めのコメントがございましたら、ぜひ本スライドの制作者にご 共有ください。
ゲーム理論 • ゲームとは • 複数主体(プレイヤー)が、⼀定の規則に則りそれぞれの⽬標を達成し ようと⾏動を選択する。 • プレイヤーの⽬標の達成は、他⼈の選択にも依存する。 • このような対象を扱う学問がゲーム理論。
• いわゆる遊びを指すゲームだけとは限らない。
協⼒ゲームと⾮協⼒ゲーム • 協⼒ゲーム • プレイヤー間に協⼒の可能性が存在し、提携を結ぶ事ができるゲーム。 • ⾮協⼒ゲーム • プレイヤー間の利害が常に対⽴するゲーム。 •
今回はこちらを扱う。
情報完備ゲーム • ゲームのルールがすべてのプレイヤーの共通知識であるゲーム。 • いわゆる遊びのゲームもここに分類される。 • このようなゲームで最適な⼿を調べる⽅法は?
ゲームを表す有向グラフ • ゲームに存在する状態を頂 点、可能な操作を辺とした グラフでゲームを表現でき る。 • グラフを対象とするような アルゴリズムを使える!
情報完備ゲームの最適⼿の探索 • 例としてオセロを考える • 盤⾯のパターンを考えると3!×! ≅ 3×10#$。全探索はすでに怪しい。 • 最適解を求めるのは難しそう…。 •
minmax法、alpha-beta法などと呼ばれるアルゴリズムがある • 理論上は最適解を得られるが、時間がかかる。 • 途中で探索を打ち切ることにより、近似的な解を得る。 • あるいは、機械学習の出番… • ⼀般に、ゲームの最適⼿の探索は難しい!
情報完備ゲームの最適⼿の探索 • ゲームの種類にもう少し制限を加えて、⽐較的簡単に最適⼿を 考えられる問題を考える。
公平ゲーム • 次の条件を満たす情報完備ゲーム 1. 2⼈で交互に操作を繰り返す。 2. それ以上操作できない「最終状態」が存在し、操作をして最終状態 になったら勝ち(相⼿に最終状態を渡されたら負け)。 3. 有限回の操作で「最終状態」に必ず達する。
4. 等しい状態であれば、2⼈のプレイヤーが出来る操作の集合も等し い 。 5. 常にお互い全ての情報を持っていて、偶然性に決して左右されない。
例:30⾔っちゃいけないゲーム • 2⼈で、数字を交互に1からカウントアップしていく。 • ただし、1回でカウントできる数の個数に上限がある。 • 30と⾔ったほうが負け。 (例:上限が3個) A「1、2」 B「3、4、5」
A「6」… A「25、26」 B「27、28、29」 A「30」 →Aの負け
公平ゲームの勝敗 • 公平ゲームには必勝法が存在し、両者が必ず最適な⾏動をする 場合、先攻、後攻のどちらが勝つかはゲームをする前から分か る。 • 勝つのはどちらか?
公平ゲームを表す有向グラフ • 公平ゲームの場合、グラフ に以下のような特徴がある。 • 初期状態と最終状態が1つで ある。 • ループがない。 最終状態
初期状態
頂点ごとの勝敗 • 頂点ごとに必勝、必敗が決まる。 • 次に相⼿に必敗の状態を渡せるとそのノードは必勝。 • 次に相⼿に必敗の状態を渡せないとき(必勝の状態しか渡せない とき)そのノードは必敗。 • 公平ゲームの定義より「最終状態」は必敗。
• 最終状態から逆⽅向にBFSをすることでノードの必勝・必敗を 決められる!
必勝・必敗を決める • 必勝をW、必敗をLとする。 • 定義より「最終状態」は必 敗。 L 最終状態 初期状態
必勝・必敗を決める • ⼀つ戻る。 • 元のノードは必敗なので、 次のノードは必勝 • 後に述べる「暫定的に必敗 (L)」である場合も必勝に 上書きする。
W L W 最終状態 初期状態
必勝・必敗を決める • ⼀つ戻る。 • 元のノードは必勝。 • ⾏き先が1つでそれが必勝 の場合は必敗。 • ⾏き先に未訪問がある場合
は「暫定的に必敗(L)」か つ未訪問のままにし、そこ でその頂点の探索は打ち切 る。 (L) W (L) L W L 最終状態 初期状態
必勝・必敗を決める • 戻れるところは戻っていく。 (L) W W (L) L W L
最終状態 初期状態
必勝・必敗を決める • 先程「暫定的に必敗(L)」 にした頂点に戻ってくる。 • ⾏き先の頂点はすべて探索 済みかつ「暫定的に必敗」 のまま=⾏き先の頂点に必 敗がなかった。 •
Lに確定する。 (L) W W L L W L 最終状態 初期状態
必勝・必敗を決める • 1つ戻る。 • ここは⾏き先に必敗がある ので必勝 W W W L
L W L 最終状態 初期状態
必勝・必敗を決める • 1つ戻る。 • ⾏き先すべてが必勝なので 必敗。 L W W W
L L W L 最終状態 初期状態
必勝・必敗を決める • こうしてすべての頂点の必 勝、必敗が決まる。 • この「初期状態」からゲー ムが始まる場合、先攻の負 け。 L W
W W L L W L 最終状態 初期状態
計算量 • ゲームの状態数を、操作の数をとする。 • BFSで( + ) 。 • 頂点の出次数が2以上のとき、接続されているノードすべてが
訪問済みか、⾒なければならないが…
計算量 • グラフ構築の時に出次数を記録しておき、頂点ごとにカウン ターをもたせ、訪問時にカウンターを増加させれば、「カウン ターが出次数と等しくなった」ときに、接続先がすべて訪問さ れたと判断することが出来る。→ 1 • よってBFSの計算量と合わせて( +
)
DFSで必勝必敗を求める実装例 ⽮印の逆⽅向に探索することに注意 予めすべてを暫定的に必敗にしておくこ とで処理が簡潔になる。
DFSで必勝必敗を求める実装例 win[0]が答え。
30⾔っちゃいけないゲームの場合 • ⾃分が初めに⾔う数をそれぞれの頂点とする。 • 30が最終状態で必敗。 数 … 21 22 23
24 25 26 27 28 29 30 勝敗 … L
30⾔っちゃいけないゲームの場合 • 相⼿に30を⾔わせることができるのは27〜29。 • これらは必勝。 数 … 21 22 23
24 25 26 27 28 29 30 勝敗 … W W W L
30⾔っちゃいけないゲームの場合 • 26から相⼿に⾔わせることが出来るのは27〜29。 • 必敗。 数 … 21 22 23
24 25 26 27 28 29 30 勝敗 … L W W W L
30⾔っちゃいけないゲームの場合 • 繰り返していくとこう求まる。 数 … 21 22 23 24 25
26 27 28 29 30 勝敗 … W L W W W L W W W L
30⾔っちゃいけないゲームの場合 • 30⾔っちゃいけないゲームの場合、「WWWL」の周期になっ ているため、(1)で勝敗が求められる。 • N⾔っちゃいけないゲーム(⾔える数の上限K個)に関して、 N mod (K+1) ==
1ならば後攻の勝ち、それ以外なら先攻の勝 ち 数 … 21 22 23 24 25 26 27 28 29 30 勝敗 … W L W W W L W W W L
Grundy数 • 各状態に振られる数。 • 必勝、必敗を拡張した概念 と⾔える。 • 0のとき必敗、1以上のとき 必勝となる性質がある。 0
1 2 1 0 0 1 0 最終状態 初期状態
Grundy数の定義 • ある頂点について、その頂点から⼀回操作をすることでたどり 着ける頂点のGrundy数の集合をXとするとき、Xに含まれない ⾮負整数のうち最も⼩さいもの(これをXのmexという)を、その 頂点のGrundy数と定義する。 • mexはminimum excludedの略。 •
例 • X={0,1,2,4}のとき、Grundy数は3。 • X={1,2}のとき、Grundy数は0。 • X={}、つまり最終状態のとき、Grundy数は0。
Grundy数の例 • 試しに先程のグラフで Grundy数を求めてみる。 • Grundy数も最終状態から 逆⽅向に決まっていく。 • 最終状態のGrundy数は前 ページより0。
0 最終状態 初期状態
Grundy数の例 • 1つ戻る。 • 0に移動することが可能な ので、Grundy数は1。 1 0 1 最終状態
初期状態
Grundy数の例 • 次にここが決まる。 • 1に移動することが出来る が0に移動することができ ない。よって0。 1 0 1
0 最終状態 初期状態
Grundy数の例 • 同様に埋めていく。 1 1 0 0 1 0 最終状態
初期状態
Grundy数の例 • ここは0と1に移動ができる ので、Grundy数は2になる。 1 2 1 0 0 1
0 最終状態 初期状態
Grundy数の例 • 最後の頂点が埋まり終了。 0 1 2 1 0 0 1
0 最終状態 初期状態
Grundy数の性質 • 定義は、次に移動出来る頂点のGrundy数以外の数のうち⾮負の 最⼩の数。 • 逆に⾔えば、そのGrundy数より⼩さい任意のGrundy数の状態 に必ず移動できる。(定義と同値) • 1以上なら必ず0(必敗)に移動できる。このことからGrundy数が1以上 であることが必勝に相当することが分かる。
Grundy数の利点 • 単純に必勝必敗だけを求めるためには( + )だけの計算量が かかるが、 , はとても⼤きいことが多い。 • 例えば次ページ以降に⽰すNimと⾔うゲームでは、
= %と指数関数 で表される。 • この場合、 擬多項式時間アルゴリズムであるということになる。 • Grundy数を使うと、ゲームを複数のゲームに分解して考えるこ とで計算量を削減することが出来る!
Nim • 公平ゲームの⼀つ。 • ⽯が積まれたN個の⼭がある。 • 1つの⼭を選び、好きな数だけ⽯を取り 除く。 • 2つの⼭から同時に⽯を取り除くことはでき
ない。 • ⽯を0個にしたほうが勝ち。 真ん中から 3つ取り除く
Nim • このゲームの必勝必敗を求めたい。 • ゲームの状態数は、番⽬の⼭の⽯の数 を! とすれば、∏!"# $ (! +1)通り。
• 愚直に必勝・必敗を求めると、計算量は ! の制約を1 ≤ ! ≤ とすれば辺の数を 無視しても(%)。指数関数的に増加し てしまう! • 何とか削減したい。 真ん中から 3つ取り除く
NimのGrundy数 • N=1の場合を考える。 • 0個にすれば勝利なので、0個の状態の Grundy数は0。
NimのGrundy数 1 0個(Grundy数=0)にできるので Grundy数は1
Grundy数を考える 1 2 0個(Grundy数=0)、 1個(Grundy数=1)にできるので Grundy数は2
Grundy数を考える 1 2 3 0個(Grundy数=0)、 1個(Grundy数=1) 2個(Grundy数=2)にできるので Grundy数は3 なにか規則性が…?
Grundy数を考える 1 2 3 4 5 6 7 8 ⾃分より少ない⽯の数に出来るので
Grundy数は⽯の数と⼀致する!
NimのGrundy数 • Nが任意の場合を考える(例ではN=3) • ⼭ごとのGrundy数は2、4、3。 • どうにかこの3つの数字を使った演算で 全体のGrundy数を求めることが出来な いか?
NimのGrundy数 • 答え:XOR演算 • 2 xor 4 xor 3 =
5 • よって右の状態のGrundy数は5 • ゆえに先攻の勝ち • N個のXORを求めるので() !
XOR演算 • 2進数に対する演算。 • 各ビットごとに⾒て、1の数が奇 数個なら1、偶数個なら0とする 演算。 • 結合法則、交換法則が成り⽴つ。 •
Python、C++では演算⼦は「^」 • 項が2つのとき、指定したbitのみ 反転する演算と捉えることも出 来る。 • 桁ごとのmod 2の⾜し算とも考え られる。 010 = 2 100 = 4 xor 011 = 3 ────── 101 = 5
XORがGrundy数になる証明 • XOR演算をした結果が、以下の2つを満たすことを確認すれば 良い。 1. 同じGrundy数の状態には移動できない。 2. ⾃分より⼩さい任意のGrundy数の状態に移動できる。
XORがGrundy数になる証明 • 1. 同じGrundy数の状態には移動できない。 • ⼭は1つしか変化させることが出来ない。 • 値を変化させれば必ずどれかのビットは変化する。 • XORはそれぞれのビットの偶奇を⽰すので、1つの数のビット
が変化すればXOR計算結果の同じ位置のビットが変化する。 • よって、Grandy数は必ず変化すると⾔える。
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
XORがGrundy数になる証明 • この数を変化させる。 • この数は、2進数で0xy (x,y = 0,1)と表さ れる任意の数に変化させられる。 •
2進数の数の変化を考えれば⾃明。 • x、yをうまく調整し、Grundy数を0にす ることが出来る。 010 = 2 001 = 1 xor 011 = 3 ────── 000 = 0
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
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に変化させられる。
XORがGrundy数になる証明 • s xor 5 xor h < sとなるようなsを探す。 •
次の条件を考える。 • sの1であるbitの最⾼位と(5 xor h)の1であるbitの最⾼位が等しい。 • これは、上記の不等式よりも厳しい条件。 • このとき、5はもとのGrundy数であるからh<5であることに注 意する。
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
XORがGrundy数になる証明 • 5(=Grundy数)のn桁⽬は1なので、⽯の⼭の中にもn桁⽬のbit が1の⽯の⼭が存在する。 • 0になることの証明と同じ議論。 • (5 xor h)の1であるbitの最⾼位はn桁⽬で、同じ桁が1である
⽯の数が存在するため、0に出来ることの証明の議論において 5を(5 xor h)と読み替えれば同様に証明することが出来る。 • よって⽰された。
Nimに帰着する問題 • 競プロで出題される多くのゲームはNimに帰着できる!
yukicoder No.2 素因数ゲーム 出典:https://yukicoder.me/problems/no/2
解法 • 例:540 = 2&×3'×5 • 指数の部分(2、3、1)を⽯の数としたNimに帰着できる! • 答えは2 xor
3 xor 1=0よりBobの勝ち。 • 素因数分解の計算量が( ) • 素因数分解をしながらXORを計算することが出来る。 • よって全体でも計算量( )
実装例 a = a + bをa += bと書けるのと同様に a =
a ^ bをa ^= bと書ける。
発展 • 取れる⽯の数に限りがあるNim • NimK ‒ 複数の⼭を選んで⽯を取れる
取れる⽯の数に限りがあるNim • ⽯が積まれたN個の⼭がある。 • 1つの⼭を選び、1個以上個以下の⽯を 取り除く。 • 2つの⼭から同時に⽯を取り除くことはでき ない。 •
⽯を0個にしたほうが勝ち。 • 同様に = 1のときのGrundy数を考えて みる ≤ 2では この⼿はだめ
Grundy数を考える 1 2 3 = 3の場合 ここまではさっきと同じ
Grundy数を考える 1 2 3 = 3の場合 0 0個には出来ないので Grundy数は0
Grundy数を考える 1 2 3 = 3の場合 0 1 1個には出来ないのでGrundy数は1 (4個(Grundy数=0)にはできるので0ではない)
Grundy数を考える 1 2 3 = 3の場合 0 1 2 3
0 同様にGrundy数を考えていくと… ⽯の数を + 1で割ったあまりになっている! (1)で求められる!
取れる⽯の数に限りがあるNim • = 1なら30⾔っちゃいけないゲームと同じ! • ルールを⾒れば⾃明である。 • ≥ 2では限りがないときと同じようにXORを計算すれば 良い。
NimK • ⽯が積まれたN個の⼭がある。 • 1個以上個以下の⼭を選び、1個以上 個以下の⽯を取り除く。 • ⽯を0個にしたほうが勝ち。 • =
1のとき = 1しかありえないので 今までの議論と同じ。 • ≥ 2のときのGrundy数は? 真ん中から3つ、 右から1つ 取り除く
≥ 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の例
まとめ • 公平ゲーム • 先攻、後攻のどちらが勝つかが決まる • Grundy数 • ゲームを複数のゲームに分解し、単純なゲームの組み合わせとして捉 えられる。
参考⽂献 • 岡⽥章 (2014). 『ゲーム理論・⼊⾨』. 有斐閣 • Grundy数(Nim数, Nimber)の理論 -
https://www.creativ.xyz/grundy-number-1065/ • 競プロにおけるNim、Grundy数とNimK - http://yang33- kassa.hatenablog.com/entry/2017/12/21/202812