1. 程式人生 > 實用技巧 >博弈論(入門,持續更新)

博弈論(入門,持續更新)

博弈論(入門,持續更新)

博弈論

本篇只對尼姆博弈和巴什博弈進行介紹(其餘博弈遇到了再加進去)

定義 :博弈論,又稱為對策論(Game Theory)、賽局理論等,既是現代數學的一個新分

支,也是運籌學的一個重要學科。博弈論 是二人在平等的對局中各自利用對方的策略變換自己的

對抗策略,達到取勝的目的。

1,巴什博弈

  巴什博弈:只有一堆n個物品,兩個人輪流從這堆物品中取物, 規定每次至少取一個,最多
 
 取m個。最後取光者得勝。

 顯然,如果n=m+1,那麼由於一次最多隻能取m個,所以,無論先取者拿走多少個,後取者都
 
 能夠一次拿走剩餘的物品,後者取勝。因此我們發現瞭如何取勝的法則:如果n=(m+1)
 
 r+s,(r為任意自然數,s≤m),那麼先取者要拿走s個物品,如果後取者拿走k(≤m)個,那麼先
 
 取者再拿走m+1-k個,結果剩下(m+1)(r-1)個,以後保持這樣的取法,那麼先取者肯定獲
 
 勝。總之,要保持給對手留下(m+1)的倍數,就能最後獲勝。這個遊戲還可以有一種變相的
 
 玩法:兩個人輪流報數,每次至少報一個,最多報十個,誰能報到100者勝。對於巴什博弈,
 
 那麼我們規定,如果最後取光者輸,那麼又會如何呢?(n)%(m+1)==0則後手勝利

先手會重新決定策略,所以不是簡單的相反行的
例如n=15,m=3
後手 先手 剩餘
0 2 13
1 3 9
2 2 5
3 1 1
1 0 0
先手勝利 輸的人最後必定只抓走一個,如果>1個,則必定會留一個給對手

上面是百度百科的解釋,先手勝利的條件比較顯然,後手勝利的本質便是先手取任意數把原本(n)%

(m+1)==0的形式轉化為n=(m+1)r+s的形式,也就是把先手轉化為後手;原本後手變為先手;

例題:洛谷好像沒有巴什博弈的例題

從別的佬部落格裡搬運了幾道

HDU1847

HDU2147

HDU2149

HDU2188

HDU2897

2,尼姆博奕

有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取一個,多者不限,

最後取光者得勝。

這種情況最有意思,它與二進位制有密切關係,我們用(a,b,c)表示某種局勢,首先(0,0,

0)顯然是奇異局勢,無論誰面對奇異局勢,都必然失敗。第二種奇異局勢是(0,n,n),只要

與對手拿走一樣多的物品,最後都將導致(0,0,0)。仔細分析一下,(1,2,3)也是奇異局

勢,無論自己如何拿,接下來對手都可以將其變為(0,n,n)的情形。

計算機演算法裡面有一種叫做按位模2加,也叫做異或的運算,我們用符號⊕表示這種運算,先看

(1,2,3)的按位模2加的結果:

1 =二進位制01

2 =二進位制10

3 =二進位制11 ⊕

———————

0 =二進位制00 (注意不進位)

對於奇異局勢(0,n,n)也一樣,結果也是0。

任何奇異局勢(a,b,c)都有a⊕b⊕c =0。

注意到異或運算的交換律和結合律,及a⊕a=0,:

a⊕b⊕(a⊕b)=(a⊕a)⊕(b⊕b)=0⊕0=0。

所以從一個非奇異局勢向一個奇異局勢轉換的方式可以是:

1)使 a = c⊕b

2)使 b = a⊕c

3)使 c = a⊕b

證明可以看一下下面這位佬的部落格 連結

Anti-Nimm game (尼姆博弈的變形,反尼姆博弈)

以這道題為例洛谷 P4279 SHOI2008小約翰的遊戲

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int t;
int a[1000];
int ans;
int n;
int sum;
int main(){
	cin>>t;
	while(t){
		t--;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		ans=0;
		sum=0;
		for(int i=1;i<=n;i++){
			ans^=a[i];
			sum+=a[i];
		}
		if(sum==n){
			puts(sum&1?"Brother":"John");
		//	cout<<endl; 注意puts自帶換行
		}
		else{
			puts(ans?"John":"Brother");
		//	cout<<endl;
		}
	}
	return 0;
}

我們考慮證明

分類討論再將相同情況合併

1 當每一堆的石子數都為1時,當堆數為奇數時先手輸,否則後手輸

2 當有且有一堆石子的個數>=2其餘均為單個石子時,我們可以通過調整使下一狀態下的全為單個石

子且數量可為奇數可為偶數,故,無論是誰,遇到這個狀態其必將勝利

3 當有至少2堆的石子數>=2

顯然石子必然要在減少的過程中由3狀態變為2狀態,

因為2狀態下存在大於等於2的那堆石子,所以可知2狀態下異或和一定大於0(存在較高位)

假設我們3狀態下異或和大於0,則我們可將下一狀態的異或和變為0或者仍然大於0(證明過程和尼姆

博弈的過程相同)

假設我們3狀態下異或和等於0,我們通過取石子,只能使下一狀態的異或和大於0,

我們已知2狀態下異或和大於0,所以當我們處於狀態3且異或和大於0時,我們可以通過調整使

下一狀態的異或和等於0,但下一狀態只能讓下下狀態的異或和大於0,所以當處於第三種情況時,

若異或和大於0,那麼先手一定勝利,等於0則先手失敗。

我們進行一下總結,由於第一種情況與後兩種情況無法進行合併,所以對第一種情況進行特判定

對2.3種情況進行合併,即大於0先手一定勝利。

證明完畢

完結撒花。

其實這只是博弈論很少一部分,本題好像由sj定理可以直接做?(但我不會)

sg函式也不會(sg函式的題很少),以後遇到再學吧.我還是太菜了(真);