博弈之Nim浅谈

博弈论应该算是一门独立的学问吧,它是现代数学不断进步的产物,是运筹学中重要的一部分。作为一个计算机科学与技术专业的学生,在这里谈论这高深的“博弈”二字实有不妥,所以,讲的不好的地方请多见谅。

  • Nim的游戏规则(问题描述):有N堆物品,每堆有M[i](1 <= i <= N)个物品,两个人轮流从任意一堆上取任意多的物品,最后取光者胜。两人都采取最优策略,问,是先手赢还是后手赢?

  • 定理(亦是结论):如果M[1] xor M[2] xor M[3] xor …… xor M[N] == 0,那么先手输,否则先手赢。(xor是位运算中的抑或操作)

在这里,我主要是讲解Nim Game中上述定理的推导证明,因为这是我一开始很难理解的地方,而且网上也不容易找到这个定理的详细推导证明的过程。


推导过程(定理证明):

N堆物品的情况太复杂了,我们首先来考虑一些简单的情况。
1.M[1] == M[2] && M[1] == M[3] && …… && M[1] == M[N],这种特殊情况下,若N为奇数,肯定是先手必赢,N为偶数时先手必输,原因是:当N=1时,先手必赢;N等于2时,先手必输,因为先手只能做这样的操作(a,a)==> (a,b),a > b >=0,当b==0时,后手就赢了,否则后手可以将状态转换成(b,b);当N为3时,可以直接转换成(a,a)这种情况,以此类推。当然,这个例子只是作为一个启发,然后可以对应着上面的定理来看,或许能有一些感觉。
2.N == 1 && M[1] != 0的情况(其实也就是其它N - 1堆物品的数量均为0),这种情况下,先手只要一次性把所有的物品取完,那么就赢了。
3.N == 2 && M[1] == M[2] && M[1] != 0(其实也就是其它N - 2堆物品的数量均为0),这种情况是先手输。为什么呢?不论先手取多少,后手只要在另外的一堆物品中取的物品的数量和他相等,最终肯定会变到情况2,然后这时该后手取物品,那么后手就赢了。
4.N == 2 && M[1] != M[2] && M[1] != 0 && M[2] != 0, 这种情况是先手赢。因为先手可以把这个状态转移到情况3,然后就赢了。

我们来分析上述四种情况和定理之间的关系。
情况1,先手输,M[1] xor M[2] xor …… xor M[N] == 0,N为偶数时,
先手赢,M[1] xor M[2] xor …… xor M[N] == 0,N为奇数时。
情况2,先手赢。M[1] != 0.
情况3,先手输。M[1] xor M[2] == 0.
情况4,先手赢。M[1] xor M[2] != 0.

我们再来考虑一下N == 3(就是有3堆物品的数量不为0,其余全为0)的情况。

5.N == 3 && M[1] xor M[2] xor M[3] != 0 && M[1] != 0 && M[2] != 0 && M[3] != 0,这种情况下我们一定会有方法到达下面的第6种情况或者第3种情况的。
6.N == 3 && M[1] xor M[2] xor M[3] == 0 && M[1] != 0 && M [2] != 0 && M[3] != 0,这种情况下肯定没有任何两堆物品的数量是相等的。假如M[1] == M[2], 那么M[1] xor M[2] == 0,0 xor 任何数是等于这个数的,所以和之前的条件肯定矛盾了。而且,此时你若从任何一堆物品中取走K个物品,肯定会有M[1] xor (M[2] - k) xor M[3] != 0(若在第2堆物品中取)。所以,这种情况要么是到达第4中情况,要么是到达第5种情况,而最终肯定会到达第4种情况的。所以,第5种情况先手赢,第6种情况先手会输。

我们从N == 2推导到了N == 3,那么只要你不嫌复杂,你肯定能从N == 3推导到N == 4的。我们可以一直推导到N很大的情况下。


PS:我并没有讲什么P点和N点。因为我觉得从P点和N点的角度,可能不太是那么容易讲清楚,可能是自身理解的问题吧。在上述的推导过程中,P点即是败点,N点即是胜点。意思就是,若先手的初始位置在N点,则先手肯定有办法赢;若先手的初始位置在P点,则后手肯定会有办法赢的。

其中,还有关于P点和N的三个简单却十分重要的属性:

  • 所有的终结点均是P点。
  • 对于任意的N点,至少会有一种方法进入P点。
  • 无论如何操作,P点只能进入N点。

所以,在回头去看前面的推导过程,我们就会很轻松了。

下面是我学习博弈的时候的主要参考的资料,很感谢他们,写的很好,收获很多。
http://www.cnblogs.com/kuangbin/archive/2011/08/28/2156426.html
里面有杭电的PPT,去找找看吧,真心觉得不错。


非常感谢热心的朋友给我指出错误,已经更正,thanks。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值