基础博弈——威佐夫与尼姆不得不说的那些事

STEP1:首先了解规则与概念

  威佐夫博弈(Wythoff‘s game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

  尼姆博弈(Nimm Game):有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

  要注意,在威佐夫博弈中,玩家可以选择操作两堆物品,而在尼姆博弈中,只能对任意一堆物品进行操作。

STEP2:了解奇异局势

  Q:什么是局势与奇异局势?

  A:局势就是指当前所有堆的状态。奇异局势是指当一个玩家面对这种局势的时候且如果两个玩家都用最优秀的姿态博弈,那么进入奇异局势的玩家将不可能胜利,即进入必败态

    (比如在我们知道的巴什博奕中,如果一个玩家面对的剩余数目为(最大拿取数目 + 1)的整数倍时(最多拿3个,剩16个),那么称16是一个奇异局势,在这种情况下,无论谁面对16这个数字,都一定必败)

  Q:奇异局势有什么特点或者性质?

  A:①任何自然数都包括在一个且仅存在一个的奇异局势中。

②任意操作(指的是在规则中出现的操作)都可以将一个奇异局势转化为一个非奇异局势。

     ③采用适当的操作,可以将一个非奇异局势转化为奇异局势。

STEP3:晦涩的推导与证明

  以威佐夫博弈为背景来证明奇异局势的3个性质

  我们使用诸如(a[k],b[k])(k = 0,1,2,3,4...,n)这种方法来定义局势,k表示奇异局势的序号, 第一个奇异局势k=0。

  首先写出几个最开始的奇异局势:(0,0)(1,2)(3,5)(4,7)(6,10)(8,13)(9,15)(11,18)(12.20)......

  一些机智的小伙伴一下子就能看出端倪了。

    这些局势存在以下特点:

       k0 = (a0,b0)(a0 == 0 && b0 == 0)

       kn = (an,bn)(bn == an + n)

       a[k]是前面所有奇异局势中没有出现过的且是最小的自然数。

  那么上述几个性质自然得证:

    性质①:

      有a[k] > a[k-1] ,而 b[k]= a[k] + k > a[k-1] + k > a[k-1] + (k - 1) = b[k-1] > a[k-1] 。

    性质②:

      若我们只改变奇异局势(a[k],b[k])的某一个分量,那么另一个分量不可能在其他奇异局势中,所以必然是非奇异局势。

      如果使(a[k],b[k])的两个分量同时减少,由于其差不变,而且所有的奇异局势的差值(bk-ak)都不相同,因此也是非奇异局势。

    性质③:

      若当前局势是b == a,则同时从两堆中取走所有物体,即变为奇异局势(0,0)。

      若当前局势是a = a[k],b > b[k],那么,从第二堆取走b - b[k]个物体,即变为奇异局势(ak,bk)。

      若当前局势是a = a[k],b < b[k],则同时从两堆中拿走a - a[b - a]个物体([b - a]是a的下标,不是a*(b - a)),即变为奇异局势(a[b - a],a[b - a] + (b - a))。

      若当前局势是a > a[k],b = a[k] + k,则从第一堆中拿走多余的数量a - a[k] ,即变为奇异局势(ak,ak + k)。

      若当前局势是a < a[k],b = a[k] + k,若a == aj(j < k)从第二堆里面拿走 b - bj 个物体,即变为奇异局势(可使用k3 = (4,7)与 k2 = (3,5)推导)。

                       若a == bj(j < k)从第二堆里面拿走 b - aj 个物体。即变为奇异局势(可使用k7 = (11,18)与 k4 = (6,10)推导)。

  威佐夫博弈与尼姆博弈的具体证明暂时不贴了,去百度百科或各种dalao的博客查看即可。(溜了溜了)、

STEP4:如何判断给出局势是否为奇异局势

  如何判断威佐夫博弈的奇异局势

    其实对于任意一个k,ak是存在公式的:ak = (int)(k * (sqrt(5) + 1) / 2)。

    有趣的事情发生了,这个数与黄金分割有关。其实在威佐夫博弈中,奇异局势的规律十分符合Beatty定理,ak与bk做边所构成的矩形是越来越接近黄金矩形的。

    因此在给出了两个堆得物品数目时,只需要看这两个堆的差(也就是 bj - aj = j)的(sqrt(5) + 1) / 2)倍再取整,是否等于较少的一堆即可。

    即(int)(abs(b - a) * (sqrt(5) + 1) / 2))  == min(a,b)时符合奇异局势。

  如何判断尼姆博弈的奇异局势

    对于任意局势(a,b,c),我们只需要判断 a^b^c(按位模二加,即抑或运算)的结果就可以了。

    结果是0,那么这个局势就是一个奇异局势。

    这个判断方法同样适用于扩展到n堆物品的尼姆博弈

STEP5:结论

  在威佐夫博弈中

    先手面对奇异局势必败(无论自己如何破坏奇异局势,对手都可将非奇异局势转化为奇异局势)。

    相反地,先手面对非奇异局势必胜(转化为奇异局势即可)。

  在尼姆博弈中

    只需要把每一堆的值抑或,如果结果是0,那么先手必败,结果不是0,后手必败。

STEP6:例题以及参考代码

  

  这道题其实就是个裸的博弈。n == 2的时候是威佐夫博弈,n >= 3的时候是尼姆博弈。

  但是不知道当时为什么只有我们这个蒟蒻队伍出了,不知道其他dalao们是不是没开这道题。。。

  放个代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 int main()
 5 {
 6     int T,n,m,k;
 7     scanf("%d",&T);
 8     while(T --){
 9     //while(scanf("%d",&n) != EOF){
10         scanf("%d",&n);
11         if(n == 2){
12             int a,b;
13             scanf("%d%d",&a,&b);
14             double c = abs(a - b) * ((sqrt(5.0) + 1.0) / 2.0);
15             int d = int(c);
16             if(d != min(a,b)){
17                 printf("Sherlock\n");
18             }
19             else{
20                 printf("Watson\n");
21             }
22         }
23         else{
24             int ans = 0;
25             for(int i = 0;i < n;i ++){
26                 scanf("%d",&k);
27                 if(i == 0){
28                     ans = k;
29                 }
30                 else{
31                     ans = ans ^ k;
32                 }
33             }
34             if(ans == 0){
35                 printf("Watson\n");
36             }
37             else{
38                 printf("Sherlock\n");
39             }
40         }
41     }
42     return 0;
43 }

原文地址:https://www.cnblogs.com/love-fromAtoZ/p/9003957.html

时间: 2024-10-16 00:56:41

基础博弈——威佐夫与尼姆不得不说的那些事的相关文章

巴仕博弈 + 威佐夫博弈

既然会了尼姆博弈和SG函数,那么巴仕博弈和威佐夫博奕照理说应该是不在话下了 巴什博奕: 两个顶尖聪明的人在玩游戏,有n个石子,每人可以随便拿1到m个石子,不能拿的人为败者,问谁会胜利 巴什博奕是博弈论问题中基础的问题 它是最简单的一种情形对应一种状态的博弈 博弈分析 如果有m+1个石子,那么先手必定无法取完全部,但后手可以取完剩下的部分,使得先手没有石子可以取,那么这个时候先手必败, 那么假设石子总数为(m+1)*r+n,r,n都为自然数,且n<m+1,那么如果我们先手,当r≠0时,我们只需要取

【POJ3480】John 博弈 Anti-SG mis&#232;re规则尼姆游戏

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42671843 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 题意:跟NIM游戏差不多,不过是谁不能操作了,谁赢. 定理: NIM游戏规则取最后一个石子输 适用范围:对于任意一个Anti-SG 游戏,当局面中所有的单一游戏 的SG值为0时,游戏结束. (1)SG==0,有某单一游戏的SG>1.(败) (2)SG!=0,有某单一游戏的SG>1.(胜) (3)SG==0,无某

【博弈论】威佐夫博弈

威佐夫博弈     威佐夫博弈:有两堆石子,每次一个人可以两堆同时取相同数量的石子,也可以只取其中一堆的石子,最后谁取完谁获胜,请问先手还是后手胜? 对于学过一些博弈论基础的来说,我们需要找到那些能让先手必输的局势,那么由这些局势在规定范围内拓展的局势也是先手必输的局势(但在这里双方自由选取,不适用).我们可以得出一些局势使A必输:(0,0) (1,2) (3,5) (4,7) (6,10) (8,13) (9,15) (11,18) (12,20)……我们称这些局势为奇异局势 不难发现,如果我

codeforces 812 E. Sagheer and Apple Tree(树+尼姆博弈)

题目链接:http://codeforces.com/contest/812/problem/E 题意:有一颗苹果树,这个苹果树所有叶子节点的深度要不全是奇数,要不全是偶数,并且包括根在内的所有节点上都有若干个苹果,现有两个,每个人可以吃掉某个叶子节点上的部分苹果(不能不吃),或者将某个非叶子结点上的部分苹果移向它的孩子(当然也不能不移),吃掉树上最后一个苹果的人获胜.后手可以在游戏开始之前交换任意两个不同的节点的苹果,输出交换后能使得后手胜利的交换总数. 题解:这题挺友善的所有叶子结点的深度奇

杭电 1850(尼姆博弈)

Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4649    Accepted Submission(s): 2774 Problem Description 一年在外 父母时刻牵挂 春节回家 你能做几天好孩子吗 寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场 悄悄

巴什博弈、威佐夫博弈、尼姆博弈

取石子问题 [转]ACM取石子游戏 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理.下面我们来分析一下要如何才能够取胜. (一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次

博弈:巴什博奕(Bash Game)威佐夫博奕(Wythoff Game)尼姆博奕(Nimm Game)

巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜 对于巴什博弈可以考虑:n=(m+1)*k+s,即如果n%(m+1)!=0则先取者只需取走s物品即可保证获胜. HDU 1846:裸的. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<limits.h> t

hdu 1907 尼姆博弈

John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 3745    Accepted Submission(s): 2116 Problem Description Little John is playing very funny game with his younger brother. There is one big bo

3.威佐夫博弈

先上一串数吧,, (0,0).(1,2).(3,5).(4,7).(6,10).(8,13).(9,15).(11,18).(12,20). 大家发现规律啦吗? 没发现也不要紧,我来给大家说一下其中的奥妙吧,哈哈哈. 咱们先不说(0,0),从第二个开始说,她是以1开始的,而2比1多1,第三个是从3开始的,接着5比3多2,第4个事从4开始的,7比4多3...每一个数对的两个数之间都是从1开始相差2,3,4...再观察每个数对的第一个数,他们都是前面的那些数对中没有出现过的数的最小自然数,因此,稍稍