• 【转载】博弈论的总结


    转载自:https://blog.csdn.net/riba2534/article/details/78483578

    致敬大佬

    何为博弈论

          那就是若有多个人进行博弈,假设他们都足够聪明(能力已经相当于计算机了),在他们都没有失误并采取最优策略后,一定有一个人胜出,在知道初状态及规则的情况下,求解最终必胜的初状态(即何人胜出)的一类问题的理论及方法。

    理论铺垫

    1、定义P-position和N-position:其中P代表Previous,N代表Next。直观的说,上一次move的人有必胜策略的局面是P-position,也就是“先手必败”(奇异局势),现在轮到move的人有必胜策略的局面是N-position,也就是“先手可保证必胜”(非奇异局势)。

    (1).无法进行任何移动的局面(也就是terminal position)是P-position;

    (2).可以移动到P-position的局面是N-position;

    (3).所有移动都导致N-position的局面是P-position。

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

    (1)、若面临末状态者为获胜则末状态为胜态否则末状态为必败态。
    (2)、一个局面是胜态的充要条件是该局面进行某种决策后会成为必败态。
    (3)、一个局面是必败态的充要条件是该局面无论进行何种决策均会成为胜态

    公平组合博弈(ICG)

    1、定义:

    (1)只有两人参与。

    (2)游戏局面的状态集合是有限。

    (3)对于同一个局面,两个游戏者的可操作集合完全相同

    (4)游戏者轮流进行游戏。

    (5)当无法进行操作时游戏结束,此时不能进行操作的一方算输。

    (6)无论游戏如何进行,总可以在有限步数之内结束。

    2、模型:给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移动者判负。这个游戏可以认为是所有公平组合游戏的抽象模型。其实,任何一个ICG都可以通过把每个局势看成一个顶点,对每个局势和它的子局势连一条有向边来抽象成这个“有向图游戏”。

    3、解决思路:

    现在,假定我们给出两个游戏G1 和 G2甚至多个游戏。如果我们只知道单个游戏的P-状态和N-状态我们能够正确地玩好游戏和G1 + G2吗?答案是否定的。不难看出两个P-状态的和总是P-状态,P-状态和N-状态的和总是N-状态。但是两个N-状态的和既可能是P-状态也可能是N-状态。因此,只知道单个游戏的P-状态和N-状态是不够的。

    为了了解到几个状态叠加后是N还是P状态,我们需首先了解Sprague-Grudy函数。

    4、Sprague-Grudy定理:

    令N = {0, 1, 2, 3, ...} 为自然数的集合。Sprague-Grundy 函数给游戏中的每个状态分配了一个自然数。结点v的Grundy值等于没有在v的后继的Grundy值中出现的最小自然数.

    形式上:给定一个有限子集 S ⊂ N,令mex S为没有出现在S中的最小自然数。定义的mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。

    对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Garundy函数g如下:g(x)=mex{ g(y) | y是x的后继 }。

    5、Sprague-Grudy函数性质:

    (1)所有的终结点所对应的顶点,其SG值为0,因为它的后继集合是空集——所有终结点是必败点(P点)。

    (2)对于一个SG(x)=0的顶点x,它的所有后继y都满足g(y)!=0——无论如何操作,从必败点(P点)都只能进入必胜点(N点)//对手走完又能把N留给我们。

    (3)对于一个SG(x)!=0的顶点,必定存在一个后继点y满足g(y)=0——从任何必胜点(N点)操作,至少有一种方法可以进入必败点(P点)//就是那种我们要走的方法。

    尼姆博奕(Nimm Game)

     1.nim简单情况:

        有3堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,最后取光者获胜胜。

        这是nim博弈最简单的情况,我们用(a,b,c)表示某种局势,首先(0,0,0)显然是奇异局势,无论谁面对奇异局势,都必然失败。第二种奇异局势是(0,n,n),只要与对手拿走一样多的物品,最后都将导致(0,0,0)。仔细分析一下,(1,2,3)也是奇异局势,无论对手如何拿,接下来都可以变为(0,n,n)的情形。

        那么怎么才能判断一个局势是否为奇异局势呢?答案就是抑或运算。这也算是公平组合博弈的一个原理之一,由于是尼姆博弈的基础于是放到此部分。

    2.抑或运算对尼姆博弈的处理以及原理:

      对于P/N状态,有以下三个定义:(即前面理论铺垫的三个定义)

     (1).无法进行任何移动的局面(也就是terminal position)是P-position;

     (2).可以移动到P-position的局面是N-position;

     (3).所有移动都导致N-position的局面是P-position。

     假设各堆石子数为a1,a2,a3...an,首先P状态对应a1^a2^a3...^an=0,N状态对应a1^a2^a3......^an!=0;

      对于(1),无法操作的局面对应ai全为0的情况,抑或为0,得证。

      对于(2),对于任何a1^a2^a3...^an!=0的情况,将一个最大的数ai,变为a1^a2^a3...^a(i-1)^a(i+1)^an,根据抑或自反率(即a^a=0)可知这样转变就把该!=0 N状态转化为 =0的P状态;

      对于(3),证明P状态转移后必定不为P状态,也就能证明(3)了。对于a1^a2^a3^……^ai^……^an=0的P状态 将其中ai取走一堆,即减去一个数字变为ai`,仍为P状态,即a1^a2^a3^……^ai^……^an=0=a1^a2^a3^……^ai^……^an,由于抑或运算满足削去率,所以得到最后结果为ai`=ai,所以P状态不可能经过任何转移使得其仍未P状态,(3)成立。

      因此nim简单博弈中,把3堆石子数量抑或一遍,判断是否为零就能得出是否为必胜态。

      推广到n堆,原理相似。

    ICG,NIM博弈及 SG函数综合

      对于能化为n堆取石子的问题,若取石子的数量是有限制的(给出n个能取得石子数量),因此先求出每堆数量的SG值(也就是单个游戏对应的状态),再进行抑或,得出的答案按是否为0判断是否为必胜或者必败态。

      而对于一次取后会变为多状态的问题,由于按照最优策略最后一定有一个人胜出,所以取后各个状态得出的结果是一致的,只需要把该次取后的所有状态抑或一遍,得出的答案就是取前状态,可递归计算。

    巴什博奕(Bash Game)

    1. QUESTION 

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

    2.分析:

        游戏中为两人取一堆,干脆扩展到取n堆,由于取物数量有限制,因此正好是综合内第一个情况。

        求SG值总能发现SG值该值为%(m+1) 后的结果,因此不加证明就能给出每一堆%(m+1)后再抑或一遍就为答案,下面是一堆贪心算法原理:
        显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。

    即,若n=k*(m+1),则后取着胜,反之,存在先取者获胜的取法。n%(m+1)==0. 先取者必败。

        多堆类似。


    威佐夫博奕(Wythoff Game)

    1.QUESTION

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

    2.分析

        这种情况下是颇为复杂的。我们用(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)。
        可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而 bk= ak + k,奇异局势有
    如下三条性质:
        1。任何自然数都包含在一个且仅有一个奇异局势中。
        由于ak是未在前面出现过的最小自然数,所以有ak > ak-1 ,而 bk= ak + k > ak-1 + k-1 = bk-1 > ak-1 。所以性质1。成立。
        2。任意操作都可将奇异局势变为非奇异局势。
        事实上,若只改变奇异局势(ak,bk)的某一个分量,那么另一个分量不可能在其他奇异局势中,所以必然是非奇异局势。如果使(ak,bk)的两个分量同时减少,则由于其差不变,且不可能是其他奇异局势的差,因此也是非奇异局势。
        3。采用适当的方法,可以将非奇异局势变为奇异局势。

        假设面对的局势是(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 - aj 即可。

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

        那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?我们有如下公式:
        ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...,n 方括号表示取整函数)
    奇妙的是其中出现了黄金分割数(1+√5)/2 = 1。618...,因此,由ak,bk组成的矩形近似为黄金矩形,由于2/(1+√5)=(√5-1)/2,可以先求出j=[a(√5-1)/2],若a=[j(1+√5)/2],那么a = aj,bj = aj + j,若不等于,那么a = aj+1,bj+1 = aj+1+ j + 1,若都不是,那么就不是奇异局势。然后再按照上述法则进行,一定会遇到奇异局势。
    3.原理:

      对于每一个必败局势对应的数对,将他们按第一个数从小到大排序,可知(ai,bi)中ai若组成一个序列,bi组成一个序列,这两个序列正好满足贝亚蒂序列的定义,应用贝亚蒂定理即可求解每一项的通项,答案就是上面的判奇异局势的公式。

    【补】EP6: Wythoff’s Game (威佐夫博弈)

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://yjq24.blogbus.com/logs/42826226.html

    大致上是这样的:有两堆石子,不妨先认为一堆有10,另一堆有15个,双方轮流取走一些石子,合法的取法有如下两种:

    1)在一堆石子中取走任意多颗;

    2)在两堆石子中取走相同多的任意颗;

    约定取走最后一颗石子的人为赢家,求必败态(必胜策略)。

    这个可以说是MR.Wythoff(Wythoff于1907年提出此游戏)一生全部的贡献吧,我在一篇日志里就说完有点残酷。这个问题好像被用作编程竞赛的题目,网上有很多把它Label为POJ1067,不过如果学编程的人不知道Beatty定理和Beatty序列 ,他们所做的只能是找规律而已。不熟悉的人可以先在这里玩几局~

    简单分析一下,容易知道两堆石头地位是一样的,我们用余下的石子数(a,b)来表示状态,并画在平面直角坐标系上。

    用之前的定理: 有限个结点的无回路有向图有唯一的核  中所述的方法寻找必败态。先标出(0,0),然后划去所有(0,k),(k,0),(k,k)的格点;然后找y=x上方未被划去的格点,标出(1,2),然后划去(1,k),(k,2),(1+k,2+k),同时标出对称点(2,1),划去(2,k),(1,k),(2+k,1+k);然后在未被划去的点中在y=x上方再找出(3,5)。。。按照这样的方法做下去,如果只列出a<=b的必败态的话,前面的一些是(0,0),(1,2),(3,5),(4,7),(6,10),…

    接下来就是找规律的过程了,忽略(0,0),记第n组必败态为(a[n],b[n])

    命题一:a[n+1]=前n组必败态中未出现过的最小正整数

    [分析]:如果a[n+1]不是未出现的数中最小的,那么可以从a[n+1]的状态走到一个使a[n+1]更小的状态,和我们的寻找方法矛盾。

    命题二:b[n]=a[n]+n

    [分析]:归纳法:若前k个必败态分别为 ,下证:第k+1个必败态为

    从该第k+1个必败态出发,一共可能走向三类状态,从左边堆拿走一些,从右边堆拿走一些,或者从两堆中拿走一些.下面证明这三类都是胜态.

    情况一:由命题一,任意一个比a[k+1]小的数都在之前的必败态中出现过,一旦把左边堆拿少了,我们只要再拿成那个数相应的必败态即可。

    情况二(从右边堆拿走不太多):这使得两堆之间的差变小了,比如拿成了 ,则可再拿成 ;

    情况二(从右边堆拿走很多):使得右边一堆比左边一堆更少,这时类似于情况一,比如拿成了 (其中a[m] ;

    情况三:比如拿成 ,则可再拿成 .

    综上所述,任何从 出发走向的状态都可以走回核中.故原命题成立.

    以上两个命题对于确定(a[n],b[n])是完备的了,给定(0,0)然后按照这两个命题,就可以写出(1,2),(3,5),(4,7),…

    这样我们得到了这个数列的递推式,以下我们把这两个命题当成是(a[n],b[n])的定义。

    先证明两个性质:

    性质一:核中的a[n],b[n]遍历所有正整数。

    [分析]:由命题一,二可得a[n],b[n]是递增的,且由a[n]的定义显然。

    性质二:A={a[n]:n=1,2,3,…},B={b[n]:n=1,2,3,…},则集合A,B不交。

    [分析]:由核是内固集,显然。

    看到这里大家有没有想到Beatty序列呢,实际上a[n]和b[n]就是一个Beatty序列。

     ,有  ,解方程 

    得  ,到此,我们找到了该必败态的通项公式。

    实际上这组Beatty序列还有一些别的性质,比如当一个数是Fibonacci数的时候,另一个数也是Fibonacci数;而且两者的比值也越来越接近黄金比,这些性质在得到通项公式之后不难证明。

    总的来说,这个问题给我们了哪些启示呢?首先用定理所说的方法找核,然后给出核的规律(递推,或是通项)并且证明。最后附上一张对应的必败态图.

     补充:贝亚蒂定理证明威佐夫定理:

     用有序数对(即两堆含石子的个数,规定第一个数不大于第二个数)表示某个状态,显然(0,0)是一个必败态。下面证明,根据下面的方法,可以构造出所有的必败态:

        1° (0,0)是必败态;

        2° 第k个必败态的两个数相差为k(记(0,0)为第0个必败态);

        3° 已知前k个必败态,则最小的没出现过的正整数为第k+1个必败态的第一个数。

        分情况讨论,很容易就把这件事说清楚了,下面几段证明可以跳过...

        证明:根据上述构造方法,有一个显然的事实,就是每个状态的第一个数比它后面一个状态的第一个数小,对第二个数也如此【1】。假如说后面状态的第一个数(记为A)比前面的小,那么前面状态的第一个数早就选A了,肯定轮不到后面的状态,与 3°矛盾。而前面状态中第二个数减第一个数的值比后面的小(由 2°),所以前面状态中第二个数当然比后面的小。

        同时,也可知不会出现重复的正整数【2】,因为如果出现重复的正整数,一定是前面状态的第二个数等于后面状态的第一个数(否则,由[1],将会出现严格不等关系)。而后面状态的第一个数不可能与前面重复,与 3°矛盾。

        现在,考虑构造出的第n个状态,当n=0时显然是必败态,设n=0,1,2,...,k-1时,这k个状态已经是必败态,下面证明第k个状态也是必败态。

        记此状态为(A,A+k)。先取者不可能变为前面的必败态,因为如果只动一堆石子而变为前面某个必败态,则两个必败态有重复的正整数,矛盾;如果动两堆石子,则差不变,同样不可能变为前面某个必败态。

        下面通过证明,先取者不管如何取石子,后取者都能变成前面某个必败态,从而证明(A,A+k)也是必败态。

        (1)先取者若动第一堆石子,则这个数肯定在前面的必败态中出现过(由 3°),而此时第二堆石子的数目肯定比前面那个必败态的两个数都要大(由 [1]),所以后取者一定可以取第二堆石子,变为前面那个必败态。

        (2)先取者若动第二堆石子:

             i .如果取完之后第二堆仍然不小于第一堆,则两堆石子的差减小,恰好和前面某个必败态吻合,而第一堆石子的数目肯定比前面那个必败态的第一个数大(由 [1]),后取者可以同时取两堆石子变为前面那个必败态。

             ii.若小于第一堆,则这个数在前面的必败态中出现过(由 3°),如果这个数是前面必败态的第二个数,则后取者只要动第一堆即可;如果很不巧,这个数是前面必败态的第一个数,而此时第一堆石子的数目又不大于前面必败态的第二个数,那此时两堆石子的差一定比前面那个必败态小,与更靠前的一个必败态吻合。后取者同时动两堆即可。

        (3)先取者若同时动两堆石子,则第一堆石子数在前面的必败态中出现过(由 3°),后取者动第二堆就行了。

        这就证完了。

        由刚才的构造必败态的方法,记{a_n},{b_n}分别为第一个数与第二个数构成的数列(除去第一对(0,0)),n=1,2,3, ... ,先写出两个数列的前几项:

        {a_n}: 1,3,4,6,...

        {b_n}: 2,5,7,10,...

        根据刚才的构造方法,显然两个数列都是严格递增的,而且没有重复的正整数,而且每一个正整数都会出现(由 3°,不可能漏掉某个正整数),且b_n-a_n=n。

        熟悉Beatty定理的人会立即看出,Beatty定理构造的数列恰好满足前三条!

        下面先介绍一下Beatty定理。

        取正无理数α,β,使得

        构造两个数列{a_n},{b_n},它们的通项分别为

        a_n为小于等于αn的最大整数,那个符号相当于高斯函数[ ]。

        数列显然都是正整数数列,Beatty定理指出,两个数列都是严格递增的,并且每个正整数在两个数列中出现且仅出现一次。

        严格递增好证,因为 1/α<1,α>1 ,所以{a_n}相邻两项取整前相减大于1,取整后后面一项显然也大于前面一项。对{b_n}同理。

        对于后一个命题,我们只要证明,对于任意正整数k,小于等于k的正整数在两个数列中恰好出现k次。

        设数列{a_n}的前p项小于等于k(而不含p+1项),又因为每一项取整前均为无理数,不可能取到整数值,于是有

        两者综合起来,就有等式

        这就是小于等于k的正整数在数列{a_n}中出现的次数。对于数列{b_n}同理。这样我们得到了小于等于k的正整数在两个数列中出现的总次数

        注意到,两个向下取整符号内的数均为无理数,于是有严格的不等式

        于是有

        这就证完了。

        回到刚才的必败态上,Beatty定理是一个很合适的定理,任取一组满足要求的α,β,构造出的数列就满足大部分条件,只剩最后一个条件,即 b_n-a_n=n,这只需取 β-α=1 即可。

        解出α,β的值如下:

        于是,我们就可以直接写出第n个必败态的公式

        至此,开始那个取石子游戏得到完美解决,而黄金分割数,竟然在一个看似毫不相关的问题中出现。

    Fibonacci博弈

    1、问题模型:

     有一堆个数为n的石子,游戏双方轮流取石子,满足: 

    (1)先手不能在第一次把所有的石子取完; 

    (2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。 约定取走最后一个石子的人为赢家。

    2、解决思路:

      当n为Fibonacci数时,先手必败。即存在先手的必败态当且仅当石头个数为Fibonacci数。 

        证明:根据“Zeckendorf定理”(齐肯多夫定理):任何正整数可以表示为若干个不连续的Fibonacci数之和。如n=83 = 55+21+5+2,我们看看这个分解有什么指导意义:假如先手取2颗,那么后手无法取5颗或更多,而5是一个Fibonacci数,那么一定是先手取走这5颗石子中的最后一颗,同理,接下去先手取走接下来的后21颗中的最后一颗,再取走后55颗中的最后一颗,那么先手赢。

        反证:如果n是Fibonacci数,如n=89:记先手一开始所取的石子数为y

        (1)若y>=34颗(也就是89的向前两项),那么一定后手赢,因为89-34=55=34+21<2*34。

        (2)y<34时剩下的石子数x介于55到89之间,它一定不是一个Fibonacci数,把x分解成Fibonacci数:x=55+f[i]+…+f[j],若,如果f[j]<=2y,那么对B就是面临x局面的先手,所以根据之前的分析,后手只要先取f[j]个即可,以后再按之前的分析就可保证必胜。

    6、应用:

    (1)可选步数为1-m的连续整数,直接取模即可,SG(x) = x % (m+1); 

    (2)可选步数为任意步,SG(x) = x; 

    (3)可选步数为一系列不连续的数,用mex(计算每个节点的值) 

    7、练习:hdoj 1847 1536 3980

    参考:

    http://blog.csdn.net/lgdblue/article/details/15809893

    http://www.cnblogs.com/celia01/archive/2011/11/15/2250171.html
  • 相关阅读:
    堆、栈、值类型、引用类型分析总结 Part 2
    DataGridView打印
    学习使用ArrayList
    C#与Java之比较
    【原创】串口通信测试程序
    彩色校验码的制作
    C#中使用进度条
    【原创】 Ajax之ModalPopup编程实例
    常用正则表达式
    堆、栈、值类型、引用类型分析总结 Part 1
  • 原文地址:https://www.cnblogs.com/SoulSecret/p/8962527.html
Copyright © 2020-2023  润新知