1.組合遊戲的定義:
組合遊戲是乙個常見的概念,它是是滿足這樣一些條件的遊戲:
1) 遊戲有2名參與者,每個人都採用對自己最有利的策略。
2) 參與者操作時可以的操作時將遊戲從當前狀態改變為另一狀態。
3) 參與者輪流進行操作,每個玩家可選擇的狀態是固定的,沒有隨機成分
4) 在遊戲出於某狀態,當前參與者不能進行操作時,遊戲結束。此時參照規則決定勝負。
5) 無論參與者做出怎樣的操作遊戲在有限部數之內結束(沒有平局),所以組合遊戲必然是乙個無環圖。
組合遊戲也可以用乙個有向圖來表示 g=(x,f)x為遊戲的狀態集合f(x)為x可以到達的狀態集合,而結束狀態均宣布當前參與者失敗。
這類博弈問題還有若干分類。
規定移動最後一步的遊戲者勝的規則叫做
normal play rule。
規定移動最後一步的遊戲者輸的規則叫做
misere play rule
也稱anti-sg games。
此外,對於遊戲的雙方,如果二者博弈的規則相同,那麼稱這類遊戲是
impartial games
否則稱為
partizan games 。
實際上,解決partizan games
的方法和普通的sg games
是有區別的,一般會採用動態規劃或者surreal number。
2.必勝局面
組合遊戲的必勝狀局面定義為當前玩家有策略能使無論對手做什麼操作也可以保證自己勝利的狀態。
1) 結束狀態的性質由規則決定。
2) 乙個非結束狀態,如果它能到達任何必敗狀態,那麼它是必勝狀態,否則它就是必敗狀態。
3.sprague-grundy 函式
它是定義在組合遊戲狀態上的函式,用g (x)表示x狀態的函式值。
定義為:
g (x)= min{n| n∈n ,n≠ for y∈f(x)}
形象的說就是x的函式值為與x所能到達的任意點函式值不同的最小自然數。
我想細心的讀者已經發現g (x)=0當且僅當x為必敗狀態,這用其定義很容易驗證:
1) 當x為結束狀態時,由於g (x)=0它是必敗狀態。
2) 當x不是結束狀態時,如果它能到達必敗狀態,那麼g (x)>0,x是必勝狀態。
3) 如果x不是結束狀態且它到達的所有狀態未必敗狀態,那麼g (x)=0它是必敗狀態。
三大基本博弈:
(一)巴什博奕
(bash game
):只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取乙個,最多取m個.最後取光者得勝.
n = (m+1)r+s , (r為任意自然數,s≤m), 即n%(m+1) != 0, 則先取者肯定獲勝。
巴什博弈還是很好理解的,以你是先手的角度考慮,每一局你都必須構建乙個局勢,每次都留給對手m+1的倍數個物品。所以不只是取物品中的博弈可以用到巴什定理,還可以是報數之類的,看誰先報到100.並且每次報的數必須是1~10(包括1跟10),那麼你每次都應該留給對手剩下的報數個數為11的倍數。如果n=m+1,那麼由於一次最多只能取m個,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝。因此我們發現了如何取勝的法則:如果n=(m+1)r+s,(r為任意自然數,s≤m),那麼先取者要拿走s個物品,如果後取者拿走k(≤m)個,那麼先取者再拿走m+1-k個,結果剩下(m+1)(r-1)個,以後保持這樣的取法,那麼先取者肯定獲勝。總之,要保持給對手留下(m+1)的倍數,就能最後獲勝。
題目:hdu1846:常規做法
#includeint main()
}return 0;
}
hdu1847
:由於可以抽二的倍數 所以只判斷2+1=3就好
#includeint main()
return 0;
}
hdu2147
:把棋盤的左下角看成(1,1)那麼起始點就是(n,m),最後誰能得到(1,1)這個點誰就勝,可以看出只要先搶到(奇數,奇數)接下來無論對方怎麼走都會至少有乙個座標是偶數,那麼對方就一定會敗,先者有三種走發(n-1,m),(n,m-1),(n-1,m-1)只有m和n都是奇數的時候第一步走不出來(奇數,奇數)其餘的(只要有乙個是偶數)就肯定會得到必勝態(奇,奇),就會贏。
#includeusing namespace std;
int main()
return 0;
}
hdu2149
:基本做法
#includeint main()
printf("\n");
}
else
printf("%d\n",m%(n+1));
}
return 0;
}
hdu2188
:基本做法
#includeint main()
}}
hdu2897
:巴什博弈的變形 假設先取者為a,後取者為b,初始狀態下有石子n個,除最後一次外其他每次取得石子個數必須在[p,q]之間。
若當前石子共有n =(p+q)* r個,a必勝,策略為a第一次取q個,以後每次若b取k個,a取(p+q-k)個,如此下去最後必剩下p個給b,所以a必勝。
若n =(p+q)*r+s個(1
若n =(p+q)* r+s個(p
#includeint main()
return 0;
}
理解了bash的規則這種題還是很水的
(二)威佐夫博奕(wythoff game)
有兩堆各若干個物品,兩個人輪流從某一堆或同時從兩堆中取同樣多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。
用(a[k],b[k])(a[k] ≤ b[k] ,k=0,1,2,...,n)表示兩堆物品的數量並稱其為局勢,如果甲面對(0,0)甲輸,稱這種局勢為奇異局勢。前幾個奇異局勢是:(0,0),(1,2),(3,5),(4,7),(6,10),(8,13),(9,15),(11,18),(12,20)。
仔細觀察規律可以發現可以看出:
1.任何自然數都包且僅包含在乙個奇異局勢中。
ak是未在前面出現過的最小自然數,所以有a[k] > a[k-1] ,而且 b[k] = a[k] + k > a[k-1] + k > a[k-1] + k - 1 = b[k-1] > a[k-1] 。
2.將奇異局勢變為非奇異局勢。
只改變奇異局勢(a[k],b[k])的某乙個分量,那麼另乙個分量不可能在其他奇異局勢中,所以必然是非奇異局勢。如果使(a[k],b[k])的兩個分量同時減少,則由於其差不變,也不可能是其他奇異局勢的差,因此也是非奇異局勢。
3.將非奇異局勢變為奇異局勢。
假設面對的局勢是(a , b):
1).若 b = a:同時從兩堆中取走 a 個物體,就變為了奇異局勢(0,0)
2).若 a = a[k] ,b > b[k] :那麼,取走b - b[k]個物體,即變為奇異局勢
3).若 a = a[k] ,b < b[k] :因為a和b唯一確定a-b,則可以變為奇異局勢( a[b-a], a[b-a] + b - a),同時從兩堆中拿走a - a[b-a] 個物體
4).若a > a[k] ,b= a[k] + k :從第一堆中拿走多餘的數量a - a[k]
5).若a < a[k] ,b= a[k] + k: 有兩種做法。第一種,a=a[j] (j < k)從第二堆裡面拿走 b - b[j] 即可;第二種,a=b[j] (j < k)從第二堆裡面拿走 b - a[j] 即可。
由上述性質可知,如果雙方都採取正確操作,那麼面對非奇異局勢,先取者必勝。
判斷奇異局勢的公式為:
a[k] =(int) [k(1+√5)/2] , b[k] = a[k] + k (
(1+√5)/2 為**分割數
因此,由a[k],b[k]組成的矩形近似為**矩形,由於2/(1+√5)=(√5-1)/2,可以先求出 j = [a(√5-1)/2],若 a = [j(1+√5)/2],那麼a = a[j],b[j] = a[j] + j,若不等於,那麼a = a[j]+1,b = a[j] + j + 1,若都不是,那麼就不是奇異局勢。然後再按照上述法則進行,一定會遇到奇異局勢。
題目:hdu1527:威佐夫博奕模板題
#include#includeint main()
else if(xwythoff的規則這種題還是很水的
(三)尼姆博奕(nimm game):
組合遊戲與博弈論 學習筆記
i was standing all alone against the world outside 忘記在 看到,很適合用這句歌詞來描述john nash 1.組合遊戲略述 sg遊戲的若干拓展及變形 賈志豪 2.上面那篇 裡的參考文獻.遊戲有兩個人參與,二者輪流做出決策。且這兩個人的決策都對自己最...
博弈論小結
博弈論,今天算是告一段落了。博弈模型為兩個人輪流決定的非合作博弈,即兩個人輪流進行決策,並且每次都會採用最優策略。博弈模型必須是有限布可以完成的。對兩個人的規則是公平的。p狀態 必敗態 前乙個選手 previous player 將取勝的位置稱為必敗點。n狀態 必勝態 下乙個選手 next play...
博弈論小結
孤單堆的根數異或只會影響二進位制的最後一位,但充裕堆會影響高位 非最後一位 乙個充裕堆,高位必有一位不為0,則所有根數異或不為0。故不會是t態。定理5 s0態,即僅有奇數個孤單堆,必敗。t0態必勝。證明 s0態,其實就是每次只能取一根。每次第奇數根都由己取,第偶數根都由對 方取,所以最後一根必己取。...