ACM博弈论基础

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

  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 + 1))  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(5) + 1) / 2;
int d = abs(a - b) * r;
if (d != min(a, b))  return true;
else  false;

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

尼姆博弈(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 = 0;
for (int i = 1; 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游戏的必胜策略的方法来找这个游戏的必胜策略。

原文地址:https://www.cnblogs.com/lfri/p/10662291.html

时间: 2024-11-08 19:19:44

ACM博弈论基础的相关文章

博弈论基础——巴什博弈

->可以看这<- HDU.4764.Stone \(Description\) Tang,Jiang两人轮流写数,若A在写了X,则B只能写Y,满足1<=Y-X<=k.最先写数的T只能写[1,k]内的数.第一个写的数>=N的lose,问最后的winner. \(Solution\) 看做取N-1个石子,每次最多取K个,就是个巴什博弈了 #include <cstdio> int main() { int n,k; while(scanf("%d%d&quo

博弈论基础

1.基本思想: 首先,双方都是高手且理性,每一步都全局最优.即使输,也要走全局最优,使得输得最少. 动态规划——每个局面,唯一确定一个状态,局面可以是不同初始条件的开局,也可以是同一初始下不同的残局 令胜负结果是一个整数分值,双方得分高者获胜,站在先手角度,每一步都希望得到最大分:站在后手角度,每一步都希望对方得到最小分 显然,你不能只考虑一步或者两步.

【博弈论】威佐夫博弈

威佐夫博弈     威佐夫博弈:有两堆石子,每次一个人可以两堆同时取相同数量的石子,也可以只取其中一堆的石子,最后谁取完谁获胜,请问先手还是后手胜? 对于学过一些博弈论基础的来说,我们需要找到那些能让先手必输的局势,那么由这些局势在规定范围内拓展的局势也是先手必输的局势(但在这里双方自由选取,不适用).我们可以得出一些局势使A必输:(0,0) (1,2) (3,5) (4,7) (6,10) (8,13) (9,15) (11,18) (12,20)……我们称这些局势为奇异局势 不难发现,如果我

博弈论一 [ 巴什博奕 ]

首先,这基本是关于ACM博弈论得一系列文章吧. 今天先讲一个最简单得博弈--巴什博奕. 其游戏规则是这样的: 有一堆n个石子,两个足够聪明的人玩,每个人可以去1-m个石子,取到最后一个石子为胜. 比如 n=7 ,m =3 那么先手必胜,过程大概如下, 先手取3,后首取i个,先手则拿4-i个,这样先手就拿到最后的石子了.(3+i+4-i=7,所以4-i就包含最后一个). 那么其实想法很简单. 当n%(m+1)==0,先手必输,否则先手必胜. 为什么? 当n%(m+1)==0,时,先手取i个,后手去

Game start

今天开始有计划的码代码吧!!我可是以后要进微软或者google的男人.初步计划先学习编程之美吧,每天码一到题的解法,每天每天每天..然后是ACM竞赛基础,每天一节同上.最后..不对,冷静冷静,我已经没时间了..还要高数大物c++还要lol还有steam的万千游戏我的天,这怎么玩.总之,代码优先!!其他给我绕道.嗯,perfect,就这样吧!!补上一句,“纸上得来终觉浅,绝知此事要躬行”陆游大神的哈.

【分享】近4000份数学学习资源免费分享给大家

一直以来喜欢收集数学类的教程资源,于是费了好大劲从万千合集站上扒拉了下来,总结归类了一下,一共有将近4000本电子书.经测试,均可免费下载,可能会弹出小广告,可不必理会之.[仅供学术学习和交流,请无用于商业用途.]另外,如有可能,还请尽量支持正版纸质书.   数学史(54)     数学史.rar 55.6 MB   数学的起源与发展.rar 4.3 MB   费马大定理—一个困惑了世间智者358年的谜.pdf 9.5 MB   通俗数学名著译丛14-无穷之旅:关于无穷大的文化史.pdf 14.

USACO A game

很好地一道博弈论基础题, 题目意思是给你一个序列, 两个玩家, 没个玩家可以从序列的开头或者末尾取一个数,问两个玩家都采取最优策略第一个玩家得分最多是多少?这个问题可以用动态规划解决,我们定义sum[i][j]为序列i-j的和, dp[i][j]为当前玩家采取最优策略的得分最大值那么dp[i][j] = sum[i][j] - min(dp[i+1][j], dp[i][j-1]); 边界条件是dp[i][i] = num[i], 注意这种dp的递推顺序是按照j-i递推..代码如下: /* ID

POJ 1067-取石子游戏(威佐夫博奕)

取石子游戏 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1067 Appoint description:  System Crawler  (2015-03-14) Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两

2016年的总结

距离大一入学已经经过了两年半的时间,离我第一次接触C语言也过去了两年半.向王瑞洲(以下简称GodWang)请教字符串的读入.01背包的情景还历历在目,弹指一挥间,如今已是大三. 在高考结束的时候,莫名其妙的只想填计算机类的专业,也许是出于对编程的好奇,又或许是觉得会编程的人特别帅.在纠结了很久是选择计算机还是软件工程之后,我决定选择软件工程,因为我对硬件方面没有太大的兴趣.就这样,我和爸爸妈妈将全国带有软件工程专业的学校都找了出来,寻找自己能去的地方.最后,我来到了这里——浙江财经大学信息学院.