博弈模型

转自 http://www.cppblog.com/sdfond/archive/2010/02/06/107364.html

组合游戏总结——基本博弈问题

【概述】
  最近的几次比赛,博弈的题目一直不少,而且博弈问题是一块比较复杂、庞大的内容,因此在这里小结一下,希望能够帮自己理清一些思路,争取也多来几个系列,呵呵。

竞赛中出现的组合游戏问题一般都满足以下特征:
    1.
二人博弈游戏,每个人都采用对自己最有利的策略,并且是两个人轮流做出决策
    2.
在游戏中的任意时刻,每个玩家可选择的状态是固定的,没有随机成分
    3.
游戏在有限步数内结束,没有平局出现
  大部分的题目都满足上述条件,因此这里只讨论在上述条件范畴内的博弈问题。这类博弈问题,通常还有若干分类。一种是规定移动最后一步的游戏者获胜,这种规则叫做Normal Play Rule;另一种是规定移动最后一步的游戏者输,这种规则叫做Misere Play
Rule,也称为Anti-SG游戏。此外,对于游戏的双方,如果二者博弈的规则相同,那么称为这类游戏是对等(impartial games)的;否则称为不平等游戏(partizan games
)。当初WHU的那场比赛就是由于对于这个概念不是很清晰,导致看完题目之后就用SG定理来做,浪费了很多机时。实际上,解决不平等博弈问题的方法和普通的博弈问题(SG游戏)是有区别的,一般会采用动态规划或者surreal number。

【博弈基础知识】
  在SG游戏中,最为人熟知的是必胜必败态,也叫NP态理论。注意的是,P态对应的是先手必败态,N态对应的是先手必胜态。必胜必败态理论是:
  1. All terminal positions are
P-positions
  2. From every
N-position, there is at least one move to a P-position
  3. From every P-position, every move is to an
N-position
  英文的表述非常简洁清晰,而且这个理论也很好理解,如果在当前状态的下一步可以走到必败态,那么当前玩家就可以走到那个
状态,把必败态推给另一方;如果所有可达状态都是必胜态,那么当前玩家无论如何走,都会把必胜态让给对方。根据必胜必败态理论,我们可以递归的求出每个状
态是N态还是P态。必胜必败态理论其实已经把博弈问题转化成了一个有向图,借助图这个模型来分析问题,使得问题变得形象了许多。需要注意的是,这种SG游
戏对应的有向图是无环的,因为如果有环,那么游戏双方就可能在环上不停的转换状态,游戏不能在有限步终止,这样就不满足组合游戏的特征3了。
  然而在很多时候仅仅知道某个状态是必胜还是必败是不够的,因为如果存在多个组合游戏(比如经典的Nim),对应的状态集合非常大,无法直接利用必胜必败态理论求解,因此需要用到博弈论中一个很重要的工具:SG函数。
  某个状态的SG函数值定义为当前状态所有不可达的状态编号中最小的编号,其中终止态的SG函数值是0。有了这个工具,就引入一个非常强大的定理——SG分解定理:

  多个组合游戏的SG函数值是每个组合游戏的函数值的和。(这里的和定义为异或操作)
  
  SG分解定理的证明不是很难,其实和Nim的证明很像。根据这个定理,我们就知道为什么Nim的解法是异或所有的石子个数了,因为每堆石子的SG值就是石子的个数。SG分解定理告诉我们任何SG游戏都可以转化成Nim游戏来做。
  Nim中的一个变形就是拿走最后一块石子的人算输。通过修改SG的计算规则,可以得出相同的结论(因为当石子个数是1的时候SG值为0,因此要单独处理);当然也可以利用一个叫做SJ定理的方法来做,依然是要处理当所有堆的SG值不大于1的情况。

【博弈基本模型】
 
 除了Nim模型,很多模型都看似复杂,最后都划归到了Nim模型上,然后利用SG分解来做的。在证明两种模型等价的时候,可以通过计算SG值判断是否相
同,或者通过判断必胜策略的走法将其转化为Nim。许多模型非常的神奇,其获胜策略又千差万别,因此无法一一列举,但是掌握一些经典模型是必须的,这样通
过模型的转化可以简化问题的难度。
  经典模型1:Nim变种。包括:
    (1)
楼梯Nim。把奇数台阶的石子作为Nim,二者等价,因为必胜的策略是相同的。
    (2) 每次可以取k堆,这个是经典的Moore
Nim。它是泛化的Nim游戏。
    (3)
两堆石子,每次可以取一堆或两堆,从两堆取得时候个数必须相同,谁先取完获胜。这个是著名的威佐夫博弈,跟黄金分割数有关,具体证明不是很清楚,但是用SG值打表可以找出规律。代码如下:

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

int main()
{
    const double k = (sqrt(5.0) + 1) / 2.0;
    int a, b, t;

while (scanf("%d %d", &a, &b) == 2)
    {
        if (a > b)
            swap(a, b);
        t = b - a;
        if (a == (int)(t * k))
            puts("0");
        else
            puts("1");
    }

return 0;
}

    (4) Subtraction
Games。一种通用的Nim游戏,每次从可用状态集合中选择下一步的状态,有很多变形,核心思想还是计算SG函数值。
    (5)
Take-and-Break Game。每次把局面分成多个Nim子游戏,利用SG分解定理求出对应的SG值。
  经典模型2:翻硬币游戏(Coin Turning
Game)
    (1) 一维的翻硬币游戏,每次可以翻1个或两个。通过单独考虑每个可以翻的硬币发现,Coin Turning
Game的SG值和Nim等价,因此两个模型等价。需要注意的是,许多翻硬币游戏根据题目的要求,一般编号从0开始。
    (2)
一维的翻硬币游戏,每次可以翻1个或两个,限定了翻第二枚硬币的范围,那么就和Subtraction Game等价了。
    (3)
一维的翻硬币游戏,每次可以翻1个、2个或3个,这个游戏叫做Mock Turtles,有一个神奇的规律,是Odious Number序列。
    (4)
高维的翻硬币游戏,需要用到Nim积和Tartan定理。
  翻硬币模型的变化更多,很多模型都有一些奇妙的规律,需要打表才能发现。
  经典模型3:删边游戏(Green Hackenbush)
    (1)
树的删边游戏:Colon原理证明这种模型和Nim依然是等价的,多个叉的SG值异或就是对应根节点的SG值。
    (2)
无向图删边游戏:利用Fursion定理收缩圈,然后就转换成树的删边游戏了,不过这个定理还不会证。

时间: 2024-10-10 16:37:43

博弈模型的相关文章

hdu 2149 Public Sale 巴什博弈模型~~我这样刷水题真的好吗~~~

Public Sale Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4914    Accepted Submission(s): 2941 Problem Description 虽然不想,但是现实总归是现实,Lele始终没有逃过退学的命运,因为他没有拿到奖学金.现在等待他的,就是像FarmJohn一样的农田生涯. 要种田得有田才

hdu 2516 FIB博弈模型

题目来源: http://acm.hdu.edu.cn/showproblem.php?pid=2516 分析: 当石子个数为 fabonacii 数时, 为必败态. 代码如下: LL fib[60] ; void init(){ int i; fib[0] = fib[1] = 1 ; for( i=2 ;i < 55; i++){ fib[i] = fib[i-1] + fib[i - 2] ; } } int main() { init() ; int n , i; while(scanf

博弈 个人 见解

因为周测被虐,做了好久的博弈题,找了好多关于博弈的相关资料,感觉自己,似乎还是动了那么一点点.临睡前,就小小的总结一下,希望以后看到的时候,能够有所感悟吧!! 接下来是正题. 讲到博弈, 其实也就是找规律,但是知道一般的博弈类型可以快速便捷的解决问题. 博弈的类型大致有以下几种:巴什博弈,威佐夫博奕,尼姆博弈.除此之外还有斐波那契博弈,sg模板等. 巴什博弈:(摘自百度文库) 巴什博奕(Bash Game): 只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光

BZOJ 1443 JSOI 2009 游戏Game 二分图+博弈

题目大意:给出一个带有坏点的网格图,每次移动棋子到相邻的格子中,要求格子不能重复,问先手是否有必胜策略,如果有,输出所有的棋子可以摆放的初值位置. 思路:很经典的二分图博弈模型,将图黑白染色,就变成了二分图.求最大匹配之后,如果是在二分匹配上的边,每次先手从左侧走到右侧,后手就一定能从右边走回来,这样就是先手输了.具体见:http://blog.sina.com.cn/s/blog_76f6777d0101inwe.html 建立网络流模型,跑最大流,在残量网络上从S能够搜到的左侧的点和右侧的能

hdu 1907(Nim博弈)

John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 4407    Accepted Submission(s): 2520 Problem Description Little John is playing very funny game with his younger brother. There is one big bo

hdu1527 &amp; poj1067 取石子游戏 威佐夫博奕模型,,模板题o(╯□╰)o

取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35727   Accepted: 12065 Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者

信息扩散模型

P84 协调博弈介绍部分重复.啰嗦 信息扩散影响因素:网络结构.人们传播信息的意愿 经典的信息扩散模型 创新扩散模型(S型曲线) 局部相互作用的博弈模型 阈值模型 级联模型 Markov随机场图模型 传染病模型 数据驱动的信息扩散模型 分支过程模型(可用来预测口碑在网络社区中的传播) 侧重于信息扩散树 数据驱动的级联模型 侧重于扩散过程中个体的激活态与休眠态 信息亲和性模型(用户倾向于转发他们感兴趣的信息) 考虑到用户和信息间的相互作用 基于信息扩散升降模式的模型 基于外部影响的模型 基于权威节

基于博弈论的大学生社群合作行为研究申报书(C写一个博弈软件)

三科基金学生科研课题 立 项 申 报 书 课题名称:基于博弈论的大学生社群合作行为研究 学科分类:自然科学类 承担单位:温州大学网络工程本 负 责 人:Steve Jiang 需要整个C实现的博弈软件可以联系我   课题名称 基于博弈论的大学生社群合作行为研究     课题负责人基本情况 姓名 Steve Jiang 性别 男 出生年月 1994年6月     学历 本科 研究专长 Java编程     班级 网络工程 担任职务 负责人     通讯地址 联系电话     课题组成员情况 姓名

转 基本博弈

序:博弈是信息学和数学试题中常会出现的一种类型,算法灵活多变是其最大特点,而其中有一类试题更是完全无法用常见的博弈树来进行解答. 寻找必败态即为针对此类试题给出一种解题思路. 此类问题一般有如下特点: 1.博弈模型为两人轮流决策的非合作博弈.即两人轮流进行决策,并且两人都使用最优策略来获取胜利. 2.博弈是有限的.即无论两人怎样决策,都会在有限步后决出胜负. 3.公平博弈.即两人进行决策所遵循的规则相同. 理论铺垫: 1.定义P-position和N-position:其中P代表Previous