Game Theory In Competitive Programming|Part1
在算法竞赛中,博弈论是一个经常出现的题目类型。通常是两个人在给定规则下,每个人都按照最优策略进行博弈,我们的任务是找出获胜者。这通常是贪心算法、动态规划等算法的混合。下面,将对博弈论中的一些经典问题进行讨论。
在这里,我们讨论的是博弈游戏中的一类,即能够找到必胜策略的博弈。
并分析它的通用策略是什么?
Bash game
巴什博弈是一个简单的游戏,我们将通过分析这个游戏来引出我们分析博弈游戏的通用策略
让我们考虑这样一个游戏:
题目:
最初有一堆数量为 15 15 15的石子,选手甲、乙交替操作,每次操作需要从石子堆中拿走不超过 3 3 3个石子。
甲先手操作,取走最后一个石子的选手获胜。请问最终谁获胜?
分析:
没错,这是一个有必胜策略的游戏。
如果必胜策略不明显的话,不妨手动写出所有的状态来观察规律。
(这是一种常用的解决博弈问题的手段)。
下图为当先手操作时,面对特定的石子数量的时候,游戏最终的结果:
(L:Lose,W:Win)。
石子个数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
最终结果 | L | W | W | W | L | W | W | W | L | W | W | W | L | W | W | W |
结论:
不难观察出,当石子个数被 4 4 4整除的时候,先手必败,否则先手必胜。
这是为什么呢?
是因为,几乎所有具有必胜策略的游戏,都遵守两条关于必胜态,必败态的准则:
- 如果当前状态能转移到必败态,当前状态是必胜态。
- 如果当前状态只能转移到必胜态,当前状态是必败态。
我们能知道的是, 0 0 0是一个必败态。而先手能一次拿走 1 ∼ 3 1\sim3 1∼3个石子。
故当石子个数为 1 1 1、 2 2 2、 3 3 3的时候,
这三个状态能转移到必败态,所以它们是必胜态。
于是我们可以抽象出一张图:(黑色是必败点,粉色是必胜点)。
现在我们将题目改的更普通一点还能得到必胜策略吗?
题目:
最初有一堆数量为 N N N的石子,选手甲、乙交替操作,每次操作需要从石子堆中拿走不超过 k k k个石子。
甲先手操作,取走最后一个石子的选手获胜。请问最终谁获胜?
必胜策略:
如果石子的个数是 ( k + 1 ) (k+1) (k+1)的整数倍,说明先手必败,否则先手必胜。
我们依然能通过画图列表来得到这个结论。
这说明它们是博弈游戏中通用的观察必胜策略的手段。
现在我们考虑另一个游戏来试验这种分析手段是否可行:
题目:
最初有一堆数量为 8 8 8的石子,选手甲、乙交替操作,每次操作可以从石子堆中拿走数量为 x x x的石头,
x x x是当前石子数量的约数,且小于当前石子数量。
甲先手操作,无法取石头的人输。请问最终谁获胜?
分析:
石头数量 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
最终结果 | L | W | L | W | L | W | L | W |
通过列表的方法,我们发现了这样的结论:当石头个数为奇数,先手必败,否则先手必胜。
Nim game
Nim游戏是博弈游戏中的一个重要角色,因为它和其他很多博弈有着相同的特性。
甚至能用相同策略进行解决,我们将重点讨论Nim游戏,Nim游戏的策略推广到其他博弈。
题目:
最初有 n n n堆石子,第 i i i堆石子最初有 x i x_i xi个。
A l i c e 、 B o b Alice、Bob Alice、Bob轮流操作,每次操作可以选择拿走一堆石子中取任意数量的石子(至少为 1 1 1)。
无法取石子的玩家输掉比赛。
这也是一个具有必胜策略的游戏。
结论:
设每一堆石子最初的数量异或和为: s s s ( s = x 1 ⨁ x 2 ⨁ . . . ⨁ x n ) (s=x_1\bigoplus x_2\bigoplus...\bigoplus x_n) (s=x1⨁x2⨁...⨁xn)。
当 s = 0 s=0 s=0的时候,先手必败,否则先手必胜。
分析:
不妨设 W W W是必胜态, L L L是必败态。
根据之前说的理论:
- 如果当前状态能转移到必败态,当前状态是必胜态。
- 如果当前状态只能转移到必胜态,当前状态是必败态。
需要验证 N i m g a m e Nim \:game Nimgame的结论是否符合上述理论:
1、当 s = 0 s=0 s=0时,拿走任意一堆的任意数量的石头,都会使得 s ≠ 0 s\neq0 s=