テクノロジー

勝利の方程式とは?組み合わせゲーム理論をご紹介!

はじめに

こんにちは。ITソリューション部のS.Dです。

皆さん、ゲームは好きでしょうか?
私は、将棋やチェスなどのボードゲームが大好きです。

先日、竜王戦の第二局が行われ、タイトル100期を目指す羽生善治先生が、現タイトル保持者の豊島竜王に挑み、1対1のタイになりました。
最近では、将棋AIがプロ棋士よりも強くなり、アマチュア、プロを問わず将棋AIを活用して将棋の研究が行われています。
チェスの世界では、私が生まれるよりも早く、人間が機械に敗れています。カスパロフさんという、当時の世界チャンピオンがDeepBlueと呼ばれるIBMが開発した機械に敗れました。

そして、ついこの間、機械が人間に勝つにはあと10年かかるといわれていた囲碁でも、Google傘下のDeep Mind社の開発したAlpha Goが、現役最強のイ・セドル9段を破ったことで非常に有名になりました。

少し前までは、個人で機械学習やAIなどの開発を行うには、機材などがとても高価で手が出ませんでした。
しかし、AWSやGoogle Cloudなどの、クラウドサービスが台頭してから、個人でも機械学習などの開発が盛んに行えるようになりました。

私も、囲碁の評価関数やAIを趣味で自作しており、いつの間にか自分より強くなってしまいました。
開発を行っている中で、「"ゲーム"とはいったい何なのか?」という問いがよく浮かんできます。
この、組み合わせゲーム理論はゲーム理論の中でも、不偏ゲームという比較的簡単なゲームを対象にした理論です。

とても面白いものなので、皆さんにご紹介できればと思います!

組み合わせゲーム理論とは?

組み合わせゲーム理論(Combinatorial Game Theory)とは、Nim・将棋・チェス・囲碁などの、二人零和有限確定完全情報ゲームに関しての理論です。

ゲームには、勝ち・負け・引き分けの3つの状態があります。(引き分けは存在しないこともあります)
先後が決まっており、状態遷移で勝負が決まります。例えば、将棋では玉が詰まされたら負けです。
手番は、交互に代わり、最終的に手が無くなるとき(=つまり状態遷移がこれ以上進まないとき)に、勝ち負けや、引き分けになります。

組み合わせゲームは、必ず終わりがあり、ループは認められません。
一般的なゲーム理論との大きな違いは、運や不完全情報を含まない点です。
CGT(Combinatorial Game Theory、組み合わせゲーム理論)は、しばしば競プロとかで出問されていて、その多くは、ある発見をすると簡単にコーディングできます。

今回は、その端緒をご紹介します。

不偏ゲーム(Impartial Games)と非不偏ゲーム(Partisan Games)

組み合わせゲームは大きく分けて、不偏ゲーム(Impartial Games)と非不偏ゲーム(Partisan Games)の2つに分けられます。

  • 不偏ゲーム:任意の局面において、2人のプレイヤーの選択肢とその結果が同じ
  • 非不偏ゲーム:ある局面において、2人のプレイヤーの選択しとその結果が同じでない場合が存在する

例えば、以下のようなゲームは不偏ゲームです。

Nim:
各山にいくつかの石があります。
各ターンで、プレイヤーは1つの山(少なくとも石が1つ存在する)を選び、任意の数の石(少なくとも1つ)を取り除きます。
最初に上の操作ができないプレイヤーが、敗北です。

上記は、非常に有名な不偏ゲームの一つで、Nimと呼ばれています。

逆に、将棋・チェス・囲碁を考えてみましょう。
両ゲームとも、自分の持ち駒(石)と相手の持ち駒(石)があり、両方のプレイヤーにとって選択肢は違い、動かせる駒や石も違います。このようなゲームは、非不偏ゲームと呼ばれます。
非不偏ゲームは、不偏ゲームと比べてはるかに分析が困難になることが多いです。

今回は、不偏ゲームを扱っていきます。

代表的な不偏ゲーム「Nim」について

Nimとは

まずは、Nimゲームについて考察していきましょう。

Nim:
各山にいくつかの石があります。
各ターンで、プレイヤーは1つの山(少なくとも石が1つ存在する)を選び、任意の数の石(少なくとも1つ)を取り除きます。
最初に上の操作ができないプレイヤーが、敗北です。

nimの例
(出典:https://www.geeksforgeeks.org/introduction-to-combinatorial-game-theory/?ref=lbp

上の例をみていきましょう。

A・Bのプレイヤーがいます。山が3つ存在していて、それぞれ、3・4・5個の石があります。
A->B->A->B->...のような感じで、先手がAとして、任意の山から石を少なくとも1個以上取ります。最終的に、石が取れなくなったプレイヤーの負けです。
上の図のように遷移したとき、Aが勝利します。

さて、このゲームは必勝法が存在するのでしょうか?
また、必勝法が存在するとしたら、先手後手どちらが必ず勝つことができるのでしょうか?

Nimの必勝法とは

Nimには、必勝法が存在します。
ただし、山の石の配置の仕方によって、勝つプレイヤーは変わってきます。
ここで一つ、Nim-Sumと呼ばれる、重要な値を紹介します。

Nim-Sum:ゲームある時点での、各山の石の数の累積XORの値

nim必勝法
(出典:https://qiita.com/kuuso1/items/778acaa7011d98a3ff3a )

ちなみに、XORとは上のような演算子です。C/C++だと、a ^ b のbit演算子のことです。

このNim-Sumの値を使うと、今回の勝負について以下のことがいえます。

AとBが自分にとって最適な行動(自分が勝つように動く)をとるとき、ゲーム開始時点で、
Nim-Sumが0でなければ、Aの勝ち
Nim-Sumが0のとき、Bの勝ち

つまり最適な戦略を考えるには、以下2つの定理が必要です。

定理1. n個の数値のXORの合計が、0のとき数値を一つ減らすだけで、XOR合計を0にすることはできない
定理2. nこの数値のXORの合計が、0以外のとき数値を一つ減らすだけで、XOR合計を0にすることができる

Case1:最初のNim-Sumがゼロの場合

すでに紹介したように、この場合最適に動けば、Bが必ず勝ちます。
Bの最適な戦略として、AのターンのときにNim-Sumを必ずゼロにすることです。
Aの手番のとき、Nim-Sumは、もともとゼロなので、Aがどの山からどれだけ石を取ろうとも、Nim-Sumをゼロにすることはできません。(定理2.)

逆に、Bの手番のとき、Nim-Sumはゼロではないので、必ずNim-Sumをゼロにするような石の取り方が存在します。
ゲームは、最終的に全ての山に石が存在しなくなるまで行われるので、上の手順を繰り返せば、最終的にBが勝つことができます。

この手順、つまり相手のNim-Sumがゼロになるように動くことが、本ゲームでの最適な行動といえます。

Case2:最初のNim-Sumがゼロではない場合

上と同様に、今度は逆にAがBのNim-Sumをゼロにするように動けば必ずAが勝ちます。
Bは常に自分のターンがNim-Sumがゼロで回ってくるので、AのターンにNim-Sumをゼロにすることができません。

例えば、上で例を挙げた、3つの山にそれぞれ、3・4・5個の石が存在する場合は、

3 XOR 4 XOR 5 = 2

となって、必ずAが勝ちます。

Grundy数について

ここからは、Nimを一般化したNimkを扱います。
Nimkは、以下のように表されます。

Nimk:
各山にいくつかの石があります。
各ターンで、プレイヤーは1つの山(少なくとも石が1つ存在する)を選び、K個の石(少なくとも1つ)を取り除きます。
最初に上の操作ができないプレイヤーが、敗北です。

NimkにはGrundy数というものが、密接にかかわっています。

Grundy数とは

Grundy数(Nimbers)とは、ゲームの状態を決定する数字のことです。
全ての不偏ゲームは、一度そのゲームのGrundy数を計算すると、ゲームをどのように解くことができるかがわかります。
※Sprague-Grundyの定理とも呼ばれる

Grundy数を計算する前に、まずMexとは何かを説明します。

Mexとは

Mex(Minimum excludant)とは、ある集合の要素でない最小の非負整数のことです。

mex
(出展:https://www.geeksforgeeks.org/combinatorial-game-theory-set-3-grundy-numbersnimbers-and-mex/)

Grundy数の計算

今回、Grundy数を以下のように定義します。

Grundy数:
先手のプレイヤーが次の手番で負けることが決定しているときは「0」
それ以外のときは「すべての可能な次の局面のGrundy数のMex」

例で、Grundy数を2つ計算してみましょう!

例1
一つの山に、n個の石があります。
プレイヤーA・Bは、Aを先手として、交互に任意の自然数の数を選んで、山から石を取ります。
最初に、石を取ることができなくなったプレイヤーの敗北です。
A・B共に、自分が勝つために最善な行動をとる場合、どちらが勝利するでしょうか?

上のGrundy数を求めます。
もし山に1つも、石がなかった場合Grundy数G(0) = 0 です。
もし山に1つ石があった場合、Aは必ず石を1つ以上取らなければいけないので、G(1) = Mex(0) = 1
もし山に2つ石があった場合、Aは石を、1つ取るか2つ取るかできます。
G(2) = Mex(0,1) = 2
同様にして、山にn個石があった場合
G(n) = Mex(n-1,n-2,....,1,0) = n
となります。

常にGrundy数が0以上なのでプレイヤーAが必ず勝利します。

例2
1つの山に、n個の石があります。
プレイヤーA・Bは、Aを先手として、交互に1~3までの任意の数を選んで山から石をとります。
最初に、山から石を取ることができなくなったプレイヤーの敗北です。
A・Bともに自分が勝つために最善を尽くした場合、どちらが勝利するでしょうか?

上のGrundy数を求めます。
もし山に1つも、石がなかった場合Grundy数G(0) = 0 です。
もし山に1つ石があった場合、Aは必ず石を1つ以上取らなければいけないので、G(1) = Mex(0) = 1
もし山に2つ石があった場合、Aは石を、1つ取るか2つ取るかできます。
G(2) = Mex(0,1) = 2
もし山に3つ石があった場合、Aは石を、1つ取るか2つ取るか3つ取るかできます。
G(3) = Mex(0,1,2) = 3
ここまでは、例1と同じです。

もし山に4つ石があった場合、Aは石を、1つ取るか2つ取るか3つ取るかできます。
G(4) = Mex(1,2,3) = 0
となります!

数学的帰納法から、簡単に
山にn個石があった場合のGrundy数は以下のように求められます。
G(n) = Mex(G(n-1), G(n-2), G(n-3))

grundy数
(出典:https://www.geeksforgeeks.org/introduction-to-combinatorial-game-theory/?ref=lbp

Sprague-Grundy定理について

上の最後の例2について、さらに考察していきましょう。

例2
1つの山に、n個の石があります。
プレイヤーA・Bは、Aを先手として、交互に1~3までの任意の数を選んで山から石をとります。
最初に、山から石を取ることができなくなったプレイヤーの敗北です。
A・Bともに自分が勝つために最善を尽くした場合、どちらが勝利するでしょうか?

この問題は、nが与えられたとき、上のようなGrundy数の遷移で解けることがわかりましたが、一般に不偏ゲームにおいてGrundy数が適用できるのでしょうか?

Sprauge-Grundy定理とは

一般に、2人のプレイヤー(A先手・B後手)がいて、n個のサブゲームからなる不偏ゲームを考えます。
Sprauge-Grundy定理は、以下のことを述べています。

A・Bが、自身の勝利のために最善を尽くして動く場合、
ゲーム開始時に、すべてのサブゲームでのGrundy数のXORが0でない場合は、Aが勝利します。
逆に0のときは、必ずBが勝利します。

定理の適用

Sprauge-Grundy定理は、以下のように適用できます。

  1. ゲームをサブゲームに分割する
  2. すべてのサブゲームで、その時点でのGrundy数を計算する
  3. 計算したGrundy数のXORを計算する
  4. XORが0でなければ、最初にプレーするプレイヤーが勝ちます。0であれば、後手が勝ちます。

このアルゴリズムで、問題を解くと以下のようになります。

例2
3つの山に、それぞれ、3・4・5個の石があります。
プレイヤーは、Aを先手として、交互に1~3までの任意の数を選んで山から石をとります。
最初に、山から石を取ることができなくなったプレイヤーの敗北です。
A・Bともに自分が勝つために最善を尽くした場合、どちらが勝利するでしょうか?
  1. 一つの山から石を取りつくすことをサブゲームとします。
  2. Grundy数を計算します。

grundy数
(出典:https://www.geeksforgeeks.org/introduction-to-combinatorial-game-theory/?ref=lbp

  1. それぞれ3・4・5個の山のGrundy数のXOR
G(3) = 3
G(4) = 0
G(5) = 1
G(3) XOR G(4) XOR G(5) = 2

となります。

4. Grundy数のXORが0ではないので、プレイヤーAが勝利します。

最後に

いかがでしたでしょうか?
楽しんでいただければ幸いです。
CodeForcesやHackerRankなどで、面白い問題がたくさんあるのでぜひ解いてみてください!

全く関係ないですが、とっても楽しいゲームなので、ぜひこれをやってみてください!
Herbert Online Judge : http://herbert.tealang.info/index.php?lang=en

<解説>
CodeForces
GeeksforGeeks

<問題集>
HackerRank
CodeForces
YukiCoder

※本記事は2021年01月時点の内容です。

テクノロジーの記事一覧
タグ一覧
TOPへ戻る