博弈 个人 见解

博弈 个人 见解

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

由于周測被虐,做了好久的博弈题,找了好多关于博弈的相关资料,感觉自己,似乎还是动了那么一点点。临睡前,就小小的总结一下,希望以后看到的时候,可以有所感悟吧!!

接下来是正题。

讲到博弈, 事实上也就是找规律,可是知道一般的博弈类型能够高速便捷的解决这个问题。

博弈的类型大致有下面几种:巴什博弈,威佐夫博奕,尼姆博弈。除此之外还有斐波那契博弈,sg模板等

巴什博弈:(摘自百度文库)

巴什博奕(Bash Game):

仅仅有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
     显然,假设n=m+1,那么因为一次最多仅仅能取m个,所以,不管先取者拿走多少个,后取者都可以一次拿走剩余的物品,后者取胜。因此我们发现了怎样取胜的法则:假设n=(m+1)r+s,(r为随意自然数,s≤m),那么先取者要拿走s个物品,假设后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这种取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。
     这个游戏还能够有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜。


巴什博弈主要内容是:n%(m+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=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,若都不是,那么就不是神秘局势。然后再依照上述法则进行,一定会遇到神秘
局势。


威佐夫博奕的思想就是那个公式:推断等号两边是否相等a(a是较小的数)==floor((b-a)*((sqrt(5.0)+1)/2)) 

要是相等的话就是先手输,否则先手赢


尼姆博弈:

尼姆博弈基本思想:

       两人从n堆物品中取随意个,先取完者胜。

       即将n堆物品的数量异或,得到的值假设为0,则先手败,反之先手胜。

       假设要求先手在胜的条件下,到神秘局势的方法数,则推断异或的值与每一堆原值异或后(结果应该表示该堆没有參加异或时的异或值)与原值比較大小,

假设小于,则方法数加一。且相应的方法后,该堆的数目应变为异或的值与每一堆原值异或的值。


尼姆博弈的主要内容就是:对每堆的数量进行异或运算


Fibonacci’s Game(斐波那契博弈)
斐波那契博弈模型,大致上是这种:

有一堆个数为 n 的石子,游戏两方轮流取石子,满足:
1. 先手不能在第一次把全部的石子取完;
2. 之后每次能够取的石子数介于1到对手刚取的石子数的2倍之间(包括1和对手刚取的石子数的2倍)。
约定取走最后一个石子的人为赢家,求必败态。

 

(转)分析:     
 n = 2时输出second;    
 n = 3时也是输出second;
 n = 4时,第一个人想获胜就必须先拿1个,这时剩余的石子数为3,此时不管第二个人怎样取,第一个人都能赢,输出first;
 n = 5时,first不可能获胜,由于他取2时,second直接取掉剩下的3个就会获胜,当他取1时,这样就变成了n为4的情形,所以输出的是second;  
 n = 6时,first仅仅要去掉1个,就能够让局势变成n为5的情形,所以输出的是first;     
 n = 7时,first取掉2个,局势变成n为5的情形,故first赢,所以输出的是first;    
 n = 8时,当first取1的时候,局势变为7的情形,第二个人可赢,first取2的时候,局势变成n为6得到情形,也是第二个人赢,取3的时候,second直接取掉剩下的5个,所以n = 8时,输出的是second;   
 …………     
 从上面的分析能够看出,n为2、3、5、8时,这些都是输出second,即必败点,细致的人会发现这些满足斐波那契数的规律,能够判断13也是一个必败点。     
 借助“Zeckendorf定理”(齐肯多夫定理):不论什么正整数能够表示为若干个不连续的Fibonacci数之和。n=12时,仅仅要谁能使石子剩下8且此次取子没超过3就能获胜。因此能够把12看成8+4,把8看成一个站,等价与对4进行”气喘操作”。又如13,13=8+5,5本来就是必败态,得出13也是必败态。也就是说,仅仅要是斐波那契数,都是必败点。
所以我们能够利用斐波那契数的公式:fib[i] = fib[i-1] + fib[i-2],仅仅要n是斐波那契数就输出No。

  经常使用的博弈类型,基本就是这些。以后碰见很多其它的再来补充。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118491.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月5日 下午12:00
下一篇 2021年12月5日 下午1:00


相关推荐

  • Jlink或者stlink用于SWD接口下载程序

    Jlink或者stlink用于SWD接口下载程序最近要使用stm32f103c8t6最小系统板,直接ISP串口下载程序太麻烦,就想着使用swd接口来调试。结果:通过SWD接口下载程序成功,但调试失败,还不知原因,会的的人麻烦交流一下。SWD接口:3.3VDIO(数据)CLK(时钟)GND1.首先声明jlink和stlink都有jtag和swd调试功能。jlink接口如下:如图,我使用的就是VCC…

    2022年4月25日
    45
  • 基于TCP的socket编程原理概述「建议收藏」

    基于TCP的socket编程原理概述「建议收藏」解:服务器端:1)创建套接字socket;2)bind(将套接字绑定到本地地址和端口上)3)listen(将套接字设置为监听模式,准备接受连接请求)4)accept等待客户请求到来,当请求到后,接受连接请求,返回一个新的对应于此次连接的套接字5)用返回的套接字和客户端进行通信(send/receive)6)返回等待另个客户请求7)关闭套接字客户端:1)创

    2022年10月18日
    5
  • 正则表达式:匹配不包含某些字符和不包含某些字符串的写法「建议收藏」

    正则表达式:匹配不包含某些字符和不包含某些字符串的写法「建议收藏」不包含某些字符:不包含某些字符串:当然下面不包含字符串可以演变为不包含字符使用,看你喜欢使用。

    2022年7月2日
    33
  • MyEclipse8.5免费的注册码[通俗易懂]

    MyEclipse8.5免费的注册码[通俗易懂]打开MyEclipse8.5,点击工具栏上的”MyEclipse”菜单–》SubscriptionInformation–》填入Subscribe和SubscriptionCode,如下:这三个,MyEclipse8.5注册码,到2017年   (1)Subscriber:jom   SubscriptionCode:wLR8ZC-855575-625668535

    2026年4月19日
    4
  • 寄存器,移位寄存器的电路原理以及verilog代码实现「建议收藏」

    寄存器,移位寄存器的电路原理以及verilog代码实现「建议收藏」寄存器:用以存放二进制代码的电路,下图为由维特阻塞D触发器组成的4位数码寄存器:逻辑功能分析:1.异步端CR置0时,输出置0;2.同步并行置数:D0~D3为4个输入代码,当CP上升沿到达时,D0

    2022年7月1日
    100
  • 使用pycharm过程中安装第三方库的四种方法

    使用pycharm过程中安装第三方库的四种方法在利用 pycharm 编写程序时 经常需要安装第三方库 这里总结几种安装第三方库的方法 一 anaconda 软件内安装使用 anaconda 安装库非常方便 具体步骤可以看我的上一篇博客 https blog csdn net zj3501ZZ article details 二 anaconda 命令行安装打开 anaconda 命令行 如下图 点击 anacondaprom

    2026年3月26日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号