• Nim游戏(初谈博弈)


     通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,
     合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,
    如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。
    

    *这游戏看上去有点复杂,先从简单情况开始研究吧。
    如果轮到你的时候,只剩下一堆石子,
    那么此时的必胜策略肯定是把这堆石子全部拿完一颗也不给对手剩,然后对手就输了。

    *如果剩下两堆不相等的石子,必胜策略是通过取多的一堆的石子将两堆石子变得相等,
    以后如果对手在某一堆里拿若干颗,你就可以在另一堆中拿同样多的颗数,直至胜利。
    如果你面对的是两堆相等的石子,那么此时你是没有任何必胜策略的,
    反而对手可以遵循上面的策略保证必胜。

    *现在我们如何从两堆的取子策略扩展到任意堆数中呢?

    *首先来回忆一下,每个正整数都有对应的一个二进制数,
    于是,我们可以认为每一堆硬币数由2的幂数的子堆组成。
    这样,含有57枚硬币大堆就能看成是分别由数量为2^5、2^4、2^3、2^0的各个子堆组成。

    *现在考虑各大堆大小分别为N1,N2,……Nk的一般的Nim取子游戏。
    将每一个数Ni表示为其二进制数(数的位数相等,不等时在前面补0):

    N1 = as…a1a0

    N2 = bs…b1b0

    ……

    Nk = ms…m1m0

    如果每一种大小的子堆的个数都是偶数,我们就称Nim取子游戏是平衡的,

    而对应位相加是偶数的称为平衡位,否则称为非平衡位。

    因此,Nim取子游戏是平衡的,当且仅当:

    as + bs + … + ms 是偶数

    ……
    a1 + b1 + … + m1 是偶数

    a0 + b0 + … + m0是偶数

    于是,我们就能得出获胜策略:

    游戏人I能够在非平衡取子游戏中取胜,而游戏人II能够在平衡的取子游戏中取胜。

    *我们以一个两堆硬币的Nim取子游戏作为试验。设游戏开始时游戏处于非平衡状态。
    这样,游戏人I就能通过一种取子方式使得他取子后留给游戏人II的是一个平衡状态下的游戏,
    接着无论游戏人II如何取子,再留给游戏人I的一定是一个非平衡状态游戏,如此反复进行,
    当游戏人II在最后一次平衡状态下取子后,游戏人I便能一次性取走所有的硬币而获胜。
    而如果游戏开始时游戏牌平衡状态,那根据上述方式取子,最终游戏人II能获胜。

    *下面应用此获胜策略来考虑 4堆 的Nim取子游戏。
    其中各堆的大小分别为7,9,12,15枚硬币。
    用二进制表示各数分别为:0111,1001,1100和1111。于是可得到如下一表:
    这里写图片描述
    由Nim取子游戏的平衡条件可知,此游戏是一个非平衡状态的取子游戏,
    因此,游戏人I在按获胜策略进行取子游戏下将一定能够取得最终的胜利。
    具体做法有多种,游戏人I可以从大小为12的堆中取走11枚硬币,使得游戏达到平衡(如下表),
    这里写图片描述
    之后,无论游戏人II如何取子,游戏人I在取子后仍使得游戏达到平衡。
    同样的道理,游戏人I也可以选择大小为9的堆并取走5枚硬币而剩下4枚,
    或者,游戏人I从大小为15的堆中取走13枚而留下2枚。

    所以归根结底,Nim游戏的核心就是判断初始状态是不是平衡状态
    非平衡状态先手必胜,平衡状态后手必胜

  • 相关阅读:
    Cookie和Session的那些事儿
    【IScroll深入学习】解决IScroll疑难杂症
    使用 iscroll 实现焦点图无限循环
    jquery.mobiscroll仿Iphone ActionSheet省市区联动
    mobiscroll之treelist使用
    jQuery.extend 函数详解
    jQuery插件开发精品教程,让你的jQuery提升一个台阶
    用js实现动画效果核心方式
    js特效,加速度,图标跳动
    详解用CSS3制作圆形滚动进度条动画效果
  • 原文地址:https://www.cnblogs.com/wutongtong3117/p/7673588.html
Copyright © 2020-2023  润新知