博弈论是一个分支领域,也是一个学科。不能把它当做算法去学习。
学习博弈论不能只记忆结论,重要的是理解过程与原理。
有许多基础知识,不懂一定要提!
它是很基础性的,这里都是浅薄的知识,只要认真听,都是能听懂的!
博弈论题目特别多。但是本篇所给的题目答案大多数为简单的、固定性算法的入门题目。毕竟只是入门。真正省赛乃至国赛的博弈论题目都是紫题黑题起步。
慢慢来!
本博客为博弈论入门综述,有许多参考与查阅。我会尽量放出链接或者用户名。
重要参考:博弈论——acm
百度百科:博弈论
概念:
博弈论,又称为对策论(Game Theory)、赛局理论等,既是现代数学的一个新分支,也是运筹学的一个重要学科。
要素:
1.局中人:在一场竞赛或博弈中,每一个有决策权的参与者成为一个局中人。只有两个局中人的博弈现象称为“两人博弈”,而多于两个局中人的博弈称为 “多人博弈”。
2.策略:一局博弈中,每个局中人都有选择实际可行的完整的行动方案,即方案不是某阶段的行动方案,而是指导整个行动的一个方案,一个局中人的一个可行的自始至终全局筹划的一个行动方案,称为这个局中人的一个策略。如果在一局博弈中局中人都总共有有限个策略,则称为“有限博弈”,否则称为“无限博弈”。
3.得失:一局博弈结局时的结果称为得失。每个局中人在一局博弈结束时的得失,不仅与该局中人自身所选择的策略有关,而且与全局中人所取定的一组策略有关。所以,一局博弈结束时每个局中人的“得失”是全体局中人所取定的一组策略的函数,通常称为支付(payoff)函数。
4.对于博弈参与者来说,存在着一博弈结果 。
5.博弈涉及到均衡:均衡是平衡的意思,在经济学中,均衡意即相关量处于稳定值。在供求关系中,某一商品市场如果在某一价格下,想以此价格买此商品的人均能买到,而想卖的人均能卖出,此时我们就说,该商品的供求达到了均衡。所谓纳什均衡,它是一稳定的博弈结果。
假设:
内容出自:红书《ACM国际大学生程序设计竞赛 知识与入门》P50页
知识范围:组合游戏论
基本概念
博弈树:是一个节点都表示一个游戏状态的有向图,图中的每一条边都表示游戏中的某一步。
游戏值:如果给获胜、落败、打平都给一个分数的话,那么每个状态都对应了一个游戏值,该值为游戏双方从该局面出发以最优策略博弈后,己方所能获得的分数。
Max状态:假设当前状态轮到己方走,有多个可以选择的后继状态,那么一定选择游戏值最大的后继状态。对 应的游戏值也是当前状态的游戏值。这样的状态称为Max状态。
Min状态:假设当前状态轮到对方走,有多个可以选择的后继状态,那么一定选择游戏值最小的后继状态。对 应的游戏值也是当前撞他的游戏值。这样的状态称为Min状态。
alpha-beta剪枝:在一个Max状态时,它的后继状态一定是Min状态。而如果当前这个Max状态的最大游戏值 为 X X X,而它的某个Min状态中有一个子状态的值小于等于 X X X,那么这个Min子状态一定不能更新Max状态。
【性质】:
M a x 状 态 的 子 状 态 一 定 是 M i n 状 态 M i n 状 态 的 子 状 态 一 定 是 M a x 状 态 Max状态的子状态一定是Min状态\\ Min状态的子状态一定是Max状态\\ Max状态的子状态一定是Min状态Min状态的子状态一定是Max状态
NP态:假设游戏不会出现平局,即状态图是有向无环图的话,所有状态分为两种:
P态(Previous)和N态(Next)。
P 态 表 示 该 状 态 对 于 前 一 个 玩 家 来 说 是 必 胜 的 。 \color{green}P态表示该状态对于前一个玩家来说是必胜的。 P态表示该状态对于前一个玩家来说是必胜的。
N 态 表 示 该 状 态 对 于 下 一 个 玩 家 来 说 是 必 胜 的 。 \color{green}N态表示该状态对于下一个玩家来说是必胜的。 N态表示该状态对于下一个玩家来说是必胜的。
这里,0个物品显然是P态。还剩下1、 2、 3个物品的状态都是N态。
在大多数游戏,终止状态都是P态。所以如果不加特殊说明,一下都假设终止状态为P态。
从定义可以知道,任意一个P态,要么其是终止状态,要么它所有可以转移到的状态(后继状态)都是N态。
而对于任意一个N态,它至少有一个后继状态是P态。
对于任意状态 x x x ,它的SG函数值:(Grundy值) : g ( x ) = m e x { g ( y ) ∣ y 是 x 的 后 续 状 态 } \color{red}g(x)=mex\{g(y)\;\Big|\;y\,是\,x\,的后续状态\} g(x)=mex{ g(y)∣∣∣y是x的后续状态}
其中 m e x mex mex 是一个对于非负整数集合 S S S 的运算, m e x ( S ) mex(S) mex(S) 表示 S S S 中没有出现的最小非负整数。
对于终止状态,因为它没有后继状态,所以它的SG函数值为0。
如果知道一个状态的SG函数值,可以快速判断该状态是P态还是N态:
x 是 P 态 ⟺ g ( x ) = 0 x 是 G 态 ⟺ g ( x ) ≠ 0 \color{red}x是P态\iff g(x)=0\\ \color{red}x是G态\iff g(x)\ne0 x是P态⟺g(x)=0x是G态⟺g(x)=0
对于任意 X = X 1 + X 2 + ⋯ + X n X=X_1+X_2+\cdots+X_n X=X1+X2+⋯+Xn
有 g ( x ) = g ( X 1 ) ∧ g ( X 2 ) ∧ ⋯ ∧ g ( X n ) , ∧ 表 示 逻 辑 异 或 , 即 ⊕ g(x)=g(X_1)\wedge g(X_2)\wedge\cdots\wedge g(X_n)\quad ,\wedge表示逻辑异或,即\oplus g(x)=g(X1)∧g(X2)∧⋯∧g(Xn),∧表示逻辑异或,即⊕
SG值相同的局面,可以认为局面本质相同。
博弈介绍:
有两个聪明的人在博弈。有 n n n 个石头,每轮一个人可以拿 1 ∼ m 1\sim m 1∼m个石子。
最后无法拿石子的人失败。
问,谁会获胜?
分类讨论的分析:
当石子数在 1 ∼ m 1\sim m 1∼m时,第一个人直接可以拿完,直接获胜。为N态。
当石子数在 m + 1 m+1 m+1 时,第一个人怎么拿,第二个人都可以全部拿完。为P态。
当石子数为 m + 2 m+2 m+2 时,第一个人可以拿1个石子,变成 m + 1 m+1 m+1 的状态。无论第二个人怎么拿,你都可以剩余 的都拿光,然后获胜。
⋮ \vdots ⋮
当石子数为 ( m + 1 ) k (m+1)k (m+1)k 时候,第一个人必输,为P态。
当石子数不是 ( m + 1 ) k (m+1)k (m+1)k 的时候,第一个人必胜,为N态。
( ↑ W H Y ? \uparrow WHY? ↑WHY?)
假设目前的石头数量为 ( m + 1 ) k + r (m+1)k+r (m+1)k+r ,我们可以拿走 r r r 个石头,使之变成 ( m + 1 ) k (m+1)k (m+1)k 的状态。
假设目前的石头数量为 ( m + 1 ) k (m+1)k (m+1)k 。
若 k = 1 k=1 k=1 ,必败已证。
若 k > 1 k>1 k>1,我们无论拿 1 ∼ m 1\sim m 1∼m 中的多少个,都会变成 ( m + 1 ) ( k − 1 ) + r (m+1)(k-1)+r (m+1)(k−1)+r 的状态。
利用数学归纳法即可简单易得。 □ \Box □
SG函数分析
g ( 0 ) = 0 g(0)=0 g(0)=0
当石子数 x ∈ { 1 ⋯ m } x\in\{1\cdots m\} x∈{ 1⋯m}时, g ( x ) = m e x { g ( y ) ∣ y ∈ [ 0 , x − 1 ] } = x g(x)=mex\{g(y)\Big | y\in[0,x-1]\}=x g(x)=mex{ g(y)∣∣∣y∈[0,x−1]}=x
当石子数 x = m + 1 x=m+1 x=m+1时, g ( x ) = m e x { g ( y ) ∣ y ∈ [ 1 , m ] } = 0 g(x)=mex\{g(y)\Big | y\in[1,m]\}=0 g(x)=mex{ g(y)∣∣∣y∈[1,m]}=0
⋮ \vdots ⋮
{ 当 石 子 数 x = ( m + 1 ) k 的 时 候 , g ( x ) = m e x { g ( y ) ∣ y ∈ [ x − m , x − 1 ] } = 0 当 石 子 数 x = ( m + 1 ) k + r 的 时 候 , g ( x ) = m e x { g ( y ) ∣ y ∈ [ x − m , x − 1 ] } = r , r > 0 \begin{cases} 当石子数 x = (m+1)k\qquad的时候,g(x)=mex\{g(y)\Big | y\in[x-m,x-1]\}=0\\ 当石子数 x = (m+1)k+r\,\,的时候,g(x)=mex\{g(y)\Big | y\in[x-m,x-1]\}=r\quad ,r>0 \end{cases} ⎩⎨⎧当石子数x=(m+1)k的时候,g(x)=mex{ g(y)∣∣∣y∈[x−m,x−1]}=0当石子数x=(m+1)k+r的时候,g(x)=mex{ g(y)∣∣∣y∈[x−m,x−1]}=r,r>0
合并以上式子,可得:
g ( x ) = g ( ( m + 1 ) k + r ) = r \color{red}g(x) = g\Big((m+1)k+r\Big)=r g(x)=g((m+1)k+r)=r
结论
从SG函数分析可知
若 ( m + 1 ) ∣ x (m+1)\,\Big | \,x (m+1)∣∣∣x ,则 g ( x ) = 0 g(x)=0 g(x)=0 ,为P态,先手必输。
若 ( m + 1 ) ∤ x (m+1)\,\nmid \,x (m+1)∤x ,则 g ( x ) ≠ 0 g(x)\ne0 g(x)=0 ,为N态,先手必胜。
变形(最后取的输) :
只要留一块给对面就赢了,所以判断(n-1)%(m+1)
超级氺的模板题目
(0.1/10)HDU1846 : Brave Game
代码
/*
_ __ __ _ _
| | \ \ / / | | (_)
| |__ _ _ \ V /__ _ _ __ | | ___ _
| '_ \| | | | \ // _` | '_ \| | / _ \ |
| |_) | |_| | | | (_| | | | | |___| __/ |
|_.__/ \__, | \_/\__,_|_| |_\_____/\___|_|
__/ |
|___/
*/
int main()
{
int T;cin >> T;
while(T--){
int n,m;
cin >> n >> m;
if(n % (m + 1) == 0)cout << "second" << endl;
else cout << "first" << endl;
}
return 0;
}
做过的题目:
(2/10)牛客练习赛67:牛牛爱博弈
什!这题在HDU也有原题!HDU1847
该题分析:
该题的分析与答案:眼泪的CSDN
新的题目(呜呜偷瞄题解然后看难度//)
(黄题)Roy&October之取石子 洛谷P4018
(黄题)Roy&October之取石子II 洛谷P4860
博弈介绍:
有两个堆,第一个堆有 a a a 个石子,第二个堆有 b b b 个石子。
有两个聪明的人,依次每轮从堆中拿石子。
拿取方案一:从S堆中拿 m m m 个石子, m ≤ ∣ S ∣ m\le |S| m≤∣S∣
拿取方案二:从S和T堆中同时拿取 m m m 个石子, m ≤ min ( ∣ S ∣ , ∣ T ∣ ) m\le \min(|S|,|T|) m≤min(∣S∣,∣T∣)
问,谁会获胜?
奇异局势 ( a , b ) (a,b) (a,b):表示这个状态 ( a , b ) (a,b) (a,b)为P态。即 g ( S ( a , b ) ) = 0 g\Big(S(a,b)\Big)=0 g(S(a,b))=0
性质:每个自然数都在且仅在某一个奇异局势中(0除外)。
前几个奇异局势为:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)
判断奇异局势的方法:
满 足 ( n 1 + 5 2 , n 1 + 5 2 + n ) , n ∈ N 满足 (n\frac{1+\sqrt{5}}{2},n\frac{1+\sqrt{5}}{2}+n),n\in \mathbb{N} 满足(n21+5,n21+5+n),n∈N 的状态即为奇异局势。
题目
(2.1/10) 取石子游戏 HDU:1527
代码
/*
_ __ __ _ _
| | \ \ / / | | (_)
| |__ _ _ \ V /__ _ _ __ | | ___ _
| '_ \| | | | \ // _` | '_ \| | / _ \ |
| |_) | |_| | | | (_| | | | | |___| __/ |
|_.__/ \__, | \_/\__,_|_| |_\_____/\___|_|
__/ |
|___/
*/
int main()
{
int a,b;
while(cin >> a >> b){
if(a > b)swap(a,b);
double tmp = (1.0+sqrt(5.0))/2;
double n = b - a;
if((int)(n * tmp) == a)cout << 0 << endl;
else cout << 1 << endl;
}
return 0;
}
博弈介绍
有两堆石子,第一堆有 a个石头,第二堆有 b 个石头。
你有两种操作:
操作一:从某堆拿任意个石子。
操作二:从第一堆拿 x 个,从第二堆拿 y 个,要求 ∣x−y∣≤k,其中k是给定常数。
每个人都是最优策略,让你求是否先手必胜(1)或先手必败(2)。
做过的题目
(5/10)Slime and Stone HDU:6869
题解
杭电多校9:拓展威佐夫博弈
博弈介绍:
有一堆个数为 n n n ( n ≥ 2 n\ge2 n≥2)的石子。双方轮流取石子。
拿取规则一:先手不能一次性把石子都取完,也不可以不取。
拿取规则二:之后每次可以拿取的石子数为 [ 1 , 2 × 刚 刚 对 手 拿 取 的 石 子 数 ] [1,2\times刚刚对手拿取的石子数] [1,2×刚刚对手拿取的石子数]
结论:
当 n n n 为 F i b o n a c c i Fibonacci Fibonacci 数列时,先手必败。否则,先手必胜。
思路:
根据 正整数的泽肯朵夫 ( Z a c k e n d o r f ) (Zackendorf) (Zackendorf) 表示:
每个正整数都有唯一的泽肯朵夫表示。
该表示把整数写成不同的斐波那契的数的和。
这些斐波那契数中没有任何两个是斐波那契序列中的连续项。
且不使用 f 1 = 1 f_1=1 f1=1 这项。 (但可以使用 f 2 = 1 f_2=1 f2=1 这项)
例如:83 = 55 + 21 + 5 + 2。
若先手取2,那么后手无法取5个及以上。而5是一个斐波那契数,那么一定是先手取走了这五颗中的最后一个。同理,接下去先手取走接下来的后21颗,再取走后55颗中的最后一课,那么先手赢。
f i + 2 = f i + 1 + f i > 2 f i f_{i+2}=f_{i+1}+f_i > 2f_i fi+2=fi+1+fi>2fi
若 n n n 是斐波那契数,比如89 f n f_n fn,第一次取 x x x 个石子。
若 x ≥ 34 ( f n − 2 ) x\ge 34\quad(f_{n-2}) x≥34(fn−2),后手直接取光,因为 f n − f n − 2 = f n − 1 < 2 f n − 1 f_{n}-f_{n-2}=f_{n-1}<2f_{n-1} fn−fn−2=fn−1<2fn−1
若 $x<34 $ ,那么剩下的石子数 55 < y < 89 55
题目:
(2/10)取石子游戏 HDU:2516
(绿题)取石子游戏|【模板】威佐夫博弈 洛谷P2252
代码
自行编写(太氺啦这题!)
博弈介绍:
有三堆若干个物品。
有两个聪明的人。每轮没人拿取物品。
拿取规则一:从某一堆中拿取任意多的物品。
拿取规则二:每次至少取一个。
问,谁获胜?
奇异局势:
(0,0,0)显然是奇异局势。
(0,n,n)显然也是奇异局势。
(1,2,3)其实也是奇异局势。无论自己如何拿,对方都能变成(0,n,n)的情况。
非奇异局势向一个奇异局势的转换方式:
可以是:
使 a = c ∧ b a=c\wedge b a=c∧b
使 b = a ∧ c b=a\wedge c b=a∧c
使 c = a ∧ b c=a\wedge b c=a∧b
结论:
对于局势(a,b,c):
若 a ∧ b ∧ c = 0 a\wedge b\wedge c=0 a∧b∧c=0,为P态。
否则,为N态。
有 n n n 堆石子,每堆石子有 a i a_i ai 个石子。
三维拓展至 n n n 维也成立。
结论:
若 a 1 ∧ a 2 ∧ ⋯ ∧ a n = 0 a_1\wedge a_2\wedge \cdots\wedge a_n=0 a1∧a2∧⋯∧an=0,为P态。
否则,为N态。
网上dl(kuansoudafahao)的证明:
模板题目(绿题??):
【模板】nim游戏 洛谷:P2197
题目:
取火柴游戏 洛谷:P1247
做法:
(1) 求出 S = a 1 ∧ a 2 ∧ ⋯ ∧ a n S=a_1\wedge a_2\wedge \cdots\wedge a_n S=a1∧a2∧⋯∧an
(2)若 S ≠ 0 S\ne0 S=0 则先手必胜。否则先手必败。
(3)会先手必胜,若 S ∧ a i < a i S\wedge a_i < a_i S∧ai<ai 则该堆对答案有贡献。
拿走的最少个数为 a i − ( S ∧ a i ) a_i - (S\wedge a_i) ai−(S∧ai)
做法:
(1) 求出 S = a 1 ∧ a 2 ∧ ⋯ ∧ a n S=a_1\wedge a_2\wedge \cdots\wedge a_n S=a1∧a2∧⋯∧an
(2)若 S ≠ 0 S\ne0 S=0 则先手必胜。否则先手必败。
(3)会先手必胜,若 S ∧ a i < a i S\wedge a_i < a_i S∧ai<ai 则该堆对答案有贡献。计算多少个堆对其有贡献 即可。
参考与查阅:[学习笔记] (博弈论)Nim游戏和SG函数
博弈介绍:
有 n n n 堆石子,每堆石子有 a i a_i ai 个石子。
每次操作可以拿走一堆中的若干个石子( 1 ∼ m 1\sim m 1∼m个)
谁无法操作谁就输了。
问,谁会赢?
博弈分析:
当 n = 1 n=1 n=1 时,是明显的巴什博奕。
一堆石子数为 x x x ,那么 g ( x ) = x m o d ( m + 1 ) g(x)=x\bmod (m+1) g(x)=xmod(m+1)
然后与普通的Nim博弈过程相同即可。
博弈介绍:
有 N N N 堆石子放在 N N N 级台阶上,台阶编号为 1 ∼ N ( 地 面 为 0 层 ) 1\sim N(地面为0层) 1∼N(地面为0层)
每堆有 a i a_i ai 个石子。
两人轮流游戏,每次将任意堆 j j j 中的任意个石子(但至少一个)移动至 j − 1 j-1 j−1 层。
直到所有石子都移动到地面,最后无法移动的人输。
问,谁会赢?
博弈做法:
只要考虑奇数层的位置进行Nim游戏即可。
因为偶数层位置移动后,对方可以进行模仿操作,对方再将那些石子移动到奇数层。
题目
dingyeye loves stone 原题模板题 HDU5996
Georgia and Bob POJ1704《挑战程序设计竞赛1》P312
Game HDU3389
参考查阅:[博弈论进阶之Anti-SG游戏与SJ定理](https://www.cnblogs.com/zwfymqz/p/8469856.html)
Anti-Nim游戏:
有n堆石子,两个人可以从任意一堆石子中拿任意多个石子(不能不拿)
拿走最后一个石子的人失败。
问,谁会赢?
博弈分析
两个人的胜利条件发生了变化。
先手必胜有两种情况:
粗略证明:
当每堆石子只有1个时,SG值为0代表为偶数个堆,后手必然会拿走最后一个。
当只有一堆石子数大于1时,先手拿走一些只剩下一个,或者先手把这堆都拿走, 显然后手就一定会输了。
当有多堆石子数大于1时,由Nim游戏推导即可。
推广至 Anti-SG游戏
定义:决策集合为空的游戏者赢。其余规则与SG游戏相同。
SJ定理:
先手必胜当且仅当:
(黄题)取数游戏II 洛谷P1288
A Funny Game POJ2484《挑战程序设计竞赛1》P307
Euclid’s Game POJ2348《挑战程序设计竞赛1》P309
(蓝题) 取石子游戏 洛谷P5675
(紫题)分裂游戏 HNOI2007 洛谷P3185
(紫题)染色游戏 ZJOI2009 洛谷P2594
(紫题)取石子游戏 ZJOI2009 洛谷P2599
(黑题)取石子游戏 HNOI2010 P3210
//其他还有《挑战程序设计竞赛1》P305 318
关于 Nim游戏与SG函数 的一点研究:Multi-SG、Every-SG、树的删边游戏、无向图的删边游戏、Fusion Principle
博弈与概率论:囚徒困境、纳什均衡、智猪博弈
二维Nim与Nim积