公平組合遊戲icg
若乙個遊戲滿足:
由兩名玩家交替行動;
在遊戲程序的任意時刻,可以執行的合法行動與輪到哪名玩家無關;
不能行動的玩家判負;
則稱該遊戲為乙個公平組合遊戲,即博弈遊戲。
nim博弈屬於公平組合遊戲,但城建的棋類遊戲,比如圍棋,就不是公平組合遊戲。因為圍棋交戰雙方分別只能落黑子和白子,勝負判定也比較複雜,不滿足提前判斷兩者勝負的條件。
先來舉乙個栗子了解博弈論:有兩堆石子,第一堆有2個,第二堆有3個,甲乙可以選擇某一堆的任意個石子,輪到誰沒有石子了誰就輸。那麼先手甲必勝。
為什麼呢?讓甲先選擇第二堆的1個石子,那麼剩下的兩堆都是2個石子,輪到乙選擇,無論乙選擇拿幾個石子,甲都在另一堆裡拿相同的數字(即映象選擇),那最後的結果必然是甲勝出。
介紹博弈論之前,先介紹兩個概念:先手必勝狀態、先手必敗狀態。
1、先手必勝狀態:可以走到某乙個必敗狀態。(可以讓對手必敗)
2、先手必敗狀態:走不到任何乙個必敗狀態。
說原理之前先說一下可行的結論:
對於nim遊戲來說,題目所給的a1,a2,a3...an這n堆石子(ai表示每堆石子的數量),如果a1^a2^a3...^an=0,那麼先手必敗,如果a1^a2^a3...^an!=0,那麼先手必勝。
接下來我們來證明這個結論:
1、0^0^0...^0=0 這個肯定是先手必敗的情況
2、a1^a2^a3...^an=x(x!=0)
假設x的二進位制最高位是第k位,那麼一定存在乙個ai,它的第k位二進位制位也為1,因為如果所有的ai第k位二進位制位都為0的話,那x的第k位就不會是1了。我們讓這個ai與x相異或,因為他們的第k位都為1,所以ai^x一定小於ai,ai-(ai^x)一定大於0.我們現在從第i堆裡面取出ai-ai^x個石子,由於ai-(ai^x)一定大於0,所以這個操作一定是可行的。取出來之後,第i堆石子剩下ai-(ai-ai^x),即ai^x個石子。再讓這n堆石子異或,a1^a2^a3...^(ai^x)^...an=(a1^a2^a3...^an)^x=x^x=0.
綜上所述,當n堆石子異或值不等於0的時候,我們一定有辦法取出一次石子,讓它們的異或值變成0.
3、a1^a2^a3...^an=0(式子一)
結論:當n堆石子異或值為0時,無論怎樣操作,之後的n堆石子異或值一定不是0.
我們用反證法來證明這個結論。假設n堆石子異或值為0時,我們取一次石子之後,異或值為0.(取一次石子之後,第i堆石子由ai變為ai')那麼,a1^a2^a3...^ai'^...^an=0(式子二).
我們把式子一和式子二上下分別相乘,由於除了ai和ai'其他的石子數都是成對出現的,因此ai^ai'=0,於是ai=ai'。這顯然與前提假設相矛盾,因為我們假設了先手取了一定數量的石子的.因此當n堆石子異或值為0時,無論怎樣操作,之後的n堆石子異或值一定不是0.
好了,有了以上三個條件,我們來證明一下先前說的結論。如果一開始a1^a2^a3...^an=0,那麼先手無論怎樣操作,之後的異或值一定不是0,然後後手一定有辦法將異或值變成0,先手無論怎樣操作,之後的異或值一定不是0,然後後手一定有辦法將異或值變成0......因為石子數量有限,因此這個遊戲一定可以結束。最後後手一定可以走到條件一的情況0^0^0...^0=0,因此先手必敗。證明當a1^a2^a3...^an!=0,先手必勝,過程與之相同。
例題
#include #include using namespace std;
int main()
if(res) cout<
else cout<
return 0;
}
寫出來劃划水~ 博弈論 Nim博弈
1.nim博弈的起源很早,至於歷史我們就不再說了,直接說它的使用場景。1 依舊是兩個人博弈,但是物品時n堆,每一堆有ai個。2 每個人可以挑選一堆取走若干個,但是不能不取。3 最先取完所有物品的人獲勝。4 結論 所以堆的物品的數量異或起來是0,先手必敗。2.乙個nim博弈的例項 nim博弈。乍一看這...
博弈論 博弈混合
給你乙個n m的棋盤,然後給你4種棋子,分別是 1.王 能橫著走,或者豎著走,或者斜著走,每次可以走1格 2.車 可以橫著走或者豎著走,每次可以走無數格 3.馬 走日字形,例如 如果現在在 1,1 可以走到 2,3 即先走一格直線,然後斜著走一格 4.王后 可以橫著走,或者豎著走,或者斜著走,每次可...
Nim博弈(博弈論)
1.題目 給定n堆石子,兩位玩家輪流操作,每次操作可以從任意一堆石子中拿走任意數量的石子 可以拿完,但不能不拿 最後無法進行操作的人視為失敗。問如果兩人都採用最優策略,先手是否必勝。思路 必勝狀態 a1 a2 an 0 可以走到某乙個必敗狀態 必敗狀態 a1 a2 an 0 走不到任何乙個必敗狀態 ...