小結 - 基礎博弈

  小結一下基礎博弈,由於暫時對博弈的理解還不是很深,只能說一下我對這段時間對博弈的認識。數組

 

  博弈論的簡介函數

  博弈論是二人或多人在平等的對局中各自利用對方的策略變換本身的對抗策略,達到取勝目標的理論。博弈論是研究互動決策的理論。博弈能夠分析本身與對手的利弊關係,從而確立本身在博弈中的優點,所以有很多博弈理論,能夠幫助對弈者分析局勢,從而採起相應策略,最終達到取勝的目的。博弈的類型分爲:合做博弈、非合做博弈、徹底信息博弈、非徹底信息博弈、靜態博弈、動態博弈,等等。spa

 

  基礎概念code

  必勝態:經過某一步能夠轉移到必敗態的局面。 也就是說,對於一個處於必勝態的玩家,他總能找到一種合法操做,將當前局面變成一個必敗態而後交給對方,若是中途不出現意外的話,最終本身就會獲得勝利。可是處於必勝態並不意味着任意的操做都能將當前局面變成必敗態。blog

  必敗態:經過某一步只能轉移到必勝態的局面。 也就是說,處於必敗態的玩家不管作什麼操做,都只會將當前的局面變成必勝態,而後交給對方,只要對方足夠聰明,那麼該玩家將輸掉比賽。遊戲

  對於足夠聰明的兩個博弈者來講,遊戲的勝負在比賽前就已經知道(固然,我這裏只是說在題目裏,在現實中若是是稍微複雜一點的博弈遊戲,單憑人腦是很難達到那種水平),也就是說勝利的一方總能找到勝利的路徑,而輸掉的那一方不管怎樣走,勝利的一方都能找到對應的方法。也就是說前後手以及起始局面能夠決定整場博弈的勝負。博客

 

  巴什博弈class

  只有一堆n個物品,兩我的輪流從這堆物品中取物,規定每次至少取一個,最多取m個。最後取光者得勝。基礎

  求r=n%(1+m),判斷r是否等於0,若是r不等於0,先手必勝,不然後手必勝。爲何?引用

  咱們能夠分析一下,對於n=(1+m)*r+s,若是s不等於0的話,先手取走s,那麼總的物品數剩下(1+m)*r,而後後手取走k的話,先手只要取走1+m-k的物品,就能夠保持n=(1+m)的倍數的局面交給對方,這意味着什麼?意味着n=0的局面最終會被後手獲得,那樣後手就輸了。而若是s等於0的話,那麼對於先手取k的物品,後手只要取1+m-k個物品就能夠將n=0的局面轉給先手,先手就輸了。

  因此這裏的必敗態是(1+m)的倍數。有沒有發現,對於一場博弈來講,全部的必敗態都會有類似的地方,就像這裏,必敗態必定是(1+m)的倍數。

  而後再說深一點的巴什博奕:只有一堆n個物品,兩我的輪流從這堆物品中取物,規定每次至少取p個,最多取q個,若是剩下的物品數小於p的話須要一次取完。最後取光者得勝。

  這個又怎樣求?按照上面的思路,咱們能夠獲得公式n=(p+q)*r+s。

  那麼這裏的s有兩種狀況①s>=p,②s<p,

  對於①很容易分析,只要先手取走s的話,對於後手去k,先手只要取p+q-k便可保證先手必勝。

  對於②,分析起來沒有①那麼簡單,因此這可能就必定須要用後面講到的用SG值來判斷了。

  而後在講一下一個問題。若是條件和基本的巴什博奕基本同樣,可是說的是最後誰是沒法再取物品的是贏家的話,那該怎麼處理呢?

  既然是這樣,先手只要判斷一下能不能將最後一步留給本身就能夠了。而最後一步最少也要保留一個物品,因此咱們能夠將這個問題轉化爲基本的巴什博奕,只是終點變成一個物品,而不是零個物品。因此判斷的條件是(n-1)%(1+m)!=0 ? 先手贏 : 後手贏。

 

  nim和模型

  有若干堆各若干個物品,兩我的輪流從某一堆取任意多的物品,規定每次至少取一個,多者不限,最後取光者得勝。

  假設這裏有n堆物品,每一堆的數量分辨是a1,a2,a3,```,an。

  那麼若是ans=a1^a2^a3^```^an!=0,那麼就是先手必勝,不然就是後手必勝。

  這裏咱們須要用到二進制的思想。首先咱們用必勝態和必敗態的定義來證實一下。

  首先,根據題意,只要還有物品,玩家就必定要取,並且每一次操做之後,物品的數目一定會減小。

  對於必敗態,也就是ans=0,那就說明a1^a2^a3^```^an=0,令a1,a2,a3```,an中,ai爲某一堆物品的數量,ai^m=a1^a2^a3```^ai^```^an=0。咱們從ai裏面取走物品,那麼ai-->ai'最終ai'^m必然不等於零,即轉爲必勝態,符合必敗態的定義。(感受證實不算很嚴謹······)

  對於必勝態,若是此時的狀態爲aj^p=q(p等於除了aj之外的其餘a[]的異或和),假設咱們從aj上面取必定數目的物品使得aj-->aj',最終使aj'^p=0的話,那麼咱們能夠獲得:

  aj'^p^q=q     --->    aj^aj'^p^p=q       --->   aj^aj'=q

  這意味着什麼,由於咱們是從aj那裏取走必定的物品之後變成aj'的,這裏取走的個數可能有不少種方法,可是,若是咱們取走的個數是二的次冪這麼多呢?很明顯q就是咱們須要從aj上面取走的個數了。只要當前的玩家從某一堆物品個數比q大的堆上取走q個物品,那麼就能夠將當前狀態轉化爲必敗態,而且轉個對方。因此要保證先手必勝的條件就是a1^a2^a3^``````^an!=0。

  

  SG函數(引用一下別人的ppt上面的解釋)

  定義mex(minimal excludant)運算,這是施加於一個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex{0,1,2,4}=三、mex{2,3,5}=0、mex{}=0。

對於一個給定的有向無環圖,定義關於圖的每一個頂點的SG函數g以下:g(x)=mex{ g(y) | y是x的後繼 }。

  當g(x)=k時,代表對於任意一個0<=i<k,都存在x的一個後繼y知足g(y)=i。也就是說,當某枚棋子的SG值是k時,咱們能夠把它變成0、變成一、……、變成k-1,但絕對不能保持k不變。這能夠和nim遊戲進行類比,一個有k個物品的堆,咱們也能夠把它變成0、變成一、……、變成k-1,但絕對不能保持k不變,所以一個遊戲的SG函數就等於他若干個子游戲的SG值的異或和。

  之因此引用別人ppt上的解釋,主要是如今我對SG函數的認識還不是很是深入,只能算大概是怎麼回事,若是要用的話,大概要怎麼用而已。這裏比較有用的除了對SG的解釋之外,還有就是一個遊戲的SG函數等於它的若干個遊戲的SG值的異或和。我的認爲這因此能夠這樣使用是由於子游戲與子游戲之間斌沒有相互影響,而這些子游戲就是一個大的Nim模型裏面的不一樣堆物品。爲何能夠比喻成Nim模型?由於這和SG函數的定義基本上能夠等價,在SG函數的定義裏,對於每個x它都有其後繼(除了x=0),因此sg[x]=k的含義就是對於sg[]=0~k-1的不一樣局面,x均可以到達,固然x還有可能能夠到達比k還要大的局面,可是這裏只須要考慮0~k-1的局面便可。正由於咱們據須要考慮比k還要大的局面,因此咱們才能夠將SG函數用Nim的思想來計算。

  關於怎樣求SG值,這裏給出一個大體的流程:

int sg[MAX];                              //保存sg值的數組
bool f[MAX];                              //用於標記可轉移到的後繼的數組

void solve(int n){
        sg[0]=0;
        for(int i=1;i<=n;i++){
            memset(f,0,sizeof(f));
            
            /*
                關於怎樣進行狀態(局面)轉移的描述,將對於sg值等於i的全部能夠轉移到的後繼的(sg[])都標記成f[ sg[] ]=1;
            */
            
            for(int j=0;j<=n;j++){
                if(!f[j]){
                    sg[i]=j; 
                    break;
                }
            }
        }
}

 

 

 

  關於博弈的題目,由於作的還不算太多,當前大部分作過的題目都在該博客關於博弈的分類上面,在對博弈有更深瞭解之後再在這裏補充。

相關文章
相關標籤/搜索