写在前面:很早之前我就想写一写博弈论的学习记录了。本篇文章记录了我在学习博弈论初步时的顺序,现在网络上的博弈论资料大多都是从SG函数开始讲解,而我谜一样的学习方法让我对博弈论初步有了不同的理解过程,所以我是从NIM游戏这个例子开始的。
Nim游戏
Nim游戏是博弈论中最经典的模型(之一),它又有着十分简单的规则和无比优美的结论 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下为ICG)。
条件
满足以下条件的游戏是ICG(可能不太严谨):1、有两名选手;2、两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限的合法移动集合中任选一种进行移动;3、对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作、以前的任何操作、骰子的点数或者其它什么因素; 4、如果轮到某名选手移动,且这个局面的合法的移动集合为空(也就是说此时无法进行移动),则这名选手负。根据这个定义,很多日常的游戏并非ICG。例如象棋就不满足条件3,因为红方只能移动红子,黑方只能移动黑子,合法的移动集合取决于轮到哪名选手操作。
以上内容来自百度百科
简单的一个Nim游戏的例子:
现在共有N堆石子,每堆石子分别有a1,a2,a3...an个,现在两名玩家轮流取石子,一次可以取一堆石子当中的任意数量(可以取完,但不能不取),无法取走石子时,当前玩家判负。
比方说:
现在有: 1 2 3这三堆石子,甲 乙 两名玩家,甲先手
甲可以直接取完第一堆石子,乙取完第二堆,然后甲再取完第三堆。乙不能取,判负。
甲可以直接取完第一堆,但乙只取第二堆中的一个,甲再取第三堆中的两个,乙这是只能取走两堆当中的任意一个,甲取走最后一个。乙不能取,判负。
解决办法:
将每堆石子用二进制表示:如3 7 5 6表示为 0011 0111 0101 0110四个数字
然后将它们异或起来:
0011^0111^0101^0110=0111
假设所有石子都取完了,那么他们异或起来为:
0000^0000^0000^0000=0000
对于0011^0111^0101^0110=0111这种情况,如果能够通过一种取法,使得剩下的所有数异或起来等于零,而且对于所有数异或起来不为零这种情况,只要取,就一定会变成异或起来不为零的情况,那么我就是必胜的。
你在说什么?
意思就是:我的回合,在当前局面下,我可以留给你一个异或起来等于零的局面,而你不能给我留一个异或起来等于零的局面,那么在值逐步减小的回合当中,留给你的只能是每堆石子都为0的局面。
接下来就是怎么去证明对吧:
设当前局面为a1,a2,a3...an。且a1^a2^...^an=x(异或起来不为0的情况),其中最大值为ai
那么原式可表示为ai^y=x。此时,x和ai的最高位肯定都为1,那么ai^x肯定小于ai,那么我们一定可以用一种取法,使得ai变成ai^x,则取走石子之后,当前局面异或和为0。
若a1^a2^a3^...^an=0
那么无论取走任意一堆的任意数量,都会带来当前这堆石子数量二进制的位的改变,从而导致全局异或起来不为0
那么久满足了我们之前所说的条件,从而得到结论:
对于任意一个局面A{a1,a2,a3,a4,...,an}若a1^a2^a3^...^an的值不为零,则先手必胜
若a1^a2^a3^..^an的值为零,则先手必败。
我们再在这个简单粗暴的结论上衍生一下:
SG函数(Sprague-Grundy)
我们定义一个对于集合的操作mex,这个操作要找到最小的不属于该集合的非负整数。
如:mex{0,1,2}=3,mex{1,2,3}=0,mex{0,1,3}=2;
那么定义SG(x)=mex(S),其中S是x的后继状态的集合。
对于NIM游戏的任意一堆,把它视作一个独立的游戏,那么对于一个数量为10的石子堆来说,它的后继状态有{0,1,2,...,9}共10种(不能不取石子),那么SG(a10)=10,
SG定理
游戏和的SG函数等于各个游戏SG函数的Nim和。
证明:同NIM游戏相同,当每个单独游戏的函数值为0时,当前局面为必败局面,所以SG函数的异或和为0
因为S是当前游戏的后继状态集合,那么小于SG函数的任意值都可以通过一种方式去得到。
如:NIM游戏当中,对于10这个单独游戏来说,后继状态为从0到9,都可以通过一种取法得到。
SG函数和NIM游戏可以具有相同的失败或胜利条件,就可以用NIM游戏相同的办法去证明SG定理。
SG定理的应用
有向图博弈:
在一个有向图中,有n枚棋子,两名玩家轮流移动棋子一次,一次能移动任意一个棋子的一步,无法移动的人判负。
看起来在有向图当中,SG函数不是那么好定义了
设有向图终点的状态为0,那么倒着来处理获得每个点的后继状态集合(这难道是。。。拓扑排序!!!)
也就是用拓扑排序从终点开始,逆着有向边进行拓扑排序,当前结点出队时,便可计算这个结点的SG函数值了。
对于一个有向图博弈的局面,只需要用拓扑排序求出当前局面所有棋子的SG函数,再根据SG定理,就可以知道这个局面是必败还是必胜了。