博弈论的题目有如下特点:

  1. 有两名选手
  2. 两名选手交替操作,每次一步,每步都在有限的合法集合中选取一种进行
  3. 在任何情况下,合法操作只取决于情况本身,与选手无关
  4. 游戏败北的条件为:当某位选手需要进行操作时,当前没有任何可以执行的合法操作

下面介绍几个经典的博弈。

巴什博弈(Bash Game)

一堆n个物品,两个人轮流从中取出1~m个,最后取光者胜(不能继续取的人输)。

同余定理:$n=k*(m+1)+r$,先者拿走$r$个,那么后者无论拿走$1~m$个先者只要的数目使和为$m+1$,那么先手必赢。反之若$n=k*(m+1)$,那么先手无论怎样都会输。

if (n % (m + ))  return false;
else return true;

威佐夫博弈(Wythoff Game)

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

这里的必输局势:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。从这些必输局势可以发现,每组的第一个是前面没有出现的最小正整数,$a_k = [k * (1+\sqrt{5}) / 2],\ b_k = a_k + k,\ k = 0,1,2,3...$。

所以,先求出差值,差值*黄金分割比 == 最小值的话后手赢,否者先手赢。

double r = (sqrt() + ) / ;
int d = abs(a - b) * r;
if (d != min(a, b)) return true;
else false;

注:如果a,b的值非常大的话,需要高精度来计算这个double类型的r。

斐波那契博弈(Fibonacci Nim Game)

一堆石子有n个,两人轮流取,先取者第一次可以去任意多个,但是不能取完,以后每次取的石子数不能超过上次取子数的2倍。取完者胜。

同样是一个规律:先手胜当且仅当n不是斐波那契数。

f[] = f[] = ;
for (int i = ; f[i - ] < n; i++)
{
f[i] = f[i - ] + f[i - ];
if (f[i] == n) return true;
}
return false;

尼姆博弈(Nimm Game)

有n堆物品,两人轮流取,每次取某堆中不少于1个,最后取完者胜。

假如有3堆物品(a,b,c)
  (0,0,0)状态时先手是一个必输局势因为没有东西可取,(0,n,n) 状态时也是必输局势只要后者在另一堆取得物品与前者一样多时那么前者也就是必输局势。慢分析(1,2,3)也是一个必输局势。如果我们将其转化为二进制形式并通过异或运算(^)我们会发现:
        0001^0010^0011=0000
通过验证所有的堆数量累^后只要为0就都是必输局势,所以我们就只要记住这个规则:将n堆物品数量全部异或后结果为0先手必败,否则必胜。

int res = ;
for (int i = ; i <= n; i++)
res ^= arr[i];
if (res) return true;
else return false;

但是,实际问题中不可能给出如此标准的博弈模型,对于更加一般的博弈问题,我们该如何求解呢?通过SG函数转换为尼姆博弈。

SG函数

首先给出一种ICG博弈游戏模型,给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿着有向边进行移动,无法移动者判负。

将ICG问题进行转化:任何一个ICG都可以通过把每个局面看作一个顶点,对每个局面和它的子局面连一条有向边来抽象这个“有向图游戏”。

于是我们将ICG问题转化为上述这个游戏,再通过寻找这个游戏的一般解法来处理ICG问题。

首先定义mex(minimal  excludant)运算,这是定义于一个集合的运算,表示最小的不属于这个集合的最小非负整数。例如mex{0,1,2,4}=3,mex{2,3,4}=0,mex{}=0.

SG函数(Sprague-Grundy):对于一个给定的有向无环图,定义关于这个图的每个顶点的SG函数如下:$sg(x) = mex\{sg(y) \  | \  y是x的后继 \}$

SG函数的求法

  1. 找出必败态
  2. 找出当前所有状态的前驱结点
  3. 根据定义计算结点SG值
  4. 重复上述步骤,直到整棵树建立完成

按上述步骤建成的树如下:

这颗树有什么意义呢?比如说我们将一个顶点放在根节点上,当前这个点的sg值为0,说明当前这个点是必败态。为什么这么说呢?我们将这个点交替进行移动,先手有两种选择,往右移动,显然后手再移动一步就进入必败态;往左移动,后手会选择往右移动,先手同样进入必败态。

如何通过SG函数值来解决之前的有向图问题呢?对于n个棋子,设它们对应的顶点的SG函数值分别为$\{a_1,a_2,...a_n\}$,再设局面$\{a_1,a_2,...a_n\}$时的Nim游戏的必胜策略是把$a_i$变成$k$,那么原游戏的一种必胜策略就是把第$i$枚棋子移动到一个SG值为$k$的顶点。

简单来说,我们让每个结点都拥有一个SG值(假设这个值为$x$),那么对于任何一个玩家操作(移动到当前结点的某个后继结点)实际上就是把棋子移动到0~x-1的某个结点上,等价的就是从x个物品中取走一个,最多x个!。

不是是觉得有点不对,单根据mex的定义,可能出现如下情况,移动到比自身SG值大的结点:

其实这种情况是不存在的,博弈问题中先手不会移动到对自己不利的局面的,在这里也就是不会移动到SG值为4的结点。

SG定理:所以我们可以定义有向图游戏的和。设$G_1,G_2,...G_n$为n个“有向图”游戏的和(Sum),游戏G的移动规则是:任选一个子游戏$G_i$并移动上面的棋子。SG定理就是:$sg(G)=sg(G_1) \wedge sg(G_2) \wedge .... \wedge sg(G_n)$。也就是说,游戏的SG函数值就是它的所有子游戏的SG函数值的异或。

因此,当我们面对n个不同游组成的游戏时,只需要求出每个游戏的SG函数值,把这些SG值都看作Nim的石子堆,然后依照找Nim游戏的必胜策略的方法来找这个游戏的必胜策略。

参考链接:【算法讲堂】【电子科技大学】【ACM】博弈论基础

ACM博弈论基础的更多相关文章

  1. acm博弈论基础总结

    acm博弈论基础总结 常见博弈结论 Nim 问题:共有N堆石子,编号1..n,第i堆中有个a[i]个石子. 每一次操作Alice和Bob可以从任意一堆石子中取出任意数量的石子,至少取一颗,至多取出这一 ...

  2. ACM&OI 基础数论算法专题

    ACM&OI 基础数学算法专题 一.数论基础 质数及其判法 (已完结) 质数的两种筛法 (已完结) 算数基本定理与质因数分解 (已完结) 约数与整除 (已完结) 整除分块 (已完结) 最大公约 ...

  3. 博弈论基础之sg函数与nim

    在算法竞赛中,博弈论题目往往是以icg.通俗的说就是两人交替操作,每步都各自合法,合法性与选手无关,只与游戏有关.往往我们需要求解在某一个游戏或几个游戏中的某个状态下,先手或后手谁会胜利的问题.就比如 ...

  4. 博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase)(转)

    (一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜.若(m+1) | n,则先手必败,否则先手必胜.显然,如果n=m+1 ...

  5. ACM博弈论总结

    一.Bash博弈 1.问题模型:只有一堆n个物品,两人轮流从这堆物品中取物,最多取m个,最后取光者胜. 2.解决思路:当n=m+1时,由于一次最多取m个,无论先取者拿走多少个,后取者都能一次拿走剩余的 ...

  6. 博弈论揭示了深度学习的未来(译自:Game Theory Reveals the Future of Deep Learning)

    Game Theory Reveals the Future of Deep Learning Carlos E. Perez Deep Learning Patterns, Methodology ...

  7. 第六届acm省赛总结(退役贴)

    前言: 这是我的退役贴,之前发到了空间里,突然想到也要在博客里发一篇,虽然我很弱,但是要离开了还是有些感触,写出来和大家分享一下,希望不要见笑.回来看看,这里也好久没有更新了,这一年确实有些懈怠,解题 ...

  8. 关于ACM,关于CSU

    原文地址:http://tieba.baidu.com/p/2432943599 前言: 即将进入研二,ACM的事情也渐渐远去,记忆终将模糊,但那段奋斗永远让人热血沸腾.开个贴讲讲ACM与中南的故事, ...

  9. 20181228 模拟赛 T3 字符串游戏 strGame 博弈论 字符串

    3  字符串游戏(strGame.c/cpp/pas) 3.1  题目描述 pure 和 dirty 决定玩 T 局游戏.对于每一局游戏,有n个字符串,并且每一局游戏由K轮组成.具体规则如下:在每一轮 ...

随机推荐

  1. UVaLive 4731 Cellular Network (期望DP)

    题意:手机在蜂窝网络中的定位是一个基本问题,假设蜂窝网络已经得知手机处于c1,c2,,,cn这些区域中的一个,最简单的方法是同时在这些区域中寻找手机, 但这样做很浪费带宽,由于蜂窝网络中可以得知手机在 ...

  2. codeforces704D Captain America【上下界最大流】

    分别给行和列hash建两排点,对(x,y)坐标连x行y列的点 设红色价格低,那么就要尽量多选红色 设一个点出度为s,要求最小的最大差值为d,又,假设有流量表示选红没流量表示选蓝,那么要求就变成了这个点 ...

  3. 分层确定性钱包开发的代码实现(HD钱包服务)

    HD Wallets的全称是Hierachical Deterministic Wallets, 对应中文是 分层确定性钱包. 这种钱包能够使用一组助记词来管理所有的账户的所有币种,在比特币的BIP3 ...

  4. spring-eureka 源码解读----为什么一个服务最多两分钟被其他服务感知

    Eureka的wiki上有一句话,大意是一个服务启动后最长可能需要2分钟时间才能被其它服务感知到,但是文档并没有解释为什么会有这2分钟.其实这是由三处缓存 + 一处延迟造成的. 首先,Eureka对H ...

  5. 洛谷P2583 地铁间谍

    P2583 地铁间谍 题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发 ...

  6. css中多余文字省略号显示

    项目中很多情况都要求多余的文字要以省略号的形式展示在前端页面上.虽然用的多,但是我也不知道为啥,我始终记不住.所以,通过这种方式,让自己加深一下印象 情况一:单行文字超出规定宽度后,以省略号形式展示 ...

  7. 36小时极客嘉年华!FISCO BCOS黑客马拉松报名启动

    FISCO BCOS是完全开源的联盟区块链底层技术平台,由金融区块链合作联盟(深圳)(简称金链盟)成立开源工作组通力打造.开源工作组成员包括博彦科技.华为.深证通.神州数码.四方精创.腾讯.微众银行. ...

  8. linux查找工具(find,locate,whrers)

    find whereis locate 一.whereis whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数, ...

  9. eosiolib文件解析

    Source base on EOS version: 1.0.5,some photo except.   在eos源码中,eosiolib库在源码中的位置如下: 在\eos\contracts\e ...

  10. css各种水平垂直居中

    css各种水平垂直居中,网上查了一下,总结以下几种 line-height垂直居中 缺点,仅限于单行文字 .item{ text-align: center; height: 100px; line- ...