博弈論演算法

2021-09-25 23:46:18 字數 2330 閱讀 3735

複習

兩個頂尖聰明的人在玩遊戲,有一堆n個石子,每次每個人能取[1,m]個石子,不能拿的人輸,請問先手與後手誰必敗?

結論:通過上面的分析可以得出結論:當n能整除m+1時先手必敗,否則先手必勝。

兩個頂尖聰明的人在玩遊戲,有nn堆石子,第ii堆有aiai個,每人每次能從一堆石子中取任意多個石子但不能不取,不能拿的人輸,請問先手與後手誰必勝?

結論:當a1 ^ a2 ^ …………^an=0時先手必敗,反之先手必勝。

如果必勝第一次取aj−(aj ^k)

共有n堆石子,已知每堆中石子的數量,並且規定好每堆石子最多可以取的石子數(最少取1顆)。

兩個人輪流取子,每次只能選擇n堆石子中的一堆,取一定數量的石子(最少取乙個),並且取的石子數量不能多於該堆石子規定好的最多取子數,等哪個人無法取子時就表示此人輸掉了遊戲。

這道題的話就是巴什博弈和尼姆博弈的結合,先用巴什博弈將每堆石子數變成 n%(m+1),然後再將剩下的數進行異或

兩個頂尖聰明的人在玩遊戲,有2堆石子,每人每次可以拿走任意一堆中任意數量的石子或在兩堆石子中拿走相同數量的石子,不能拿的人輸,請問先手與後手誰必勝?

我們定義先手必敗的局勢為奇異局勢,根據betty定理,第k個奇異局勢為(【(1+√5)/2】*k,【(3+√5)/2】*k)因為k=y−x,只要將k帶入後判斷求得的x,y是否是輸入的x,y即可。

兩個頂尖聰明的人在玩遊戲,有一堆石子,先手第一次可以拿任意多個但不能全拿走也不能不拿,之後每個人最少拿乙個,最多拿前乙個人兩倍那麼多個,誰取到最後乙個誰就能獲勝,請問先手後手誰必勝?

看到博弈的名字大概就已經能猜到結論是什麼了吧?

沒錯,結論就是當石子數為斐波那契數時先手必敗,反之先手必勝。

原理的話與斐波那契差不多一樣,不過需要自己構造那個斐波那契數列

此題給你兩個數n,k,表示n個數,每次後手取的數量小於先手的k倍,如果先手贏輸出第一步先手拿的數量

int a[

20000005

],b[

20000005];

//a陣列是自己構造的那個所需的數列

//b[i]表示的是a[0,1...i]所能構造的最大數

intmain()

printf

("case %d: "

,m++);

if(n==a[i]

)printf

("lose\n");

else

i--;}

printf

("%d\n"

,ans);}

}return0;

}

階梯博弈並不是一種具體的博弈問題,而是一類博弈問題的變形。

就拿階梯尼姆博弈舉例:

兩個絕頂聰明的人在玩遊戲,有nn堆石子,每次每人可以取走第ii堆(i>1i>1)任意數量的石子並將它們放到第i−1i−1堆,或者直接取走第一堆的任意數量石子,不能操作的人輸,請問先手能否必勝?

對於這一類問題我們將堆的編號分奇偶考慮,如果只有奇數編號那些堆石子,這就是乙個尼姆博弈。現在加入了偶數編號的堆,同樣不影響答案,因為如果有人將偶數編號第i堆的石子移到第i−1i−1堆,那麼另乙個人可以將上乙個人操作的那些石子從第i−1i−1堆再移到第i−2i−2堆,這樣奇數編號堆的局勢沒變,兩人的先後手關係也沒變,相當於將偶數堆編號的石子往前移了兩次。而移動奇數堆到偶數堆就相當於拿走了石子。

那麼為什麼選擇將奇數堆看做尼姆博弈而不是偶數堆呢?

因為雖然偶數堆做尼姆博弈也是相當於拿走石子,但最後石子會堆在第一堆,我們無法判斷哪個人會在什麼時候清空第一堆的石子。

//f:可以取走的石子個數

//sg:0~n的sg函式值

//hash:mex{}

int f[n]

;//可以取走的石子個數

int sg[n]

;//0~n的sg函式值

int hash[n]

;void

getsg

(int n)

中未出現的最小的非負整數

if(hash[j]==0

)}}}

若sg(g)=sg(g1)^ sg(g2)^ …^sg(gn) > 0,局勢為n,先手必勝,反之局勢為p,先手必敗。

//注意 s陣列要按從小到大排序 sg函式要初始化為-1 對於每個集合只需初始化1遍

//n是集合s的大小 s[i]是定義的特殊取法規則的陣列

int s[n]

,sg[n]

,n;bool vis[n]

;int

dfs_sg

(int x)

}for

(int i =0;

;++i)

}}

博弈論 演算法

博弈論主要研究公式化了的激勵結構間的相互作用,是研究具有鬥爭或競爭性質現象的數學理論和方法。博弈論考慮遊戲中的個體的 行為和實際行為,並研究它們的優化策略。如囚徒困境 鏈結 在演算法競賽 現的博弈論題目通常是icg 公平組合遊戲 的,有如下特徵 1.有兩名選手。2.兩名選手交替操作,每次一步,每步都...

演算法 簡單博弈論

僅有一堆n個物品,兩個人輪流取1 m個,最後取的人勝 不能取的人輸 總體可分幾種情況 int bash game int n,int m 是否先手有必贏策略 將一堆變為多堆 即 有3堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取1個,多者不限,最後取光者得勝。本部分含其他部落格內容...

博弈論 Nim博弈

1.nim博弈的起源很早,至於歷史我們就不再說了,直接說它的使用場景。1 依舊是兩個人博弈,但是物品時n堆,每一堆有ai個。2 每個人可以挑選一堆取走若干個,但是不能不取。3 最先取完所有物品的人獲勝。4 結論 所以堆的物品的數量異或起來是0,先手必敗。2.乙個nim博弈的例項 nim博弈。乍一看這...