zoukankan      html  css  js  c++  java
  • 博弈论

    巴什博奕(Bash Game):

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

    若(m+1) | n,则先手必败,否则先手必胜。

    显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿

    走剩余的物品,后者取胜.因此我们发

    现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取

    者拿走k(≤m)个,那么先取者再拿

    走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜.总之,要保持给对手留

    下(m+1)的倍数,就能最后获胜.

    斐波那契博弈(Fibonacci Nim)

    有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下:

    1)先手不能在第一次把所有的石子取完,至少取1颗;

    2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍。

    约定取走最后一个石子的人为赢家,求必败态。

    结论:当n为Fibonacci数的时候,必败。

    f[i]:1,2,3,5,8,13,21,34,55,89……

    用第二数学归纳法证明:

    为了方便,我们将n记为f[i]。

    1、当i=2时,先手只能取1颗,显然必败,结论成立。

    2、假设当i<=k时,结论成立。

    则当i=k+1时,f[i] = f[k]+f[k-1]。

    则我们可以把这一堆石子看成两堆,简称k堆和k-1堆。

    (一定可以看成两堆,因为假如先手第一次取的石子数大于或等于f[k-1],则后手可以直接取完f[k]

    ,因为f[k] < 2*f[k-1])

    对于k-1堆,由假设可知,不论先手怎样取,后手总能取到最后一颗。下面我们分析一下后手最后取

    的石子数x的情况。

    如果先手第一次取的石子数y>=f[k-1]/3,则这小堆所剩的石子数小于2y,即后手可以直接取完,此时

    x=f[k-1]-y,则x<=2/3*f[k-1]。

    我们来比较一下2/3f[k-1]与1/2f[k]的大小。即4f[k-1]与3f[k]的大小,对两值作差后不难得出,后者大。

    所以我们得到,x<1/2*f[k]。

    即后手取完k-1堆后,先手不能一下取完k堆,所以游戏规则没有改变,则由假设可知,对于k堆,后手

    仍能取到最后一颗,所以后手必胜。

    即i=k+1时,结论依然成立。

    那么,当n不是Fibonacci数的时候,情况又是怎样的呢?

    这里需要借助“Zeckendorf定理”(齐肯多夫定理):任何正整数可以表示为若干个不连续的Fibonacci数之和。

    关于这个定理的证明,感兴趣的同学可以在网上搜索相关资料,这里不再详述。

    分解的时候,要取尽量大的Fibonacci数。

    比如分解85:85在55和89之间,于是可以写成85=55+30,然后继续分解30,30在21和34之间,所以可以

    写成30=21+9,

    依此类推,最后分解成85=55+21+8+1。

    则我们可以把n写成 n = f[a1]+f[a2]+……+f[ap]。(a1>a2>……>ap)

    我们令先手先取完f[ap],即最小的这一堆。由于各个f之间不连续,则a(p-1) > ap + 1,则有f[a(p-1)] > 2*f[ap]。

    即后手只能取f[a(p-1)]这一堆,且不能一次取完。

    此时后手相当于面临这个子游戏(只有f[a(p-1)]这一堆石子,且后手先取)的必败态,即先手一定可以取到这

    一堆的最后一颗石子。

    同理可知,对于以后的每一堆,先手都可以取到这一堆的最后一颗石子,从而获得游戏的胜利。

    威佐夫博奕(Wythoff Game):

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

    取光者得胜.

    奇异局势下先手必败,非奇异局势下先手必胜。

    这种情况下是颇为复杂的.我们用(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∈N)

    奇妙的是其中出现了有关黄金分割数的式子:(1+√5)/2 =1.618...,若两堆物品个数分别为x,y(x<y),则k=y-x,再判断x

    是否等于[(y-x)*( √5+1)/2] 即可得知是否是奇异局势。

    参考例题:POJ1067取石子游戏

    尼姆博奕(Nimm Game):

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

    这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示某种局势,首先(0,0,0)显然是奇异局势,无论谁面对奇异

    局势,都必然失

    败.第二种奇异局势是(0,n,n),只要与对手拿走一样多的物品,最后都将导致(0,0,0).仔细分析一下,(1,2,3)也是奇异局势

    ,无论对手如

    何拿,接下来都可以变为(0,n,n)的情形.

    计算机算法里面有一种叫做按位模2加,也叫做异或的运算,我们用符号xor表示这种运算.这种运算和一般加法不同的一点

    是1+1=0.先看

    (1,2,3)的按位模2加的结果:

    1 =二进制01

    Xor 2 =二进制10

    Xor 3 =二进制11

    ———————

    0 =二进制00

    对于奇异局势(0,n,n)也一样,结果也是0.

    任何奇异局势(a,b,c)都有a xor b xor c =0。该结论可以推广至若干堆,都是成立的。

    如果我们面对的是一个非奇异局势(a,b,c),要如何变为奇异局势呢?假设a < b< c,我们只要将c 变为a xor b,即可,

    因为有如下的运算

    结果: a xor b xor (a xor b)=(a xor a) xor (b xor b)=0 xor 0=0.要将c 变为a xor b,只要从c中减去c-(a xor b)即可.

    lqhsr:

    推荐两篇文章虽多少有些相似但 道之所存,师之所存也

    https://blog.csdn.net/Clove_unique/article/details/53868567

    https://blog.csdn.net/A_Comme_Amour/article/details/79347291

    Nim Staircase博奕:

    这个问题是尼姆博弈的拓展:游戏开始时有许多硬币任意分布在楼梯上,共n阶楼梯从地面由下向上编号为0到n。

    游戏者在每次操作时

    可以将楼梯j(1<=j<=n)上的任意多但至少一个硬币移动到楼梯j-1上。游戏者轮流操作,将最后一枚硬币移至地上

    (0号)的人获胜。

    算法:将奇数楼层的状态异或,和为0则先手必败,否则先手必胜。证明略。

    例题:Poj1704

    这道题可以把两个棋子中间间隔的空格子个数作为一堆石子,则原题转化为每次可以把左边的一堆石子移到相邻的

    右边的一堆中。也就

    是阶梯尼姆博弈,注意对输入数据先排序,然后倒着往前数(a[n]-a[n-1]-1为第一个),奇数个数到的就做一下xor,

    其中最前面的看

    做a[1]-0-1

    源地址

    以下为另一博客

    几类经典的博弈问题

    阶梯博弈

    定义

    即有n个阶梯呈升序排列,每个阶梯上有若干个石子,可行的操作是将一个阶梯上的石子移任意个(>0)到前一个台阶。

    当没有可行操作时(所有石子都被移动到了地面,即第0号台阶)输。

    转化

    阶梯博弈实际上还是Nim游戏(所以Nim真的很重要),它等价于奇数号台阶的Nim游戏。

    证明

    为什么是奇数号台阶呢?

    因为除了1号台阶之外,每种操作都是可以对应的。

    倘若你的对手移动的是奇数号台阶,那么按照Nim游戏的移法进行移动即可。

    倘若你的对手移动的是偶数号台阶(2n),那么我们就把等量的石子从2n-1移动到2n-2,对奇数号台阶没有任何影响。

    这么移动的话,最后奇数号台阶上就不会有石子了。然后就会开始移动偶数号台阶2n。同样的把等量的石子从2n-1移动

    到2n-2。因为台阶编号始终≥2,因此最后一步必然是我们的。

    如果换成偶数的话,当后手移动1号台阶时,我们就无法对其进行模仿了。因此只有奇数号是可行的。

    结论

    如果奇数号台阶上石子数的异或和=0,则先手必败。

    原文:https://blog.csdn.net/a1799342217/article/details/78265265

    解释

    假设我们是先手...所给的阶梯石子状态的奇数堆做Nim先手能必胜...我就按照能赢的步骤将奇数堆的石子移动到偶数堆...

    如果对手也是移动奇数堆..我们继续移动奇数堆..如果对手将偶数堆的石子移动到了奇数堆..那么我们紧接着将对手所移动

    的这么多石子从那个偶数堆移动到下面的奇数堆...两次操作后...相当于偶数堆的石子向下移动了几个..而奇数堆依然是原来

    的样子...即为必胜的状态...就算后手一直在移动偶数堆的石子到奇数堆..我们就一直跟着他将石子继续往下移..保持奇数堆

    不变...如此做下去..我可以跟着后手把偶数堆的石子移动到0..然后你就不能移动这些石子了...所以整个过程..将偶数堆移动到

    奇数堆不会影响奇数堆做Nim博弈的过程..整个过程可以抽象为奇数堆的Nim博弈...

    原文:https://www.cnblogs.com/jiangjing/p/3849284.html

    讨论

    这个问题与Nim游戏的区别在于移走的硬币不是被扔掉而是被放进了另一堆硬币之中,考虑能否将这一部分楼梯排除考虑范围。

    奇数号楼梯只能将硬币扔到偶数号楼梯之中,同样偶数号楼梯上的硬币也只会被扔上奇数号楼梯。只考虑奇数号楼梯Nim,若

    偶数楼梯只作容器,那么游戏变为Nim。我们仍然可以用Nim的方法判断必败状态。

    翻转硬币

    描述

    N枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开 始对硬币按1到N编号。

    Alice和Bob轮流根据某些约束翻硬币(如:每次只能翻一或两枚,或者每次只能翻连续的几枚),但他所翻动的硬币中,

    最右边的必须是 从正面翻到反面。谁不能翻谁输。

    讨论

    基于转化的思想,如果将正面朝上,位置i的硬币看作一堆规模为i的石子,我们就能看到游戏与Nim的相似点。

    不过有许多Nim中的合法操作在这个游戏中是无法实现的,比如说,我们就无法从一堆规模为10的石子中取出其中的5个。

    不过我们将10与5同时翻转,所得到的状态,对应的Nim状态SG值与从10中取5是相同的。因此我们猜想这个游戏的状态SG

    函数值与对应的Nim相同。

    事实上,虽然这个游戏无法实现Nim的所有操作,但它的状态所能到达的状态SG函数值集合与对应的Nim游戏状态相同。

    因此,它的状态SG函数值与对应Nim相同。

    实际上,有这样的结论:

    局面的SG值为局面中每个正面朝上的棋子单一存在时的SG值的异或和。

    Anti-SG游戏

    我们不妨从最本质的Anti-Nim游戏入手。

    描述

    Alice和Bob轮流取N堆石子。每次只能从一堆中取出任意数目的石子,但不能不取。取走最后一个石子者败。

    讨论

    这个问题有一个结论,先手必胜当且仅当:

    所有堆的石子数都为1且游戏的SG值为0

    有些堆的石子数大于1且游戏的SG值不为0

    **下面给出证明。 **

    游戏分三种情况:

    每个堆只有一个石子

    如果异或值=0,即有偶数个堆,则先手必胜(A)

    如果异或值≠≠0,即有奇数个堆,则先手必败(B)

    只存在一堆石子数>1,则先手必胜(C)

    可以发现在这种情况下,异或值一定≠≠0。并且可以发现,在这种情况下先手一定有一种方法使得剩下奇数个

    石子个数都为1的堆,即转化为B状态。所以先手必胜。

    存在至少2堆石子数>1

    当异或值=0时,先手必败(D)

    当异或值≠≠0时,先手必胜(E)

    关于这一步的证明应该把这两个状态结合来看。

    首先,参考Nim游戏的证明,当异或值=0时,无论进行怎样的操作都会使异或值≠≠0;而当异或值≠≠0时,

    一定存在一种移动方案,使得异或值=0,这个性质符合N,P状态的转换。

    而不断地进行这种转换,总会有一个时刻局面变成了C状态,而C状态一定是从D状态转移过来的。所以可以证明

    D状态总会在一个时刻必须转移到先手必胜态,即D状态是先手必败态。相应地,我们就可以证明E状态是先手必胜态。

    证明结束。

    延伸

    我们来定义Anti-SG游戏

    Anti-SG游戏规定,决策集合为空的游戏者赢。

    Anti-SG其他规则与SG游戏相同

    定理:SJ定理

    对于任意一个Anti-SG游戏,如果我们规定当局面中所有的单一游戏的SG值为0时,游戏结束,则先手必胜当且仅当:

    (1)游戏的SG函数不为0且游戏中某个单一游戏的SG函数大于 1;

    (2)游戏的SG函数为0且游戏中没有单一游戏的SG函数大于1。

    其实我们可以类比Nim游戏与SG函数的证明方法,来感性地理解一下SJ定理的正确性。这里mex和sg的定义都是完全

    相同的,不再给出证明。

    Multi-SG游戏

    同样从一个最简单的问题出发。

    描述

    Alice和Bob轮流取N堆石子,每一次可以从任意一堆中拿走任意个石子,也可以将一堆石子分为两个小堆。先拿完者获胜。

    讨论

    这个问题实际上是一个经典的Lasker’s Nim游戏:每一轮允许两会中操作之一:①从一堆石子中取走任意多个②将一堆数量

    不少于2的石子分成都不为空的两堆。

    这个问题可以用SG函数来解决。首先,操作①其实和Nim游戏没什么区别,对于一个石子数为k的点来说,后继可以为0…k-1。

    而操作②实际上是把一个游戏分成了两个游戏。根据上文提到的游戏的和的概念,这两个游戏的和应该为两个子游戏的SG函数

    值的异或。而求某一个点的SG函数要利用它的后继,它的后继就应该为当前局面能产生的所有单一游戏,以及当前局面所有能

    分成的多个单一游戏的游戏的和。

    比如说,状态3的后继有:0、1、2、(1,2),他们的SG值分别为0、1、2、3,所以sg(3) = 4。

    那么这样,我们就能用SG函数解决这个问题。

    但是,如果数据范围非常大的时候SG函数就不能用了,通过打表可以发现一个更优美的结论:

             ⎧x−1,x%4=0
    

    step(u)=
    ⎨x,x%4=1∨x%4=2
    ⎩x+1,x%4=3

    那么这就是一道结论题?

    延伸

    根据题目的描述,尝试定义Multi-SG游戏

    Multi-SG 游戏规定,在符合拓扑原则的前提下,一个单一游戏

    的后继可以为多个单一游戏。

    Multi-SG其他规则与SG游戏相同。

    考虑更一般的Multi-SG游戏解法,发现依然和SG函数有关。

    对于一个单一游戏,不同的方法可能会将其分成不同的多个单一游戏。每一方法对应的多个单一游戏

    的游戏的和即可以表示这种方法的NP状态。而这个单一游戏的SG函数即为未在所有方法的SG函数值中出现过的最小值。

    Every-SG游戏

    又一个SG函数的变形。

    描述

    给定一个有向无环图,某些定点上有一些棋子。Alice和Bob轮流移动棋子,每一次移动要求必须移动所有

    可以移动的棋子,无法移动的人判负。

    讨论和延伸

    很容易想到:对于我们可以赢的单一游戏,我们一定要拿到这一场游戏的胜利!

    所以,我们只需要考虑如何让我们必胜的游戏尽可能长的玩下去。

    但是对手却不希望他必败的单一游戏玩的太久,这就是Every-SG游戏不同于其他 SG游戏的地方:一般的

    SG游戏只有胜与负之间的博弈,而 Every-SG 游戏又添加了长与短之间的博弈。

    定义Every-SG游戏:

    对于还没有结束的单一游戏,游戏者必须对该游戏进行一步决策;

    Every-SG游戏的其他规则与普通 SG游戏相同

    在通过拓扑关系计算某一个状态点的SG函数时(事实上,我们只需要计算该状态点的SG值是否为0),

    对于SG值为0的点,我们需要知道最快几步能将游戏带入终止状态;对于SG值不为0的点,我们需要知道

    最慢几步游戏会被带入终止状态,我们用step函数来表示这个值。

    那么

          ⎧0,u为终止状态
    

    sg(x)=
    ⎨max{step(v)},sg(u)≠0∧v为u的后继∧sg(v)=0
    ⎩min{step(v)},sg(u)=0∧v为u的后继

    定理

    对于Every-SG游戏先手必胜当且仅当单一游戏中最大的step为奇数。

    定理是显然的:最大的单一游戏步数如果是奇数的话那么肯定是先手取得进行最后一步,否则一定是对手

    取走最后一个棋子。

    树的删边游戏

    描述

    给出一个有 N个点的树,有一个点作为树的根节点。游戏者轮流从树中删去边,删去一条边后,不与根节点

    相连的部分将被移走。谁无法移动谁输。

    讨论

    我们有如下定理:

    叶子节点的SG值为0;中间节点的SG值为它的所有子节点的SG值加1后的异或和。

    证明(数学归纳法)

    一个节点和两个节点的情况显然成立。

    我们假设小于 K 个节点的任意情况均成立,下面证明(K+1)个节点的情况也成立。我们将证明分成两部分:

    证明根节点只有一个孩子的情况符合要求;

    证明根节点有多个孩子的情况符合要求。

    先证明第一部分:

    我们假设树G的根为A,A只与B相连,图中共有N+1个节点,去掉A后以B为根节点的图为G’,下面证明SG(G)=SG(G’+1).

    若我们去掉 AB之间的边,则所有的边都被删除

    ∴G存在 SG值为0的后继局面;①

    若我们去掉 G中的除AB外的边 E,则删除后总边数小于等于K

    设以B为根的G’去掉E以后的后继局面的SG值为P

    ∵以A为根的G去掉E以后图中的总边数小于等于K

    又∵中间节点的SG值为它的所有子节点的SG值加1后的异或和

    ∴A为根的G去掉E以后的后继局面的SG值为P+1

    ∵以B为根的G’可以通过去边操作使得后继局面的SG值变为0到SG(G’)-1

    ∴以A 为根的G可以通过删除 G’中有的边使得后继局面的SG值变为1到SG(G’) ②

    由①②得,SG(G)=SG(G’)+1

    再证明第二部分

    我们假设树G的根为A,A与T个节点相连,为B1B1、B2B2、…、BTBT,设去掉(T-1)个与A相连的边

    (ABXABX保留)后,以A为根的树为GXGX,第二部分即证明SG(G)=SG(G′1G1′) xor SG(G′2G2′) xor … xor SG(G′TGT′)

    而根据前文提到的知识,这就有相当于是一个游戏的和,或者简单来说就是一个Nim游戏!

    至此证明结束。

    延伸

    **一个例题:Christmas Game(PKU3710) **

    **题目大意:**

    有 N个局部联通的图。

    Harry 和 Sally轮流从图中删边,删去一条边后,不与根节点相连的部分将被移走。Sally为先手。

    图是通过从基础树中加一些边得到的。

    所有形成的环保证不共用边,且只与基础树有一个公共点。

    谁无法移动谁输。

    这道题与我们上一节所讲的内容基本相同,唯一不同的是图中出现了环,所以,环的处理成为了解题的关键。

    我们来分析环的性质:环保证不共用边,且只与基础树有一个公共点。因此题中所有的环都是从树中某一个点连出又连回同一个点的简单环!

    我们通过分析发现了如下奇妙的性质:

    对于长度为奇数的环,去掉其中任意一个边之后,剩下的两个链长度同奇偶,抑或之后的SG值不可能为奇数,所以它的SG值为1

    对于长度为偶数的环,去掉其中任意一个边之后,剩下的两个链长度异奇偶,抑或之后的SG值不可能为0,所以它的SG值为0

    所以我们可以去掉所有的偶环,将所有的奇环变为长短为1的链,就将这道题转化成了上面已经讨论过的模型。

    无向图的删边游戏

    描述

    我们将Christmas Game这道题进行一步拓展——去掉对环的限制条件,这个模型应该怎样处理?

    无向图的删边游戏:

    一个无相联通图,有一个点作为图的根。

    游戏者轮流从图中删去边,删去一条边后,不与根节点相连的部分将被移走。

    谁无路可走谁输。

    讨论

    对于这个模型,有一个著名的定理——Fusion Principle。

    定理

    我们可以对无向图做如下改动:将图中的任意一个偶环缩成一个新点,任意一个奇环缩成一个新点加一个新边;

    所有连到原先环上的边全部改为与新点相连。这样的改动不会影响图的SG 值。

    这个原理的证明十分复杂,这里不给出证明(记个结论吧)

    这样的话,我们可以将任意一个无向图改成树结构,“无向图的删边游戏”就变成了“树的删边游戏”。

    原文:https://blog.csdn.net/Clove_unique/article/details/53868567

    来不及看的:

    http://www.cnblogs.com/celia01/archive/2011/11/15/2250171.html

    https://blog.csdn.net/qiankun1993/article/details/6765688

  • 相关阅读:
    [转]Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数
    oracle本月、上月、去年
    Oracle 物理视图刷新报错ORA-00942
    [转]Oracle trunc()函数的用法
    [转]物化视图创建 及 刷新机制修改
    [转]oracle制定定时任务(dbms_jobs)
    【转】Windows平台下的Subversion安装配置新手指南
    【转】数字签名与数字证书
    [转]SQL 常用函数及示例
    【转】视图、索引、存储过程 、触发器、游标及事务
  • 原文地址:https://www.cnblogs.com/lqhsr/p/10886033.html
Copyright © 2011-2022 走看看