博弈论模型总结

博弈论总结

几种模型均存在奇异局面,即双方均采取最优策略,若处于奇异局面,必败。

巴什博弈

只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。

分析

当总个数小于等于m的时候,先手胜。

当总个数为m + 1的时候,后手胜。

当总个数为m + 2的时候,先手可使后手面对m + 1局面,先手胜。

可推断,若总个数为k *(m + 1),后手胜。

若总个数为k * (m + 1) + s(s <= m),先手胜。

大体思路

if(n % (m + 1) != 0)
            return first win;
else
            return second win;
 
斐波那契博弈

1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.

结论:当n为斐波那契数时,先手必败。

分析见:https://blog.csdn.net/dgq8211/article/details/7602807

大体思路

void Init()//斐波那契数列,先打表,范围看情况
{
    f[0]=f[1]=1;
    for(int i=2;i<=55;i++)
    {
        f[i]=f[i-1]+f[i-2];
    }
}
int n;
int flag = 0;
for(int i = 0;f[i];i++){//分别比较,判断出n是否是斐波那契数
    if(f[i] == n){
        flag = 1;
        break;
    }
}
if(!flag)
    return first win;
else
    return second win;
威佐夫博弈

有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜.

结论:若两堆物品的初始值为(x,y),则另z=abs(y-x);记w=(int)[ ( (sqrt(5)+1) /2 )*z ];若w=min(x,y),则先手必败,否则先手必胜。

大体思路

 int z=abs(y-x);
 if((int)(((sqrt(5)+1)/2)*z)!=min(x,y))
     return first win;
 else
     return second win;
尼姆博弈

有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人获胜。

结论:判断这几堆物品的异或运算结果是否为0,如果为零,则先手必败。

分析:https://blog.csdn.net/u013514928/article/details/69055286

大体思路

int n;
int a;
int num = 0;
cin >> n;
for(i = 0;i < n;i++){
    cin >> a;
    num ^= a;
}
if(num)
	return first win;
else
	return second win;
SG函数

学习SG函数前,请先康康尼姆博弈。

首先,我们介绍几个知识点:

Sprague-Grundy定理(SG定理): 游戏和的SG函数等于各个游戏SG函数的Nim和。

mex:即不在这个集合中的第一个非负整数。例如:mex{1,2,3} = 0,mex{0,3,5} = 1。

SG函数:
对于任意状态 x , 定义 SG(x) = mex(S),其中 S 是 x 后继状态的SG函数值的集合。如 x 有三个后继状态分别为 SG( a ),SG( b ),SG( c ),那么SG(x) = mex{ SG( a ),SG( b ),SG( c ) }。 这样 集合S 的终态必然是空集,所以当且仅当 x 为必败点P时,SG函数的终态为 SG(x) = 0。

你可能感兴趣的:(模型题,算法)