论博弈论:手把手教你推公式

1前言

本文将介绍博弈论以及SG函数的定义和应用,最后解决NIM游戏的标准模型
无前置知识,绝对胎教级手把手带你推出结论,而不是直接给出

2什么是博弈论

看官方定义
博弈论,又称为对策论(Game Theory)、赛局理论等,既是现代数学的一个新分支,也是运筹学的一个重要学科。
博弈论主要研究公式化了的激励结构间的相互作用,是研究具有斗争或竞争性质现象的数学理论和方法。
博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。
生物学家使用博弈理论来理解和预测进化论的某些结果。
博弈论已经成为经济学的标准分析工具之一。在金融学、证券学、生物学、经济学、国际关系、计算机科学、政治学、军事战略和其他很多学科都有广泛的应用。
我们看看信息学中的博弈论

3通用模型:公平组合游戏
信息学中的博弈论主要研究的对象就是公平组合游戏,简称ICG
什么是公平组合游戏
首先,有两人作为对手
然后,两人轮流行动
游戏有很多可能的局面
在这个局面下的合法操作取决于局面本身,和谁来操作无关
如果无法操作则判定失败

这些有什么用呢
首先就决定了这个游戏不可能平局,在有限次操作内可以分出胜负
然后,假设两人总是做出最优操作,必定有一人有必胜策略
因为最优操作固定了
由此,我们可以把局面分个类
第一种,当前局面下,先手必胜
第二种,当前局面下,先手必败
它们有如下性质
不能操作的局面先手必败
如果一个局面可以转移到先手必败局面,那么它是先手必胜局面,否则为先手必败
有点懵,我来举个例子

4巴什博弈

先看问题
有n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取 m 个。最后取光者得胜。
当m = 2时,只能取一个或两个
可见,先手必胜还是必败取决于n
我们枚举一下
如果目前没有物品,n=0,先手必败
如果目前有1或2个物品,先手必胜,因为可以转移到n=0的局面
如果目前有3个物品,先手必败,只能转到先手必胜的局面
我们发现,好像出现了循环
继续下去,制作表格
先手必胜,n = 1,2,4,5,7,8
先手必败,n = 0,3,6,9
真的循环了,总结一下性质
我们发现,n是3的倍数时先手必败,否则先手必胜
我们来看看应用到游戏里怎么操作
假设n = 20,先手要把n变为3的倍数即必败局面
取走两个,n = 18
此时无论对方取多少,我们只需要凑出3的倍数,就可以始终拿到必胜局面
关键就在一点
怎么让对方拿到必败局面
我们增多m,同理可得凑出m的倍数即可保持必胜

5NIM游戏

假设上面的游戏不限制m,任意取
这样只要n不等于0,先手必胜,那就没意义了
NIM游戏不限制m,但是有若干堆物品,一次只能取一堆里的
这样就难了
假设有n堆物品
如果n = 1,上面说了,只要物品个数不为0,先手都取走,必胜
如果n = 2呢,如果有一堆为0,可转化为n = 1
所以,我们可得出n = 2的一条策略:当另一堆不为0时,不把这一堆全取完
那么{1,1},即两堆各有一个物品就必败了
要想推出{1,1},我们要一堆为1,一堆不为1
这种情况只能为{1,2},因为对面不傻,要拿第二堆肯定拿的剩一个,直接赢
所以第二堆本来就是2
接着推,对面也只能是把{2,2}变成{1,2},因为变成{1,2}就输了,肯定是迫不得已取的第一堆,只能这么做
好像又循环了,我们可以发现,当两堆相同时,无论对面怎么取,我们在另一堆模仿,做相同操作,必赢
所以,n=2时有个性质,两队相同,先手必输,后手必赢
那么反过来,两堆不同,就有先手必赢,先手一步把多的那堆变成和少的那堆一样多,赢了
那如果n再大点呢,就更不好推了,可能的局面更多
太难了我不会,SG函数救救我

6SG函数

定义mex为对于一个集合的运算,求集合最小未出现自然数
如mex{0} = 1,mex{0,1} = 2,mex{1,2} = 0
我们可以把ICG游戏转为有向无环图,每个局面作为节点
假设局面x可以通过一次操作转化为局面y,则x,y之间有一条连边
定义如果不能行动,节点的值为0
SG函数是求每个局面节点的值 = mex{所有子节点}

要学习新知识,要从简单模型开始
巴什博弈启动
依旧简单点,每次最多取两个,即m = 2
那么,列出SG函数值
从0到10依次为
0 1 2 0 1 2 0 1 2 0 1
我们发现,SG函数是循环的,且在巴什博弈中SG(x) = x%(m+1)
而且当SG(x) = 0时,先手必败,否则必胜
好的,问题转化到NIM游戏
易证NIM游戏n = 1时,对于每个自然数s,有SG(s) = s
那么,问题扩展到n = 2
当{2,2}这个状态时,SG函数为几?
显然是0
但是{2}的SG为2啊
n变大时,SG不是简单的相加或是取最值
怎么办
枚举!(此处无序,{1,0}和{0,1}等价)(后面的数为每一堆单独的SG)
{0,0} = 0    0 0
{0,1} = 1    0 1
{0,2} = 2    0 2
{1,1} = 0    1 1
{1,2} = 3    1 2
{2,2} = 0    2 2
聪明的人可能看出来了,这是什么?异或!!!!!!!!
再来一遍(因为c++中的"^"一般表示幂,所以异或使用英文xor)
{0,0} = 0 = 0xor0
{0,1} = 1 = 0xor1
{0,2} = 2 = 00xor10
{1,1} = 0 = 1xor1
{1,2} = 3 = 10xor01
{2,2} = 0 = 10xor10

7NIM游戏的解

上文说了两点
1 n = 1,SG(s) = s
2 两者合并用异或

结合一下,得出正解
把每一堆的值异或就可以了
结论简单,但是得出来的过程很不易,所有人都是先给结论再证明
用着前人的结论,却不知前人的想法,我认为,现有SG,后有NIM游戏正解
你看到这几句话是作者一上午的努力
但是,还是要证明一下的,但是请放心,证明挺好证,分三步
1n个0异或起来就是0,定义出发易证
2设n堆分别为a1,a2,a3......an
设异或值为x
则有x xor a1 xor a2 xor a3......xor an = 0
因为异或的性质,设x二进制有p1位,所有ai必然有至少一个不少于p1位
则ai xor x<ai
所以等式左边的ai减小,必然有这样的操作使异或值变为0
3异或值为0,操作后必定不为0
设ai变为ai'
得到等式ai = ai'(等量代换)
与ai'<ai矛盾
以上三点结合,可满足所有情况
证毕
顺便附一下NIM游戏模板代码

8后记


我们从零开始解决了NIM游戏的难题
发现了许多神奇的性质,研究了SG函数
为以后的博弈论学习打下基础
至此,acwing基础篇数学专题的所有算法讲解完毕,如果感兴趣请到我主页阅读
本文作者是蒟蒻,请各位神犇指点

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值