1. 程式人生 > >組合遊戲學習筆記 [補檔]

組合遊戲學習筆記 [補檔]

基礎 判斷 如何判斷 給定 str nim博弈 然而 同時 取出

基礎

滿足以下條件的遊戲是組合遊戲:

  • 有兩人參與遊戲, 輪流作出決策
  • 無法作出決策的人失敗, 然後遊戲結束
  • 遊戲總能在有限次決策後結束
  • 遊戲的同一個狀態不會多次到達
  • 任意一個參與者在某一確定狀態下可以作出的決策集合只與當前狀態有關

定義先手必敗狀態為必敗態, 先手必勝狀態為必勝態, 則我們有

  • 無法進行任何移動的狀態是必敗態.
  • 可以移動到必敗態的狀態的是必勝態.
  • 所有移動都只能得到必勝態的狀態是必敗態.

考慮如何判斷一個遊戲中, 先手是否必勝: 根據定義, 由於遊戲中任意狀態都不可能重復出現, 因而每個狀態都只能是必勝態或必敗態, 並且可以根據上述規則計算出來, 進而判斷遊戲中先手是否必勝.

然而, 我們發現按照上述規則進行計算需要枚舉每個狀態以及它能轉移到的所有狀態, 復雜度開銷較大, 因此考慮如何優化一些常見的組合遊戲問題.

Bash博弈

Wythoff博弈

問題概述

兩堆若幹個物品, 兩人輪流操作, 每次可以從一堆中取任意多個物品, 或者在兩堆中取相同的任意多個物品, 不可以不取. 取走最後一個物品的人獲勝. 問先手是否必勝.

解決

我們用二元組\((a, b)\)表示一種狀態. 我們不妨假設\(a \le b\). 考慮任意兩個必敗態\((a_1, b_1)\)\((a_2, b_2)\)之間的關系, 有如下性質:

  • \(a_1\), \(b_1\), \(a_2\), \(b_2\)
    之間兩兩不相等. 證明:
  • \(a = b\)時, 可以同時在兩堆中取\(a\)個物品, 繼而轉移到結束狀態. 因此\(a = b\)的狀態為必勝狀態.
  • 當我們只取一堆中的物品時, \(a\)\(b\)中的一個數保持不變. 不妨假設\(a\)不變, 由於\((a, b)\)可以轉移到\((a, c)\)(或者是\((c, a)\))的狀態, 因而\((a, b)\)\((a, c)\)不可能同時是必敗狀態, 因而任意兩個必敗狀態中不可能出現重復的數字
  • \(a_1 - b_1 \ne a_2 - b_2\). 證明: 對於\(a_1 - b_1 = a_2 - b_2\)的兩種狀態, 我們對\((a_1, b_1)\)
    在兩堆中同時取出\(a_1 - a_2\)個物品, 即可得到\((a_2, b_2)\)狀態, 因而這兩種狀態不可能同時是必敗狀態.

猜測所有必敗狀態的形式: 我們將所有必敗二元組按照首元排序, 顯而易見, 第\(0\)組為\((0, 0)\), 其後的每個必敗二元組中首元為未在之前出現過的最小正整數, 並且第\(n\)組中兩個數之差為\(n\). 直觀地, 這些必敗狀態的前幾位是這樣的:\((0, 0)\), \((1, 2)\), \((3, 5)\), \((4, 7)\), \((6, 10)\), \(\cdots\)

證明:

首先用數學歸納法證明這種方法得到的狀態一定都是必敗態.

\(0\)組顯然是必敗狀態. 假設我們已經得到了前\(n\)組必敗狀態, 考慮第\(n + 1\)組. 我們假設在第\(0\)\(n\)組中未出現過的最小非負整數為\(m\), 則第\(n + 1\)組顯然是\((m, m + n + 1)\). ,考慮如何證明這一狀態是必敗狀態:

  • 假如在\(m\)中取物品, 得到\((m - k, m + n + 1)\). 由於\(m\)為前\(n\)組中未出現過的最小非負整數, 因而\(m - k\)一定已經出現過. 根據前面的性質, 由於任意兩組必敗狀態中的數字都不相同, 因而\((m - k, m + n + 1)\)不是必敗狀態.
  • 假如在\(m + n + 1\)中取物品, 得到\((m, m + n + 1 - k)\), 則兩堆物品之差為\(n + 1 - k\), 必定在之前出現過. 由於任意兩組必敗狀態的兩堆物品之差不相同, 因而\((m, m + n + 1 - k)\)不是必敗狀態.

因而\((m, m + n + 1)\)不能轉移到必敗狀態, 因而我們按照這種方法得到的狀態一定都是必敗狀態.

同時, 我們還需要證明, 所有必敗狀態都可以通過這種方法得到, 換而言之, 就是這種方法無法得到的狀態都是必勝狀態.

證明非常簡單, 考慮一個狀態\((a, b)\), 假如不能通過上述方法得到, 則必然存在另一個\((a, c)\)狀態是必敗狀態. 由於\((a, b)\)可以轉移到\((a, c)\), 因而\((a, b)\)是必勝狀態, 證畢.

因而這種方法是正確的.

Nim博弈

問題概述

Nim博弈應該是組合遊戲中最廣為人知的一個了. 給定\(n\)石子, 每堆\(a_n\)個, 兩個人輪流取, 每次可以從一堆中取走任意多個石子, 取走對後一顆石子的人獲勝. 問先手是否必勝.

解決

直接放公式吧: 一個狀態為必敗狀態, 當且僅當\(a_1 \oplus a_2 \oplus \cdots \oplus a_n = 0\)

證明如下:

跟之前Wythoff博弈的證明一樣, 首先還是用數學歸納法證明通過這個結論得到的狀態都是必敗態.

顯而易見地, 對於\(a_1 = a_2 = \cdots = a_n = 0\), 有\(a_1 \oplus a_2 \oplus \cdots \oplus a_n = 0\), 且是必敗態.

考慮之後的所有\(a_1 \oplus a_2 \oplus \cdots \oplus a_n = 0\)的狀態, 由於無論將哪一個\(a_k\)改為\(a_k‘\)都不能使得\(a_1 \oplus \cdots \oplus a_k‘ \oplus \cdots \oplus a_n = 0\), 因而這個狀態不能轉移至一個必敗狀態, 因而它本身為必敗態.

然後證明不能通過這種方法得到的狀態都是必勝態: 仍然是顯而易見地, 我們可以通過將\(a_1 \oplus a_2 \oplus \cdots \oplus a_n \ne 0\)中的某一個數\(a_k\)改為\(a_k‘ < a_k\), 使得\(a_1 \oplus \cdots \oplus a_k‘ \oplus \cdots \oplus a_n = 0\), 因而它是必勝狀態.

因而公式正確.

組合遊戲學習筆記 [補檔]