尼姆博弈(Nimm's Game)

8 篇文章 0 订阅
订阅专栏

尼姆博弈(Nimm's Game)

题型

尼姆博弈模型,大致上是这样的:

有3堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取1个,多者不限,最后取光者得胜。

 
分析
1、首先自己想一下,就会发现只要最后剩两堆物品一样多(不为零),第三堆为零,那面对这种局势的一方就必败
那我们用(a,b,c)表示某种局势,首先(0,0,0)显然是必败态,无论谁面对(0,0,0) ,都必然失败;第二种必败态是(0,n,n),自己在某一堆拿走k(k ≤ n)个物品,不论k为多少,对方只要在另一堆拿走k个物品,最后自己都将面临(0,0,0)的局势,必败。仔细分析一下,(1,2,3)也是必败态,无论自己如何拿,接下来对手都可以把局势变为(0,n,n)的情形
那这种奇异局势有什么特点呢?
也不知谁这么牛逼,竟然能把这种局势和二进制联系在一起
这里说一种运算符号, 异或'^',a^b=a'b+ab'(a'为非a)
 
我们用符号XOR表示这种运算,这种运算和一般加法不同的一点是1 XOR 1 = 0。先看(1,2,3)的按位模2加的结果:
1 = 二进制01
2 = 二进制10
3 = 二进制11  XOR
———————
0 = 二进制00 (注意不进位)
 
对于奇异局势(0,n,n)也一样,结果也是0
任何奇异局势(a,b,c)都有a XOR b XOR c = 0
 
如果我们面对的是一个非必败态(a,b,c),要如何变为必败态呢?
假设 a < b < c,我们只要将 c 变为a XOR b,即可。因为有如下的运算结果:
a XOR b XOR (a XOR b)=(a XOR a) XOR (b XOR b) = 0 XOR 0 = 0
要将c 变为a XOR b,只要对 c进行 c-(a XOR b)这样的运算即可
 
2、尼姆博弈模型可以推广到:有n堆若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
这个游戏中的变量是堆数k和各堆的物品数N1,N2,……,Nk。
对应的组合问题是,确定先手获胜还是后手获胜以及两个游戏人应该如何取物品才能保证自己获胜
 
3、为了进一步理解Nim取物品游戏,我们看看特殊情况。
如果游戏开始时只有一堆物品,先手则通过取走所有的物品而获胜。现在设有2堆物品,且物品数量分别为N1和N2。游戏者取得胜利并不在于N1和N2的值具体是多少,而是取决于它们是否相等。
也就说两堆的策略我们有了,现在我们如何从两堆的取子策略扩展到任意堆数中呢?
 
首先回忆一下,每个正整数都有对应的一个二进制数,例如:57(10) = 111001(2) ,即:57(10)=25+24+23+20。于是,我们可以认为每一堆物品数由2的幂数的子堆组成。这样,含有57枚物品大堆就能看成是分别由数量为25、24、23、20的各个子堆组成
 
现在考虑各大堆大小分别为N1,N2,……Nk的一般的Nim博弈。将每一个数Ni表示为其二进制数(数的位数相等,不等时在前面补0):
N1 = as…a1a0
N2 = bs…b1b0
……
Nk = ms…m1m0
如果每一种大小的子堆的个数都是偶数,我们就称Nim博弈是平衡的,而对应位相加是偶数的称为平衡位,否则称为非平衡位。因此,Nim博弈是平衡的,当且仅当:
as +bs + … + ms 是偶数,即as XOR bs XOR … XOR ms  = 0
……
a1 +b1 + … + m1 是偶数,即a1 XOR b1 XOR … XOR m1 = 0
a0 +b0 + … + m0是偶数,即a0 XOR b0 XOR … XOR m0 = 0
  
于是,我们就能得出尼姆博弈中先手获胜策略:
Bouton定理先手能够在非平衡尼姆博弈中取胜,而后手能够在平衡的尼姆博弈中取胜。即状态(x1, x2, x3, …, xn)为P状态当且仅当x1 xor x2 xor x3 xor … xor xn =0。这样的操作也称为Nim和(Nim Sum)
我们以一个两堆物品的尼姆博弈作为试验。设游戏开始时游戏处于非平衡状态。这样,先手就能通过一种取子方式使得他取子后留给后手的是一个平衡状态下的游戏,接着无论后手如何取子,再留给先手的一定是一个非平衡状态游戏,如此反复进行,当后手在最后一次平衡状态下取子后,先手便能一次性取走所有的物品而获胜。而如果游戏开始时游戏牌平衡状态,那根据上述方式取子,最终后手能获
 
下面应用此获胜策略来考虑4堆的Nim博弈。其中各堆的大小分别为7,9,12,15枚硬币。用二进制表示各数分别为:0111,1001,1100和1111
于是可得到如下一表:

 由Nim博弈的平衡条件可知,此游戏是一个非平衡状态的Nim博弈,因此,先手在按获胜策略一定能够取得最终的胜利。具体做法有多种,先手可以从大小为12的堆中取走11枚硬币,使得游戏达到平衡(如下表)

之后,无论后手如何取子,先手在取子后仍使得游戏达到平衡

同样的道理,先手也可以选择大小为9的堆并取走5枚硬币而剩下4枚,或者,先手从大小为15的堆中取走13枚而留下2枚
归根结底, Nim博弈的关键在于游戏开始时游戏处于何种状态(平衡或非平衡)和先手是否能够按照取子游戏的获胜策略来进行游戏
当堆数大于2时,我们看出Bouton定理依旧适用,下面用数学归纳法证明
  
证明:如果每堆都为0,显然是P状态(必败)。下面验证P状态和N状态的后两个递推关系:
一、每个N状态都可以一步到达P状态。
证明是构造性的。检查Nim和X的二进制表示中最左边一个1,则随便挑一个该位为1的物品堆Y,根据Nim和进行调整(0变1,1变0)即可。例如Nim和为100101011,而其中有一堆为101110001。为了让Nim和变为0,只需要让操作的物品数取操作前的物品数和Nim的异或即可
显然操作后物品数变小,因此和合法的。设操作前其他堆的Nim和为Z,则有Y xor Z = X。操作后的Nim和为X xor Y xor Z = X xor X = 0,是一个P状态
二、每个P状态(必胜态)都不可以一步到达P状态
由于只能改变一堆的物品,不管修改它的哪一位,Nim的对应位一定不为0,不可能是P状态。
这样就证明了Bouton定理
 
实际解决
Nim博弈中如果规定最后取光者输,情况是怎样的?
初看起来问题要复杂很多(因为不能主动拿了,而要“躲着”拿,以免拿到最后一个物品),但对于Nim游戏来说,几乎是一样的:
首先按照普通规则一样的策略进行,直到恰好有一个物品数大于1的堆x。在这样的情况下,只需要把堆x中的物品拿得只剩1个物品或者拿完,让对手面临奇数堆物品,这奇数堆物品每堆恰好1个物品。这样的状态显然是必败的。由于你每次操作后需要保证Nim和为0,因此不可能在你操作后首次出现“恰好有一个物品数大于1的堆”。新游戏得到了完美解决
 

Being a Good Boy in Spring Festival

 

Problem Description
一年在外 父母时刻牵挂
春节回家 你能做几天好孩子吗
寒假里尝试做做下面的事情吧

陪妈妈逛一次菜场
悄悄给爸爸买个小礼物
主动地 强烈地 要求洗一次碗
某一天早起 给爸妈用心地做回早餐

如果愿意 你还可以和爸妈说
咱们玩个小游戏吧 ACM课上学的呢~

下面是一个二人小游戏:桌子上有M堆扑克牌;每堆牌的数量分别为Ni(i=1…M);两人轮流进行;每走一步可以任意选择一堆并取走其中的任意张牌;桌子上的扑克全部取光,则游戏结束;最后一次取牌的人为胜者。
现在我们不想研究到底先手为胜还是为负,我只想问大家:
——“先手的人如果想赢,第一步有几种选择呢?”
 
Input
输入数据包含多个测试用例,每个测试用例占2行,首先一行包含一个整数M(1<M<=100),表示扑克牌的堆数,紧接着一行包含M个整数Ni(1<=Ni<=1000000,i=1…M),分别表示M堆扑克的数量。M为0则表示输入数据的结束。
 
Output
如果先手的人能赢,请输出他第一步可行的方案数,否则请输出0,每个实例的输出占一行。
 
Sample Input
3
5 7 9
0
 
Sample Output
1
 
分析:由上分析第1点可知,只要对 c进行 c-(a XOR b)这样的运算即可
代码如下:
# include<stdio.h>
int main()
{
    int nPile,i,sum,cnt;
    int p[105];
    while(scanf("%d",&nPile)&&nPile)
    {
        cnt=0;
        sum=0;
        for(i=0;i<nPile;i++)
        {
            scanf("%d",&p[i]);
            sum^= p[i];
        }
        for(i=0;i<nPile;i++)
        {
            if(p[i]>(sum^p[i]))//注意'^'的优先级小于'>'
                cnt++;
        }
        printf("%d\n",cnt);
    }
    return 0;
}


原文出处:http://www.cnblogs.com/jiangjun/archive/2012/11/01/2749937.html


基本博弈论(巴什博弈+威佐夫博弈+尼姆博弈+一些自己的注释)
08-08
大家一起学~免费啦~
Nim游戏
qq_39053247的博客
03-20 884
题目:一共有n堆石子,编号1-n,第i堆中有ai个石子,每一次操作A和B可以从任意一堆石子中取出任意数量的石子,至少取一颗,至多取出这一堆剩下的所有石子,两人轮流行动,取光所有石子的一方获胜,A先动手,给定a,假设两人都采取最优策略,谁会获胜 描述:对数组中的每个数进行异或,异或之后如果最终结果是0,那么先拿的就输了,如果结果不是0,那么先拿的就赢了, public class Main{ ...
尼姆博弈(所有类型分析)
最新发布
weixin_74088105的博客
07-12 1438
有n堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
尼姆博弈Nimm‘s Game
Sean的博客
05-01 1818
定义有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。 尼姆和:把所有堆中物体的个数进行异或运算 如:n堆物品, 每堆物品个数分别为a[1] a[2]…a[n], 尼姆和=a[1]^a[2]^…a[n] 规则及PN态: 1.取光人的获胜 当尼姆和==0时必败 面临非必败态时采取的策略: 假设 a &amp;amp;amp;amp;lt; b &amp;amp;amp;amp;lt; c,只要将 c...
尼姆博弈与贪心改版尼姆博弈 沙堆最优策略
m0_59206144的博客
09-30 439
尼姆博弈是一个两人博弈,2名玩家轮流从n堆物品中拿取一定数量(最小值1最大值全部)的物品,每次拿取时先选择某一堆,再从中拿取任意数量个物品,至少拿1个,至多将这一堆物品全部拿走,不能不拿。拿到最后一个物品的玩家获胜。这种题一般不要模拟不要模拟不要模拟(根本模拟不了),所以我们需要在写代码前用数学进行分析和优化。
数学知识——博弈论(巴什博奕、尼姆博奕、威佐夫博奕)思路及例题
热门推荐
WSY444的博客
06-23 4万+
争先恐后地博弈
尼姆博弈 PPT
05-26
感觉挺不错的一个 PPT,适合入门看看,高手绕行。
聪明模式尼姆游戏.py
04-29
聪明的尼姆游戏,Python代码的实现 尼姆游戏是个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,...
博弈论课件
09-12
在这个"博弈论课件"中,我们主要会探讨三个经典的博弈论模型:巴什博奕(Nim Game)、威佐夫博弈(Wythoff's Game)以及尼姆博弈Nim Game)。 首先,巴什博奕,也称为"取石游戏",是博弈论中的基础模型之一。在这...
博弈论试题小结
04-15
在本资源中,我们将讨论 three classic games in game theory: 巴什博奕(Bash Game)、威佐夫博奕(Wythoff Game)和尼姆博奕(Nimm Game)。 巴什博奕是指 Yougth 和 Hrdv 玩的一个游戏,拿出 n 个石子摆成一圈,...
博弈论(巴什博奕/尼姆博奕/威佐夫博奕)详解
qq_73635134的博客
03-05 4375
博弈论(巴什博奕/尼姆博奕/威佐夫博奕) 博弈论 ,是经济学的一个分支,主要研究具有竞争或对抗性质的对象,在一定规则下产生的各种行为。博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略 通俗地讲,博弈论主要研究的是:在一个游戏中,进行游戏的多位玩家的策略 对于算法竞赛中的博弈问题,一般具有以下特征: 博弈模型为两人轮流决策的非合作博弈。即两人轮流进行决策,并且两人都使用最优策略来获取胜利 博弈是有限的。即无论两人怎样决策,都会在有限步后决出胜负 公平博弈。即两人进行决策所遵循的规则相同
常见的博弈论专题详解(附有例题)
m0_73557680的博客
05-22 2099
尼姆博弈,威佐夫博弈,巴什博弈
尼姆博奕(Nimm Game
H4ppyD0g的博客
02-15 1447
尼姆博奕 有N堆石子。A B两个人轮流拿,A先拿。每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N及每堆石子的数量,问最后谁能赢得比赛。 假设三堆石子,奇异局势有(0, 0, 0), (0, n, n), (1, 2, 3)等等,每一组的几个数异或起来后为0。 定理:一组自然数中必然存在一个数,它大于等于其它所...
#博弈论 #公平组合游戏(ICG) #尼姆游戏(NIM) 20.09.06
仅仅是笔记。
10-10 2598
博弈论 一、Nim游戏 AcWing 891. Nim游戏 题目 给定n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。 问如果两人都采用最优策略,先手是否必胜。 输入格式 第一行包含整数n。 第二行包含n个数字,其中第 i 个数字表示第 i 堆石子的数量。 输出格式 如果先手方必胜,则输出“Yes”。 否则,输出“No”。 数据范围 1≤n≤105, 1≤每堆石子数≤109 输入样例: 2 2 3 输出样例: Y
Nim(尼姆游戏)
weixin_45108777的博客
10-16 7688
尼姆游戏的规则: 有n堆石子,数量分别是{a1,a2,a3,…,an},两个玩家轮流拿石子,每次从任意一堆中拿走任意数量的石子,拿到最后一个石子的玩家获胜。 尼姆游戏有个极为简单的判断胜负的方法,即做异或运算 (在这之前要了解一下巴什游戏中的P-position和N-position) 定理: 若a1⊕a2⊕a3⊕…⊕an!=0则先手必胜,此时是N-position 若a1⊕a2⊕a3⊕…⊕an=...
(转载)Nim游戏博弈(收集完全版)
lethic的专栏
10-06 3460
Nim游戏的概述: 还记得这个游戏吗? 给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠,但不能在两列中取。最后拿光珍珠的人输。 后来,在一份资料上看到,这种游戏称为“拈(Nim)”。据说,它源自中国,经由被贩卖到美洲的奴工们外传。辛苦的工人们,在工作闲暇之余,用石头玩游戏以排遣寂寞。后来流传到高级人士,则用便士(Pennies),在酒吧柜台上玩。 最有名的玩法,是把十二枚便
博弈论Nim游戏)
ylh的博客
05-31 1870
题目要求:给你 n 堆石子,两个人轮流取石子,每次选择一堆,可以取出这一堆的任何数量的石子,直到某个人无法再取出任何石子,则另一个人就赢了。因此我们就可以创造先手的必胜态,则对于后手的来说一定是必输态。阶上去,直到最后台阶为0时,无法再移动,问能否先手必胜?,则可以证明,一个必胜态一定可以转换得到一个必输态。第一个人取第一堆,第二个人取第二堆,则第一个人必输。则通过上面的描述,一个必胜态一定可以转换为必输态。的位置,则最后就可以把一个必胜态转变为必输态。的情况,则就是甲先手赢的选择的情况。
尼姆博弈最详细解法
PG13okc的博客
09-16 5396
尼姆博弈: 博主之所以要写这么一篇题解,是因为在算法课上做过的一道题.解题代码非常简单,但是博主愣是想了两天还没想明白其中的原理,直到今天才终于恍然大悟,特此记录下来分享给大家.看完了,想必你一定会懂! 题目如下: 题目描述 Here is a simple game. In this game, there are several piles of matches and two players. The two player play in turn. In each turn, one can ch
Nim博弈博弈论
weixin_45113721的博客
06-29 1533
1.https://www.acwing.com/problem/content/893/ 题目:给定n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。 思路: 必胜状态(a1^ a2 …^an!=0):可以走到某一个必败状态 必败状态(a1^ a2 …^an==0):走不到任何一个必败状态 证明(参考算法进阶指南): (a1^ a2 …^an!=0)可以走到某一个必败状态 (a1^ a
尼姆博弈理论与推广模型解析
"推广的尼姆博弈模型-尼姆博弈 PPT" 尼姆博弈是一种经典的两人零和博弈,源于简单的物品取放游戏。在这个游戏中,玩家轮流从多堆物品中取出任意数量的物品,但必须至少取一个,直到所有物品都被取完。获胜者是最后...
写文章

热门文章

  • Hadoop格式化namenode错误:java.io.IOException: Cannot create directory 17297
  • 编译原理—yylex学习笔记 10330
  • Xshell链接Ubuntu虚拟机connection failed解决方案 4200
  • 强烈推荐篇将PCA讲解得十分清楚的博文——PCA的数学原理 2217
  • 尼姆博弈(Nimm's Game) 1937

分类专栏

  • 机器学习 7篇
  • LeetCode 3篇
  • Java 9篇
  • CCF 1篇
  • Python 1篇
  • 博弈论
  • ACM-博弈论 8篇
  • ACM-图论 1篇
  • 编译原理
  • Linux 3篇
  • Hadoop 1篇
  • SQL
  • C/C++ 1篇
  • SQL注入 1篇

最新评论

  • Hadoop格式化namenode错误:java.io.IOException: Cannot create directory

    wly0007: thanks!

  • Hadoop格式化namenode错误:java.io.IOException: Cannot create directory

    yoliccc: 已解决 感谢

  • Hadoop格式化namenode错误:java.io.IOException: Cannot create directory

    mq21554457: 非常有用,感谢!!!

  • Hadoop格式化namenode错误:java.io.IOException: Cannot create directory

    weixin_65318139: 感谢!!!!!成功了 弄了好久

  • Hadoop格式化namenode错误:java.io.IOException: Cannot create directory

    weixin_65318139: 感谢!!!!!成功了 弄了好久

大家在看

  • 高性价比无线蓝牙耳机买哪款好?四大性价比火爆机型大盘点 686
  • 蒙牛乳业风雨飘摇:高管变动频繁,业绩难掩颓势 393
  • 跨境电商美国本土尾程快递都用的USPS超低折扣账号
  • c语言中define使用方法
  • 300w赞,超亿播放:AI治愈系风景视频制作方法拆解 266

最新文章

  • redtigerSQL注入
  • 位域的sizeof问题
  • LeetCode:SubSets
2017年2篇
2016年39篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家商场美陈如何联系怒江玻璃钢雕塑定做云南步行街玻璃钢雕塑定做价格宛城玻璃钢雕塑费用北京新款玻璃钢面包雕塑北京大型主题商场美陈价钱漯河商场美陈雕塑供应商西山区玻璃钢雕塑设计公司临汾园林玻璃钢雕塑定制盐城玻璃钢雕塑价格张家口玻璃钢雕塑定制价格宿州玻璃钢雕塑加工厂许昌玻璃钢花盆花器玻璃钢花盆儿童画板玻璃钢雕塑定做哪家好阳泉玻璃钢人物雕塑定制吉林环保玻璃钢雕塑供应商西宁仿真玻璃钢雕塑安装新安玻璃钢雕塑定制云南欧式玻璃钢雕塑订做价格浏阳玻璃钢雕塑厂家大连玻璃钢雕塑设计公司玻璃钢园林雕塑加工镜面玻璃钢景观雕塑加工玻璃钢花盆哪个品牌好潮汕玻璃钢雕塑厂家酒店艺术玻璃钢雕塑大量销售玻璃钢卡通雕塑材质贵州省玻璃钢雕塑雕刻公司玻璃钢墙体雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化