博弈论又被称为对策论(Game Theory),既是现代数学的一个新分支,也是运筹学的一个重要学科。博弈论主要研究公式化了的激励结构间的相互作用,是研究具有斗争或竞争性质现象的数学理论和方法。博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。
举例:囚徒困境
囚徒困境的故事讲的是,两个嫌疑犯小A、小B作案后被警察抓住,分别关在不同的屋子里接受审讯。警察知道两人有罪,但缺乏足够的证据。警察告诉每个人:如果两人都抵赖,各判刑一年;如果两人都坦白,各判五年;如果两人中一个坦白而另一个抵赖,坦白的放出去,抵赖的判十年。
于是,每个囚徒都面临两种选择:坦白或抵赖。
有四种可能:
1.两人都招供,各判五年
2.两人都不招供,各判一年
3.小A招供小B不招供,小A释放小B判十年
4.小B招供小A不招供,小B释放小A判十年
现假设你是小A,在不和小B商量的情况下,作为小A的你是选择招供坐牢5年或0年,还是会选择抵赖坐牢10年或1年呢?
只要两名囚徒都是自私且理性的,那么双方都会同时选择招供,结果就是双方各判5年。
在这个场景中,双方都无法单方面改变自己的博弈策略(单方面改变只会让自己蒙受损失),使得局面进入了一个微妙而又稳定的平衡,这个平衡被称为纳什均衡。
ICG博弈(公平组合博弈)
所讨论的博弈问题满足以下条件:
(1)只有两人参与。
(2)游戏局面的状态集合是有限。
(3)对于同一个局面,两个游戏者的可操作集合完全相同
(4)游戏者轮流进行游戏。
(5)当无法进行操作时游戏结束,此时不能进行操作的一方算输。
(6)无论游戏如何进行,总可以在有限步数之内结束
取石子游戏:取石子游戏是一个古老的博弈游戏,发源于中国,它是组合数学领域的一个经典问题。它有许多不同的玩法,基本上是两个玩家,玩的形式是轮流抓石子,胜利的标准是抓走最后的石子。玩家设定: 先取石子的是玩家A(先手A),后取石子的是玩家B(后手B)。
经典的三种玩法
一、巴什博奕(Bash Game)
二、尼姆博奕(Nimm Game)
三、威佐夫博奕(Wythoff Game)
一、巴什博奕(Bash Game)
1堆n个石子每次最多取m个、至少取1个
Case 1:
如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后手必胜。
Case 2:
如果n=(m+1)*r+s,(r为任意自然数,s≤m),那么先取者第一轮要拿走s个物品,如果后者拿走k(1≤k≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先手必胜。
Case 3:
如果n=r*(m+1),先手拿走k(1≤k≤m)个,那么后手再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,则后手胜,先手必败。
总之,只要保持给对手留下(m+1)的倍数,就能最后获胜。称(m+1)的局面为奇异局势(面对当前局势,先手必输的局势为奇异局势)。
二、尼姆博奕(Nimm Game)
有n堆石子,每堆石子的数量是a1,a2,a3……,二个人依次从这些石子堆中的一个拿取任意的石子,至少一个,最后一个拿光石子的人胜利
Case 1:
如果n=1: 先手全拿,先手必胜。
Case 2:
如果n=2:有两种情况:
①两堆石子数量相同
(m,m) 先手拿其中一堆的k个,后手拿另一堆的k个,后手必胜。
②两堆石子数量不同
(m,M)先手先从多的一堆中拿出(M-m)个,此时后手面对(m,m)的局面,先手必胜。
Case 3:
如果n=3且(m,m,p)先手可以先拿p,之后变成后手面对(m,m)的局面,先手必胜
称(m,m)的局面为奇异局势
Case 4:
对于更一般的可能,比如(a,b,c,d),规律总结:
a,b,c,d异或和的结果为0,后手必胜
a,b,c,d异或和的结果不为0,先手必胜
例题:
小明的游戏1
t = int(input()) for _ in range(t): n = int(input()) a = list(map(int,input().split())) ora = 0 for j in a: ora ^= j if ora != 0: print("NO") else: print("YES")
三、威佐夫博奕(Wythoff Game)
有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
举一个例子:局势是(1,2),先手有四种取法,无论先手怎么取,后手都能胜利,也就是说(1,2)是奇异局势。
对于一些先手必输的局势:
- 第一种(0,0)
- 第二种(1,2)
- 第三种(3,5)
- 第四种 (4 ,7)
- 第五种(6,10)
- 第六种 (8,13)
- 第七种 (9 ,15)
- 第八种 (11 ,18)
总结规律如下:
两堆差值是递增的,0 1 2 3 4 5 6 7 ...
第n种局势(a,b):a = ((b-a)*1.618向下取整) 时,先手必输
注:对于精度要求高的题目:1.618 = (sqrt(5.0) + 1) / 2