个人总结的博弈知识

来源:互联网 发布:网络于刷脸是什么字 编辑:程序博客网 时间:2024/06/05 04:01

    在古代的时候有一种很有意思的游戏 ,有若干堆东西 ,两个人按一定的规则去取,不同的玩法有不同的输赢方式,有的以最后取完的人为胜利者,有的以最后取完的为输的人。现在让我们来看三种博弈

一.组合博奕:   有一堆东西,两个人按规则取一定的数量,最后取完的为胜利者。

先设任务a先取人物b后取,规定P点为a的必败点,N为a的必胜点,我们可以知道0点一定是P,能达到0点的一定是N

当所有操作都能到达N的为P,所以我们可以写出来三种规则。

1.终点为P   2.可以达到P的是N   3所有操作都能达到N的为P

这样我们就能把这堆东西上的每一个点是P还是N求出来   

我们来看一下步骤①.把所有终结标志修改成P     ②把所有能达到P的设为N     ③把所有操作都能达到N的设为P

④重复二操作直到堆上的所有点都被标记为止

我们先看一个例子吧:有100个石头 每次只能取1到10个 问100这个点事必败点还是必胜点

我们先来分析:0肯定为P那么1到10为N 然后我们可以知道11这个点不管怎么操作都能到N   不管是拿一个石头还是拿10个石头 所有11为P然后因为11为P所以11到21为N以此类推 可以求出100是N还是P。

知道了这个方法巴什博奕自然就解决了。

下面我们来看威佐夫博弈: 有两堆若干个物品,两个人轮流取,每次可以去某一堆若干个或两堆都去一样的数量,最后取光者胜利。

这种情况下是颇为复杂的。我们用(ak,bk)(ak ≤ bk ,k=0,1,2,…,n)表示
两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们
称为奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,
10)、(8,13)、(9,15)、(11,18)、(12,20)。

奇异局势有三条性质:任何一个自然数都包含在一个奇异局势中。

任何一个操作都可以将奇异局势转换为非奇异局势

只要方法正确都可以讲非奇异局势转换成奇异局势。

假设面对的局势是(a,b),若 b = a,则同时从两堆中取走 a 个物体,就变为了
奇异局势(0,0);如果a = ak ,b > bk,那么,取走b  – bk个物体,即变为奇异局
势;如果 a = ak ,  b < bk ,则同时从两堆中拿走 ak – ab – ak个物体,变为奇异局
势( ab – ak , ab – ak+ b – ak);如果a > ak ,b= ak + k,则从第一堆中拿走多余
的数量a – ak 即可;如果a < ak ,b= ak + k,分两种情况,第一种,a=aj (j < k)
,从第二堆里面拿走 b – bj 即可;第二种,a=bj (j < k),从第二堆里面拿走 b – a
j 即可。

    从如上性质可知,两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜
;反之,则后拿者取胜。

那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?我们有如下公式:

    ak = [k * (1 + √5)/2],bk = ak + k(k=0,1,2,…,n 方括号表示取整函数)


下面我们再来看nim博弈:

有若干堆物品 ,我们每次可以从一堆中拿出规则的个数,最后取走的为赢家

这种局势与二进制有着密切的关系 我们来考虑(x,y,z)为一种局势

显然(0,0,0)为一种奇异局势  不管谁面对奇异局势都是输的。(0,n,n)也是一种奇异局势

(1,2,3)也是一种奇异局势不管对手怎么取都会成为非奇异局势

计算机里面有一种模二运算1,2,3异或后是0,(0,n,n)异或后也是0,(0.0.0)异或也是0那我们就可知道如果为奇异局势异或一定为0

如果我们面对的是一个非奇异局势(a,b,c),要如何变为奇异局势呢?假设 a < b
< c,我们只要将 c 变为 a(+)b,即可,因为有如下的运算结果: a(+)b(+)(a(+)
b)=(a(+)a)(+)(b(+)b)=0(+)0=0。要将c 变为a(+)b,只要从c中减去c-(
a(+)b即可。

下面我们来看一个游戏:题目1:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根, 
可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。 
题目2:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根, 
可将一堆全取走,但不可不取,最后取完者为负,求必胜的方法。

我们先定义:三堆火柴如果异或为0那我们把他设为利他态T否则为利己态S

所以我们可以得出几个定理:对于任何S态,总能从一堆火柴中取出若干个使之成为T态

T态,去任何一堆都将成为S态。

S态只要方法正确必胜。

T态只要对方方法正确必输。

我们再来考虑第二个游戏

定义:若一堆中仅有1根火柴,则被称为孤单堆。若大于1根,则称为充裕堆。
定义:T态中,若充裕堆的堆数大于等于2,则称为完全利他态,用T2表示;若充裕堆的堆数等于0,则称为部分利他态,用T0表示。

[定理5]:S0态,即仅有奇数个孤单堆,必败。T0态必胜。 
[定理6]:S1态,只要方法正确,必胜。
[定理7]:S2态不可转一次变为T0态。 
[定理8]:S2态可一次转变为T2态。 
[定理9]:T2态,只能转变为S2态或S1态。
[定理10]:S2态,只要方法正确,必胜. 
综上所述,必输态有:  T2,S0 
          必胜态:    S2,S1,T0. 


最后讲两个重要的知识点:SG值和后继点的问题。

一个堆的SG值是什么:就是大于等于0切不等他他的后继点的最小整数。

后继点:就是进行一次操作能达到的点。比如说有100个石子,每次能拿1到10个那么它的后继点是100 - 1,100 - 2,100 - 3,100 - 4,100 - 5,100 - 6,100 - 7,100 - 8,100 - 9,100 - 10;

SG值其实就是求某一个点是P还是N如果SG为0那么就是P,如果SG>0那么久为N,运用SG值我们可以把nim博弈分成几个不同的小游戏然后去求每个堆的

SG值 然后去异或看是否为0来得出最终答案

下面写一个求SG值的模板:

#include<stdio.h>int f[100];  //记录可以取走的数量int hash1[100];   //记录哪个是最小正整数int sg[];//记录每个点的sg值int GET_sg(int x){    for(int i = 1;i < x;i++)    {        memset(hash1,0,sizeof(hash1));        for(j = 1;j < i;j++)        {            hash1[sg[i - f[j]]] = 1;        }        for(j = 0;j < n;j++)        {            if(hash1[j] == 0)            {                sg[i] = j;                break;            }        }    }}
好了大概也就这么多了 ,博弈的进阶还是在于对sg值得理解    ,如果你想成为博弈大神 那么还是需要不断的AC的 

这是几道hdu的题,还是很不错的:

ACM课作业:
1001 Brave Game
1002 Good Luck in CET-4 Everybody!
1003 Fibonacci again and again
1004 Rabbit and Grass
1005 Being a Good Boy in Spring Festival
1006 Public Sale 
1007 悼念512汶川大地震遇难同胞——选拔志愿者 
1008 kiki’s game 
1009 Calendar Game 
1010 A Multiplication Game 
1011 Digital Deletions 
1012 S-Nim

当你把这几道题A了之后那么恭喜你  入门了




0 0
原创粉丝点击