威佐夫博弈详解

威佐夫博弈详解

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

威佐夫博弈,是博弈论的一道经典例题,题目大意是两个人在进行取子游戏,石子分为两堆,每堆有若干个石子,两个人按规则轮流取石子,先取完全部石子的人获胜。其中,规则如下:

  • 每个人可以选择在同一堆石子中取任意个石子(可以全部取完),也可以在两堆石子中同时取相同个数的石子,但不可以不取。

那么,现在你作为先手,是否能够必胜呢(两人都具有绝对的智慧做出对自己最有利的选择)?

首先我们可以来分析一下这个问题中的奇异局势
  1. 那么第一种想到必败的情况,肯定是 ( 0 , 0 ) (0,0) 0,0了。在 ( 0 , 0 ) (0,0) 0,0的情况中无论先手怎么走都不可能赢(他压根走不了

  2. 第二种奇异局势的话通过计算可以得出是 ( 1 , 2 ) (1,2) 1,2,当先手碰到 ( 1 , 2 ) (1,2) 1,2这种情况时,可以做出以下 4 4 4 种选择:

    • 在第一堆石子中取一个石子,局面变为 ( 0 , 2 ) (0,2) 0,2
      这时,后手只需将第二堆全部的石子都取走便可获得胜利。

    • 在第二堆石子中取一个石子,局面变为 ( 1 , 1 ) (1,1) 1,1
      这时,后手只需在两堆同时取走1个石子便可获得胜利。

    • 在第二堆石子中取两个石子,局面变为 ( 1 , 0 ) (1,0) 1,0
      这时,后手只需将第一堆全部的石子都取走便可获得胜利。

    • 在两堆中同时取走一个石子,局面变为 ( 0 , 1 ) (0,1) 0,1
      这时,后手只需将第二堆全部的石子都取走便可获得胜利。

      分析过后想必你也能看出来这是种必败的情况吧!

  3. 第三种奇异局势的话经过计算可以得出是 ( 3 , 5 ) (3,5) 3,5,当先手碰到 ( 3 , 5 ) (3,5) 3,5这种情况时,可以做出以下 11 11 11 种选择:

    • 在第一堆石子中取一个石子,局面变为 ( 2 , 5 ) (2,5) 2,5
      这时,后手只需在第二堆石子中取四个石子,局面变为 ( 2 , 1 ) (2,1) 2,1,上文已经推理过了,先手必败。

    • 在第一堆石子中取两个石子,局面变为 ( 1 , 5 ) (1,5) 1,5
      这时,后手只需在第二堆石子中取三个石子,局面变为 ( 1 , 2 ) (1,2) 1,2,上文已经推理过了,先手必败。

    • 在第一堆石子中取三个石子,局面变为 ( 0 , 5 ) (0,5) 0,5
      这时,后手只需将第二堆全部的石子都取走便可获得胜利。

    • 在第二堆石子中取一个石子,局面变为 ( 3 , 4 ) (3,4) 3,4
      这时,后手只需在两堆中同时取两个石子,局面变为 ( 1 , 2 ) (1,2) 1,2,上文已经推理过了,先手必败。

    • 在第二堆石子中取两个石子,局面变为 ( 3 , 3 ) (3,3) 3,3
      这时,后手只需在两堆中同时取三个石子,局面变为 ( 0 , 0 ) (0,0) 0,0,先手必败。

    • 在第二堆石子中取三个石子,局面变为 ( 3 , 2 ) (3,2) 3,2
      这时,后手只需在两堆中同时取一个石子,局面变为 ( 1 , 2 ) (1,2) 1,2,上文已经推理过了,先手必败。

    • 在第二堆石子中取四个石子,局面变为 ( 3 , 1 ) (3,1) 3,1
      这时,后手只需在第一堆中取一个石子,局面变为 ( 2 , 1 ) (2,1) 2,1,上文已经推理过了,先手必败。

    • 在第二堆石子中取五个石子,局面变为 ( 3 , 0 ) (3,0) 3,0
      这时,后手只需将第一堆石子全部取走便可获得胜利。

    • 在两堆石子中同时取走一个石子,局面变为 ( 2 , 4 ) (2,4) 2,4
      这时,后手只需在第二堆石子中取走三个石子,局面变为 ( 2 , 1 ) (2,1) 2,1,上文已经推理过了,先手必败。

    • 在两堆石子中同时取走两个个石子,局面变为 ( 1 , 3 ) (1,3) 1,3
      这时,后手只需在第二堆石子中取走一个石子,局面变为 ( 1 , 2 ) (1,2) 1,2,上文已经推理过了,先手必败。

    • 在两堆石子中同时取走三个石子,局面变为 ( 0 , 2 ) (0,2) 0,2
      这时,后手只需将第二堆石子中的全部石子都取走,便可获得胜利。

      自然,你也可以看出 ( 3 , 5 ) (3,5) 3,5这种情况先手是必败的!

  4. 第三种奇异局势经过计算我们可以得出是 ( 4 , 7 ) (4,7) 4,7,先手碰到这种情况可以做出以下 15 15 15 种情况:

    • 在第一堆石子中取一个石子,局面变为 ( 3 , 7 ) (3,7) 3,7
      这时,后手只需在第二堆石子中取两个石子,局面变为 ( 3 , 5 ) (3,5) 3,5,上文已经推理过了,先手必败。

    • 在第一堆石子中取两个石子,局面变为 ( 2 , 7 ) (2,7) 2,7
      这时,后手只需在第二堆石子中取六个石子,局面变为 ( 2 , 1 ) (2,1) 2,1,上文已经推理过了,先手必败。

    • 在第一堆石子中取三个石子,局面变为 ( 1 , 7 ) (1,7) 1,7
      这时,后手只需在第二堆石子中取五个石子,局面变为 ( 1 , 2 ) (1,2) 1,2,上文已经推理过了,先手必败。

    • 在第一堆石子中取四个石子,局面变为 ( 0 , 7 ) (0,7) 0,7
      这时,后手只需将第二堆石子全部都取走便可获得胜利。

    • 在第二堆石子中取一个石子,局面变为 ( 4 , 6 ) (4,6) 4,6
      这时,后手只需在两堆中同时取一个石子,局面变为 ( 3 , 5 ) (3,5) 3,5,上文已经推理过了,先手必败。

    • 在第二堆石子中取两个石子,局面变为 ( 4 , 5 ) (4,5) 4,5
      这时,后手只需在第一堆石子中取一个石子,局面变为 ( 3 , 5 ) (3,5) 3,5,上文已经推理过了,先手必败。

    • 在第二堆石子中取三个石子,局面变为 ( 4 , 4 ) (4,4) 4,4
      这时,后手只需在两堆中同时取四个石子便可获得胜利。

    • 在第二堆石子中取四个石子,局面变为 ( 4 , 3 ) (4,3) 4,3
      这时,后手只需在两堆中同时取两个石子,局面变为 ( 2 , 1 ) (2,1) 2,1,上文已经推理过了,先手必败。

    • 在第二堆石子中取五个石子,局面变为 ( 4 , 2 ) (4,2) 4,2
      这时,后手只需在第一堆石子中取三个石子,局面变为 ( 1 , 2 ) (1,2) 1,2,上文已经推理过了,先手必败。

    • 在第二堆石子中取六个石子,局面变为 ( 4 , 1 ) (4,1) 4,1
      这时,后手只需在第一堆石子中取两个石子,局面变为 ( 2 , 1 ) (2,1) 2,1,上文已经推理过了,先手必败。

    • 在第二堆石子中取七个石子,局面变为 ( 4 , 0 ) (4,0) 4,0
      这时,后手只需将第一堆石子全部都取走即可获得胜利。

    • 在两堆石子中同时取走一个石子,局面变为 ( 3 , 6 ) (3,6) 3,6
      这时,后手只需在第二堆石子中取走一个石子,局面变为 ( 3 , 5 ) (3,5) 3,5,上文已经推理过了,先手必败。

    • 在两堆石子中同时取走两个石子,局面变为 ( 2 , 5 ) (2,5) 2,5
      这时,后手只需在第二堆石子中取走四个石子,局面变为 ( 2 , 1 ) (2,1) 2,1,上文已经推理过了,先手必败。

    • 在两堆石子中同时取走三个石子,局面变为 ( 1 , 4 ) (1,4) 1,4
      这时,后手只需在第二堆石子中取走两个石子,局面变为 ( 1 , 2 ) (1,2) 1,2,上文已经推理过了,先手必败。

    • 在两堆石子中同时取走四个石子,局面变为 ( 0 , 3 ) (0,3) 0,3
      这时,后手只需将第二堆石子全部都取走即可获得胜利。

      嗯,在我详细的讲解下,你已经明白了威佐夫博弈大概需要怎么做了吧!


接下来的奇异局势就是 ( 6 , 10 ) (6,10) 6,10 ( 8 , 13 ) (8,13) 8,13…… 那么,聪明的你一定发现了:

每个奇异局势两堆石子的差就是 1 , 2 , 3 , 4 , 5 … … n 1,2,3,4,5……n 1,2,3,4,5……n

再仔细计算,你还可以发现什么?

每一组奇异局势的较小数都是之前未出现的最小的数字!详细看一下:
  • 第一组奇异局势之前出现过 0 0 0 ,所以较小数为 1 1 1

  • 第二组奇异局势之前出现过 0 , 1 , 2 0,1,2 0,1,2 ,所以较小数为 3 3 3

  • 第三组奇异局势之前出现过 0 , 1 , 2 , 3 , 5 0,1,2,3,5 0,1,2,3,5,所以较小数为 4 4 4

……以此类推。

再看看,你发现了什么?


1 ≈ ( 2 − 1 ) ∗ 1.618 ; 1 \approx(2-1)* 1.618; 1(21)1.618;

3 ≈ ( 5 − 3 ) ∗ 1.618 ; 3 \approx(5-3)* 1.618; 3(53)1.618;

4 ≈ ( 7 − 4 ) ∗ 1.618 ; 4 \approx(7-4)* 1.618; 4(74)1.618;

……以此类推。


没错!就是第一个值 = 差值 1.618 1.618 1.618

那么综合以上几点,就可以得出来公式了:

公式:

若设两堆石子数较小的为x,较大的为y,差值为z的话:
设 w = ( i n t ) ( ( 5 − 1 ) / 2 ∗ z ) ; (int)((\sqrt{5}-1)/2*z); (int)((5 1)/2z);
若 w = x,则这种情况先手必败;否则先手必胜。


例题:

洛谷 P2252 [SHOI2002]取石子游戏|【模板】威佐夫博弈

裸的板子题,直接放代码了:

#include <bits/stdc++.h>
using namespace std;
int a;
int b;
int s;
int w;
inline int read(){
	int s=0;
	int w=1;
	char ch;
	ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			w=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		s=(s<<1)+(s<<3)+(ch^48);
		ch=getchar();
	}
	return s*w;
}
inline void write(int s){
	if(s<0){
		putchar('-');
		s=~s+1;
	}
	if(s>9){
		write(s/=10);
	}
	putchar(s+'0');
	return ;
}
int main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	a=read();
	b=read();
	s=abs(b-a);
	w=(int)(s*((sqrt(5)+1)/2));
	if(w==min(a,b)){
		cout<<"0";
		//fclose(stdin);
		//fclose(stdout);
		return 0;
	}
	else{
		cout<<"1";
		//fclose(stdin);
		//fclose(stdout);
		return 0;
	}
	//fclose(stdin);
	//fclose(stdout);
	return 0;
}
//Taunting_Wind

解释:

奇异局势:即先手必败的局势。

完结撒花!!!

By Taunting_Wind

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值