zoukankan      html  css  js  c++  java
  • 【转】关于博弈论基础知识的一些总结

    博弈论是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论。

    基础的基础

    a) 当前执行者想赢。这个是必要的,有时候题目中判别胜负的条件会与平时练习的恰好相反,此时你就应该按照题目要求思考,即在经典模型中思考当前执行者想输的策略。

    b) 定义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;我们在下文中称之为必胜点和必败点。

    三个经典模型

     

    关于博弈论基础知识的一些总结

    巴什博弈(Bash Game)

    定义:只有一堆石子,两人轮流取,最少取一个,最多取m个,最后去完者为胜。

    思考:

    ①当石子个数n=0时为必败点;(根据题意得来)

    ②当石子个数0<n<=m时为必胜点;(可以到达状态①)

    ③当石子个数n=m+1时为必败点;(只能到达状态②)

    ④当石子个数m+1<n<=(m+1)+m时为必胜点;(可以到达状态③)

    ⑤当石子个数n=(m+1)+m+1时为必败点;(只能到达状态④)

    ……

    当n为m+1的整数倍时为必败点

    把n写成这样的格式:n=r*(m+1)+s;

    只要s不为0,即可胜。

    威佐夫博奕(Wythoff Game)

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

    思考:

    把两堆石子的集合写为(a,b)不失一般性令我们只考虑a<=b的情况;

    我们依次考虑(0,0)-(0,*)……(n,n)-(n,*)的情况。把所有状态看成一个二维数组,我们只需考虑上三角的情况;

    (0,0)必败点,故(0,*)为必胜点;(1,1)一步可以取完,故也为必胜点;

    (1,2)无论怎样取都只能到达必胜点,所以(1,2)为必败点;

    (1,*)(2,*)可一步到达(1,2),故其都为必胜点;

    此时我们发现一些规律,只有一些特殊的点是必败点,其余大多数情况为必胜点,再次我们不妨称必败点为“奇异局势”,这个定义我们在以后的学习中还可用到;

    当(0,*)(1,*)(2,*)都考虑完后,开始考虑(3,*);(3,3)显然可一次取完为必胜点,(3,4)可以减(2,2)到达(1,2),所以也为必胜点;这里我们可以看到一个特点,如果a,b之差等于上述所提到“奇异局势”两堆石子之差时,则(a,b)-(m,m)是可以到达上述情况的,所以凡是后面要找到的点a,b,之差不能等于前面所找到的奇异局势;这时我们发现(3,5)为奇异局势;同理,(3,*)和(5,*)都为必胜点了,和上次推导一样(4,4)(4,5)(4,6)都为必胜点(4,7)为我们要找的奇异局势;(4,*)(7,*)必胜;(6,*)这一行还会有一个奇异局势,我们找到它是(6,10),相差为4;

    此时,我们一经发现了一个规律,第i个奇异局势a,b之差为i,如果字典顺序寻找,则(a,b)中的a,为之前奇异局势中未出现的最小的自然数;写到这,你或许可以编程解决一些这样的问题了吧,但这貌似还是有点麻烦,没关系,数学家已经给出了我们a的通项公式(如要了解推导过程可自行查阅资料,这里不作为重点讨论),即ai=[i*(1+√5)/2](方括表示下取整),bi=ai+i,。

    尼姆博奕(Nim Game)

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

    思考:当只剩下一堆石子时,显然先手可以一次取完石子取得胜利,此为必胜点。当剩下两堆石子时,假如石子不相同,当前执行者一定可以取若干石子使得两堆相同(n,n),然后只要每次取石子数与对手相同(n-x,n-x),最后肯定会取完石子(0,0),所以(n,n)是必败点。当只有两堆石子时,站在对手的角度考虑,会发现当且仅当石子数相同才会是必败点。当三堆都有的时候情况有点复杂,(1,1,*)(2,2,*)……显然为必胜点,还有(1,2,3)是必败点,因为这个点只能到达前面所提到的必胜点。顺着这个思路,我们可以推出最小的必败点是(1,4,5)和(2,4,6),分析以上情况。假设有一个函数,设为SG(a1,a2,a3),这个函数的值就是这个点的胜负状态这里标记为1(必胜点)和0(必败点),假如这个点是必败点,设SG(a1,a2,a3)=0,那么它肯定只能到达必胜点,也就是减少任何一堆石子数量的值,假设减少a3为a3',他的函数值SG(a1,a2,a3')应该一定为1;当SG(a1,a2,a3)=1时,一定存在某一堆减少数量假设也是改变a3',就可以使SG(a1,a2,a3')=0;还需满足一点就是SG(0,0,0)=0;根据上面的条件,我们或许想不出SG(a1,a2,a3)这个函数的表达式,当然数学家们如何想出的,我们不得而知,我们可以做的只有惊叹!接下来我们欣赏这个完美的结论吧,它已经推广到了N堆石子的情况。

    对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示异或(xor)运算。神奇吧,很难想像怎么和异或扯上关系的,然而他的证明也并不复杂,在没有发现之前是很难想得出来的,这个的过程一定不缺乏深度思维的碰撞和灵感的火花。接下来我们就对他进行证明:

    1、最后的状态,全为零,显然成立;

    2、对于某个局面(a1,a2,...,an),若a1^a2^...^an<>0,一定存在某个合法的移动,将ai改变成ai'后满足a1^a2^...^ai'^...^an=0。不妨设a1^a2^...^an=k,则一定存在某个ai,它的二进制表示在k的最高位上是1(否则k的最高位那个1是怎么得到的)。这时ai^k<ai一定成立。则我们可以将ai改变成ai'=ai^k,此时a1^a2^...^ai'^...^an=a1^a2^...^an^k=0。 

    3、对于某个局面(a1,a2,...,an),若a1^a2^...^an=0,一定不存在某个合法的移动,将ai改变成ai'后满足a1^a2^...^ai'^...^an=0。因为异或运算满足消去率,由a1^a2^...^an=a1^a2^...^ai'^...^an可以得到ai=ai'。所以将ai改变成ai'不是一个合法的移动。证毕。

    通俗的说,如果异或的结果为0,那么改变任何一个数,显然结果肯定不能为0了,如果结果不为0,改变某个特定一个数,可以使结果等于0,而异或运算恰好就满足这个条件。因而成就了这个不可思议的定理。

  • 相关阅读:
    CF1119H
    oracle 第06章 数据字典
    oracle col命令
    oracle 第05章 SQL语句
    oracle 第04章 字符集
    oracle 第03章 体系结构
    oracle 第02章 基本操作
    oracle 第01章 安装
    oracle启动、关闭、重启脚本
    第十一周-学习进度条
  • 原文地址:https://www.cnblogs.com/baocong/p/6751859.html
Copyright © 2011-2022 走看看