zoukankan      html  css  js  c++  java
  • 博弈小结

    这几天一直再看博弈的东西,现在按照自己的理解总结一下:

    首先需要明白的是必胜态和必败态的理论:1所有的末状态为必败态;2从P状态只能转移到必胜态N;3从N从能找到一个转移使其到P状态。下面将的所有的定理结论都是基于这三条的,所以应该好好理解。

    一、博弈论基础知识

    1巴什博弈(bash game)

    一堆含有n个石子游戏,每次只能去1..m个,问先手是必胜还是必败,这个很简单,只需要判断n%(1+m)就行了。

    2威佐夫博弈

    有两堆石子,每次要么从一堆中取出任意一个,要么从两堆中取走相同数量的石子,先取光着为胜,为先手是否必胜,这个用到了一个结论,就是奇异和非奇异局势。

    一个奇异局势不管怎么转移都转换为非奇异的,任何一个非奇异局势总能找到一个方法转移到奇异的,这样就对于了我们上面的规则了,我们求出任何一个奇异局势的公式为ak=[k*(1+sqrt(5))/2],bk=ak+k,k=0,1,...,这样任意给出一个局势(a,b),我们先求出k=b-a,判断a是否为ak(=[k*(1+sqrt(5))/2]),因为每个奇异局势都是固定的,且差满足增1,前几个奇异局势为(0,0),(1,2),(3,5),(4,7),....

    3尼姆博弈(Nim game)

    说给出n堆石子,每次从任意一堆中取走任意多个,问先手是否必胜,这个用到异或操作了,假设初始状态为a1,a2,a3,...,an,我们求出sg=a1XORa2...XORan,如果sg为0,则必败,如果不是0,必胜,其实这个规律就可以推出上面三条PN规则。

    它的一种变形是先取光着必败,其实方法不变,只是稍微加一条特殊情况,如果全为1,我们只需要判断n的奇偶性就可以得出结果,如果不全为1,我们按照上面的方法,求出它们的奇异,若为0则必败否则必胜(抓住那三条理论,不管先取光的为胜或为负,我们要做的总是让对手满足奇异局势,由于非奇异局势总可以转化为奇异局势,所以满足了PN规则,只是我们的走法不同,策略不同而且)。

    还有复杂点的是SG函数:其实上面所有的情况都可以使用SG值来抽象,它的功能非常强大,常常用于多个游戏的并,有一个公式为SG=SG1xorSG2...及总的游戏和的sg值为每个游戏sg值的异或,我们可以根据这个来求出总的游戏的PN状态。

    对于一个博弈树,给出一个状态,我们常规方法是从这个状态出发找到所有的子局面,根据子局面判断此状态的PN值,但是有个题目子状态非常多,造成复杂度过高,我们选择从底往上扩展,详见上一篇博客。

  • 相关阅读:
    Javascript 如何识别数组
    新手 如何搭建一个vue项目详解
    javasScript 七种数据类型
    WPF实现动画的几种方式及其小案例
    问题清单
    2020软件工程个人作业06——软件工程实践总结作业
    我的“捡漏”生涯——小黄衫篇
    2020软件工程作业05
    2020软件工程作业03
    Python: list indices must be integers or slices, not float问题
  • 原文地址:https://www.cnblogs.com/buptLizer/p/2163562.html
Copyright © 2011-2022 走看看