目标:讲清楚,这几种常见的博弈模型,通过枚举,游戏的方式进行具体的实现。
课堂,可以多做点博弈的游戏,弄清楚游戏规则,根据游戏规则启发兴趣,进行原理讲解。
博弈理论是研究决策者之间相互作用的数学和逻辑理论。在博弈理论中,决策者被称为“玩家”,他们通过制定策略来最大化自身利益。以下是博弈理论的一些基础知识:
1. 游戏的基本元素
- 玩家(Players):参与博弈的个体或实体,他们做出决策以影响游戏的结果。
- 策略(Strategies):玩家的行动方案或决策方法,用于选择在某个给定情境下应该采取的动作。
- 支付(Payoffs):每个玩家根据游戏的结果获得的利益或收益。
2. 不同类型的博弈
- 零和博弈(Zero-sum games):玩家的利益完全对立,一个玩家的收益必然导致其他玩家的损失,总收益为零。例如,棋类游戏中的绝对胜负。
- 非零和博弈(Non-zero-sum games):玩家之间的利益并不总是完全对立,他们可以通过合作获得更多的收益。合作和竞争并存,总收益不一定为零。
3. 博弈的形式
- 正式博弈(Formal games):具有清晰规则和参与者的博弈,常常通过数学模型描述。
- 非正式博弈(Informal games):缺乏明确规则的博弈,例如在现实生活中的互动与竞争。
4. 解决方案和策略
- 纳什均衡(Nash Equilibrium):在博弈中,如果每个玩家的策略选择都是其他玩家策略选择的最佳响应,那么这种情况下就存在纳什均衡。在纳什均衡下,没有玩家愿意单方面改变策略以获得更好的结果。
- 支配策略(Dominant Strategy):对于某个玩家而言,无论其他玩家采取什么策略,都存在一种策略可以使其获得更好的收益。
5. 应用领域
- 经济学:博弈理论在经济学中被广泛应用,用于研究市场竞争、拍卖、价格形成等。
- 计算机科学:博弈理论用于人工智能领域,如设计算法以优化决策过程。
- 生物学:博弈理论用于研究生物进化中的合作与竞争现象。
经典的博弈问题:
1.巴什博弈(Bash Game): 一堆n个物品,两个人轮流从中取出1-m个,最后去光者胜利(不能继续取的人输)。同余定理:n=k*(m+1)+r,先者拿走r个,那么后者无论拿走1-m个,先者只要的数目的和是m+1,那么先手必赢。反之,那么后手无论怎么样都会输。
枚举一下:
n | m | 先手 | 后手 |
12 | 1 | 输 | 赢 |
12 | 2 | 输 | 赢 |
12 | 3 | 输 | 赢 |
12 | 4 | 赢 | 输 |
12 | 5 | 输 | 赢 |
12 | 6 | 赢 | 输 |
12 | 7 | 赢 | 输 |
12 | 8 | 赢 | 输 |
12 | 9 | 赢 | 输 |
12 | 10 | 赢 | 输 |
12 | 11 | 输 | 赢 |
证明:
-
n≤m+1 时
若 n=m+1 那么先手取完后剩下的物品数范围是 [1,m] ,后手可以直接取完胜利
若 n≤m那么先手直接取完就能胜利
-
若 n≤k(m+1) 时命题成立
那么 k(m+1)<n≤(k+1)(m+1) 时
若 n=(k+1)(m+1)那么先手取完后剩下的物品数范围是 [k(m+1)+1,k(m+1)+m]后手可以正好取到 k(m+1) ,由假设得先手必败
若 n<(k+1)(m+1) 那么先手可以取到 k(m+1) ,由假设得此时后手必败先手必胜
if (n % (m + 1)) return false;
else return true;
2.斐波那契博弈(Fibonacci Nim Game)
一堆石子有n个,两人轮流取,先取者第一次可以取任意多个,但是不能取完,以后每次取得石子数不能超过上次取子数量得二倍,取完者胜利。
同样是一个规律,先手胜当且仅当n不是斐波那契数。
int f[200000]; //初始化一个数组
f[0] = f[1] = 1; //斐波那契数组得前两个数组
for (int i = 0; f[i - 1] < n; i++)
{
f[i] = f[i - 1] + f[i - 2]; //利用滚动数组进行不停的迭代计算
if (f[i] == n) return true; //如果n是斐波那契数就应该返回正确
}
return false; //否则返回错误
3.威佐夫博弈(Wythoff Game)
有两堆各若干物品,两个人轮流从任意一堆中至少取出一个或者从两堆中取出同样多的物品,规定每次至少取一个,至多不限,最后取光者胜。
这里的必输局势:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。
我们会发现,每种奇异局势的第一个值(这里假设第一堆数目小于第二堆的数目)总是等于当前局势的差值乘上1.618.
从这些必输局势可以发现,每组的第一个是前面没有出现的最小正整数,ak=[k∗(1+5–√)/2], bk=ak+k, k=0,1,2,3...。
所以,先求出差值,差值*黄金分割比 == 最小值的话后手赢,否者先手赢。
double r = (sqrt(5) + 1) / 2;
int d = abs(a - b) * r;
if (d != min(a, b)) return true;
else false;
另外一种证明方法:
我们可以将两堆石子看成是棋盘上一个点的横纵坐标,那么游戏就变成了:棋盘上有一个点,每次每人只能将棋子往左或往下移动任意个格子或往左下移动任意个格子,不能移动的人输。终止节点显然是(0,0)(0,0),我们将能一步到达(0,0)(0,0)的点都染色,那么这些点就都是必胜态,再找到横纵坐标之和最小的没被染色的点,这个点就是下一个必败态,由此就能画出上图。
4.尼姆博弈(Nimm Game)
课堂游戏导入:两个人轮流取硬币;每次取硬币只能从同一行中取出,枚数不限,但至少要取一枚;取走最后一枚硬币的是赢家。
可以想一想如何能够取胜。
有n堆物品,两人轮流取,每次取某堆中不少于1个,最后取完者胜。
假如有3堆物品(a,b,c) (0,0,0)状态时先手是一个必输局势因为没有东西可取,(0,n,n) 状态时也是必输局势只要后者在另一堆取得物品与前者一样多时那么前者也就是必输局势。慢分析(1,2,3)也是一个必输局势。如果我们将其转化为二进制形式并通过异或运算(^)我们会发现:
0001^0010^0011=0000
通过验证所有的堆数量累^后只要为0就都是必输局势,所以我们就只要记住这个规则:将n堆物品数量全部异或后结果为0先手必败,否则必胜。
int res = 0;
for (int i = 1; i <= n; i++)
res ^= arr[i];
if (res) return true;
else return false;
参考:
简单易懂的博弈论讲解(巴什博弈、尼姆博弈、威佐夫博弈、斐波那契博弈、SG定理) - The_Virtuoso - 博客园 (cnblogs.com)