• 组合游戏(博弈)


    转自:https://www.cnblogs.com/Newdawn/p/4005444.html   

    昨天看大白书翻到了组合游戏这章,看着发觉原来是博弈论的内容,于是便看下去了。真是不看不知道,一看才知道自己的水平有多弱,不过好在还是集中精神地看了大部分。从Nim游戏(n堆石子,每人每次可以从任意一堆中取至少1个、至多整堆的石子,不能取者为输)开始讲起,引入必胜态、必败态的概念——

      1. 一个状态是必败状态当且仅当它的所有后继都是必胜状态。

      2. 一个状态是必胜状态当且仅当它至少有一个后继是必败状态。

    这是刘汝佳大神说的,说得通俗一点就是,必败态的所有后继都是必胜态,必胜态只需有一个后继是必败态即可(这里说的必胜态、必败态都是针对先手来说必胜、必败的意思)。可以看出必败态满足的条件比必胜态更苛刻。没有后继状态的是必败态(也就是终态),一般规则都是不能操作的游戏者为输(是在双方都足够聪明的前提下的),然后可以用一个有向无环图来表示二人博弈的过程。实际上,并不需要这样子做。对于Nim游戏来说,早有科学家给出了一个定理:状态(x1,x2.....xn)为必败状态当且仅当x1^x2^......^xn= 0,即把所有数进行异或和操作,也称Nim sum。能够证明,当Nim sum为0 时为必败状态,非0 时为必胜状态,这是因为,当前状态为0 时,进行的某个操作总能使Nim sum变为非0(因为改变任何一个数字(即任何一堆石子),它的二进制形式会有一位或多位的变化,此时原本各位上都为0 的Nim sum就会有所变动(某些位会变成1)),即所有后继都是必胜状态了;当前状态为非0 时,必定会有某个操作能使Nim sum变为0(只需在Nim sum二进制上那些为1的位上面着手即可),即一定有一个后继状态为必败态。这就是Bouton定理。

      然而,看到后面我才知道,Bouton定理实质上是SG定理的具体应用。什么是SG定理呢?先要介绍下SG函数:对于任意状态x,定义SG(x)= mex(S),其中S是x 的后继状态的SG函数值的集合,而mex(S)表示不在S内的最小非负整数。看到这儿是不是感到有点递归的味道了?没错,实际上,它可以用递推来求出各个SG函数的值(要很注意计算顺序,结合具体题目分析),也可以用加记忆化的深搜回溯(不建议使用)。而SG定理就是,游戏和的必胜(败)态等于各个子游戏的SG函数的Nim sum。这样,就可以把各个子游戏分而治之,大大简化了问题。事实上,很多题目虽然可以套用这些理论来分析(这个确实是真的,SG函数是解决博弈问题的王道!),但往往不会那么生硬地要你去求各个子SG函数,做这些博弈题的时候,一定要看清题意,抓住问题的本质(这句话…对于所有题目都适用),直接搞就行(0.0),只要找清它的必胜态、必败态处于具有什么特征的位置(一般会有个周期的),明显的话一两个循环即可搞掂,别想太多(我有时候刷题就是想太多,总想套上什么特定的算法,模板之类的,结果思维放不开来 -.-||)……总之一句话,多刷题、多get经验才是王道,杭电上面有很多很经典的博弈题(大神们都去刷cf了,别鄙视我等渣渣暂时只会在杭电上找题做),过几天我去水下上面的博弈题,有时间的话再逐个写题解吧~

      

      ——以上理论均引自刘汝佳的大白书,加上了自己的见解,感觉说得不是很清楚的话可以去大白书上 2.4 组合游戏的章节中详细阅读,不喜勿喷,希望各路大神路过指教下。

  • 相关阅读:
    undefined reference to cv::imread(cv::String const&, int)
    ubuntu gcc 降级 适应matlab
    ubuntu 迅雷 XwareDesktop
    python 包 安装 加速 pip anaconda
    ubuntu classicmenu-indicator
    ubuntu 电源管理
    apue.h头文件(UNIX环境高级编程)
    ubuntu 12.04 下nginx安装步骤
    Ubuntu12.04 64bit 下安装VNC server
    TLD视觉跟踪算法
  • 原文地址:https://www.cnblogs.com/qie-wei/p/10475242.html
Copyright © 2020-2023  润新知