巴什博弈与威佐夫博弈

目录

博弈问题

理论铺垫

巴什博弈

威佐夫博弈

奇异局势的性质

威佐夫博弈的性质


博弈问题

    博弈是信息学和数学试题中常会出现的一种类型,算法灵活多变是其最大特点,而其中有一类试题更是完全无法用常见的博弈树来进行解答。 寻找必败态即为针对此类试题给出一种解题思路。

此类问题一般有如下特点:

        1、博弈模型为两人轮流决策的非合作博弈。即两人轮流进行决策,并且两人都使用最优策略来获取胜利。

        2、博弈是有限的。即无论两人怎样决策,都会在有限步后决出胜负。

        3、公平博弈。即两人进行决策所遵循的规则相同。

理论铺垫

        1.P状态和N状态:假设双方都采取最明智的策略,则对于一些状态,刚完成走步的游戏者(Previous Player) 一定胜利,而对于其他状态,下一个走步的游戏者(NextPlayer) 一定胜利。把两种状态称为P状态(P position) 和N状态(N position) 。

        2、P/N状态有如下性质:

                1.若面临末状态者为获胜则末状态为胜态否则末状态为必败态。

                2.一个局面是胜态的充要条件是该局面进行某种决策后会成为必败态。

                3.一个局面是必败态的充要条件是该局面无论进行何种决策均会成为胜态

巴什博弈

问题描述:
        有 一堆n 个物品 ,两个人轮流从这堆物品中取物,规定 每次至少取一个,最多取m 个 。最后取光者得胜。已知n,如何判断先手还是后手赢。
问题分析:

        1.如果n<=m,先取者胜。
        2.如果n=m+1,那么由于一次最多只能取m 个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。所以当一方面对的局势是n%(m+1)=0时,其面临的是必败的局势。

结论:

         至此我们发现了如何取胜的法则:如果n=(m+1)*r+s,(r 为任意自然数,s≤m),那么先取者要拿走s 个物品,如果后取者拿走k(k≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)*(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。

        巴什博弈的一个最重要的特征就是只有一堆。然后就在其中改,要么在范围内不规定个数,要么就规定只能取几个,再要么就倒过来,毕竟是最简单的博弈,代码相对而言较短

例1

import java.util.Scanner;

/**
 * 在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,
 * 她们是用旺仔小馒头当作石子。游戏的规则是这样的。设有一堆石子,数量为N(1<=N<=1000000),
 * 两个人轮番取出其中的若干个,每次最多取M个(1<=M<=1000000),最先把石子取完者胜利。
 * 我们知道,TT和他/她的室友都十分的聪明,那么如果是TT先取,他/她会取得游戏的胜利么?
 * 输入描述:
 * 第一行是一个正整数n表示有n组测试数据
 * 输入有不到1000组数据,每组数据一行,有两个数N和M,之间用空格分隔。
 * 输出描述
 * 对于每组数据,输出一行。如果先取的TT可以赢得游戏,则输出“Win”,否则输出“Lose”(引号不用输出)
 * 示例输入:
 * 2
 * 100 1
 * 1 100
 * 示例输出:
 * Lose
 * Win
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int count = in.nextInt();
        while (count > 0){
            int n = in.nextInt();
            int m = in.nextInt();
            if(n % (m + 1) == 0){
                System.out.println("Lose");
            }else {
                System.out.println("Win");
            }
            count--;
        }
    }
}

威佐夫博弈

         问题描述:有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
        问题分析:A: 设( ai,bi )( ai ≤bi  ,i=0 1 2 …,n) 表示两堆物品的数量并称其为局势 ,如果甲面对( 0 0 ),那么甲已经输了,这种局势我们称为 奇异局势。
        首先我们根据条件来分析博弈中的奇异局势
第一个(0,0),先手输
        当游戏某一方面对(0,0)时,呀没有办法取了,那么先手输
第二个(1,2),先手输
        先手只有四种取法,
                        1.取1中的一个,那么后手取第二堆中两个
                        2.取2中的一个,那么后手在两堆中各取一个
                        3.在2中取两个,那么后手在第一堆中取一个
                        4.在两堆中各取一个,那么后手在第二堆中取一个。
                可以得出结论无论先手怎么取,后手总是能赢,所以先手必输!
第三个(3,5),先手输。
        首先先手必定不能把任意一堆取完,如果取完了先手必输;
        假设先手在第一堆中取。
                取一个后手在第二堆中取四个变成了(1,2)局面,在第二个分析中这是先手的必输局。取两个,后手在第二堆中取3个,也变成了(1,2)
                
        假设先手在第二堆中取
                取一个,那么后手在两堆中各取两个,也变成了(1,2)
                取两个,那么后手在两堆中各取一个,也变成了(1,2)
                取三个,那么后手在第一堆中取两个,也变成了(1,2)
                取四个,后手在第一堆中取一个,也变成了(1,2)

              可以得出结论无论先手怎么取,后手总是能赢,所以先手必输!

可以发现 不论第一次先手如何取,那么后手会变成前面分析过的先手必输的局面

我们继续往下写。

        第五个 ( 6 10 

        第六个 ( 8 13

        第七个 ( 9 15)        

        第八个 ( 11 18

        会发现他们的差值是递增的,为 0 1 234 5 67.....n

        而用数学方法分析发现局面中第一个值为前面局面中没有出现过的第一个值,比如第三个局面,前面出现了 0  1 2,那么第三个局面的第一个值为 3 ,比如第五个局面,前面出现了 0  1  2 3 4 5 ,那么第五个局面第一个值为6

再找规律的话我们会发现,第一个值 = 差值 * 1.618

1.618 = sqrt5+ 1/  2

那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?

我们总结了如下公式:a[i] =[i(1+√5)/2],b[i]= a[i] + i (k=0,1,2,...,n 方括号表示取整函数)

奇异局势的性质:

        1、任何自然数都包含在一个且仅有一个奇异局势中

        2、任意操作都可将奇异局势变为非奇异局势。

        3、采用适当的方法,可以将非奇异局势变为奇异局势。

结论:两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜

威佐夫博弈的性质:

        性质1:所有自然数都会出现在一个必败点中,且仅会出现在一个必败点中;

        证明:m(k)是前面没有出现过的最小自然数,自然与前k-1个必败点中的数字都不同;m(k)>m(k-1),否则违背m(k-1)的选择原则;n(k)=m(k)+k>m(k-1)+(k-1)=n(k-1)>m(k-1),因此n(k)比以往出现的任何数都大,即也没有出现过。又由于m(k)的选择原则,所有自然数都会出现在某个必败点中。

        性质2:规则允许的任意操作可将必败点移动到必胜点;

        证明:以必败点(m(k),n(k))为例。若只改变两个数中的一个,由于性质1,则得到的点一定是必胜点;若同时增加两个数,由于不能改变两数之差,又有n(k)-m(k)=k,故得到的点也一定是必胜点。

        性质3:一定存在规则允许的某种操作可将必胜点移动到必败点;

        证明:以某个必胜点(i,j)为例,其中j>i。因为所有自然数都会出现在某个必败点中,故要么i等于m(k),要么j等于n(k)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值