博弈论综述【1】
- 博弈与博弈论
- 博弈树
- NP状态
- SG函数
- 巴什博奕
- 威佐夫博弈与拓展威佐夫博弈
- 斐波那契博弈
- Nim游戏与拓展Nim博弈
- SJ定理与Anti-SG游戏
前言
-
博弈论是一个分支领域,也是一个学科。不能把它当做算法去学习。
-
学习博弈论不能只记忆结论,重要的是理解过程与原理。
-
有许多基础知识,不懂一定要提! 😂
-
它是很基础性的,这里都是浅薄的知识,只要认真听,都是能听懂的!
-
博弈论题目特别多。但是本篇所给的题目答案大多数为简单的、固定性算法的入门题目。毕竟只是入门。真正省赛乃至国赛的博弈论题目都是紫题黑题起步。
慢慢来!
-
本博客为博弈论入门综述,有许多参考与查阅。我会尽量放出链接或者用户名。
博弈与博弈论
-
概念:
-
要素:
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状态
- 内容出自:红书《ACM国际大学生程序设计竞赛 知识与入门》P51页
- 以巴什博奕为例: n n n个物品,每次最多拿走 m m m个,最少拿走1个,状态图表示。
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态。
SG函数(Sprague-Grundy)
-
对于任意状态 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 -
Sprague-Grundy Theorem
对于任意 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值相同的局面,可以认为局面本质相同。
巴什博奕 Bash Game
-
博弈介绍:
有两个聪明的人在博弈。有 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)
-
超级氺的模板题目
-
代码
/* _ __ __ _ _ | | \ \ / / | | (_) | |__ _ _ \ 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; }
-
做过的题目:
-
该题分析:
-
新的题目(呜呜偷瞄题解然后看难度//)
威佐夫博弈
-
博弈介绍:
有两个堆,第一个堆有 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 的状态即为奇异局势。
-
题目
-
代码
/* _ __ __ _ _ | | \ \ / / | | (_) | |__ _ _ \ 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)。
-
做过的题目
-
题解
斐波那契博弈
-
博弈介绍:
有一堆个数为 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<y<89 55<y<89 ,它一定不是斐波那契数,把 它分解成斐波那契数,按之前的规则取,则后手必胜。
-
-
题目:
-
代码
自行编写(太氺啦这题!)
Nim博弈
-
博弈介绍:
有三堆若干个物品。有两个聪明的人。每轮没人拿取物品。
拿取规则一:从某一堆中拿取任意多的物品。
拿取规则二:每次至少取一个。
问,谁获胜?
-
奇异局势:
(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态。
拓展Nim博弈与Nim博弈的各个变种
(1)拓展维度
-
有 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)的证明:
-
模板题目(绿题??):
(2)先手怎么取
-
题目:
-
做法:
(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)
(3)求先手一开始有多少种取得方式能够赢
-
做法:
(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 则该堆对答案有贡献。计算多少个堆对其有贡献 即可。
(4) 变形:有拿取上限(NYOJ-135)
参考与查阅:[学习笔记] (博弈论)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博弈过程相同即可。
(5) 阶梯博弈(Nim Staircase博弈)
-
博弈介绍:
有 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
最后的最后:SJ定理与Anti-SG游戏
-
参考查阅:[博弈论进阶之Anti-SG游戏与SJ定理](https://www.cnblogs.com/zwfymqz/p/8469856.html)
-
Anti-Nim游戏:
有n堆石子,两个人可以从任意一堆石子中拿任意多个石子(不能不拿)
拿走最后一个石子的人失败。
问,谁会赢?
-
博弈分析
两个人的胜利条件发生了变化。
先手必胜有两种情况:
- 当每堆石子都只有一个,且游戏的SG值为0
- 至少一堆石子多于一个,且游戏的SG值不为0
-
粗略证明:
当每堆石子只有1个时,SG值为0代表为偶数个堆,后手必然会拿走最后一个。
当只有一堆石子数大于1时,先手拿走一些只剩下一个,或者先手把这堆都拿走, 显然后手就一定会输了。
当有多堆石子数大于1时,由Nim游戏推导即可。
-
推广至 Anti-SG游戏
定义:决策集合为空的游戏者赢。其余规则与SG游戏相同。
-
SJ定理:
先手必胜当且仅当:
- 游戏的SG函数不为0,且游戏中某个单一游戏的SG函数值大于1
- 游戏的SG函数为0, 且没有某个单一游戏的SG函数大于1
各种练习题啦!
A Funny Game POJ2484《挑战程序设计竞赛1》P307
Euclid’s Game POJ2348《挑战程序设计竞赛1》P309
//其他还有《挑战程序设计竞赛1》P305 318
可能下期会将的内容(?)
-
关于 Nim游戏与SG函数 的一点研究:Multi-SG、Every-SG、树的删边游戏、无向图的删边游戏、Fusion Principle
-
博弈与概率论:囚徒困境、纳什均衡、智猪博弈
-
二维Nim与Nim积