最近刚刚接触了基础博弈论 一开始感觉是一个非常难以理解的专题 看了几天别人的题解 写了几道题感觉稍微有了一点点的感觉 下面来总结一下几个常见的基础博弈

1.巴什游戏

最简单的那当然就是巴什游戏了题目是说有一堆石子A,B分别去取石子每一次可取的数目为1—m个最后没有石子可以去的人则为败方那么思路很简单 先想当有m+1个石子时候不论先手取多少个 后手一定可以一次性取完,所以后手一定赢 那么再思考如果有n*(m+1)个我们都可以让先后手保持这样的状态 先手取k个后手取m+1-k个保证每一个周期结束后数目仍然是m+1的倍数直到m+1时候 先手取完后 后手全部取完 如果不是m+1的倍数那么先手只需要一定数目的石子让其变为m+1的倍数即可 所以有当n%(m+1)==0先手必败n%(m+1)!=0先手必胜

2.NIm游戏

规则像是巴什游戏的升级版 有n个石子堆每一个人能对任意一个堆任意个石子(不能为0)最后没有石子可取的人败这里需要用到数学知识推理(我不会直接给出结论)

设sum[]记录每一个堆的数量那么如果 sum[1]^sum[2].....^sum[n]==0先手必败 否则先手必胜

3.威佐夫游戏

这个游戏是说有两个石子堆玩家可以对一个石子堆取任意石子也可以对两个石子堆取相同数目的石子最后没有石子可取的人败

这里我们需要用到黄金比例

double gold=(1+sqrt(5))/2;

两个堆的数量之差乘黄金比例如果等于较小的那个数量则先手必败否则先手胜

4.反NIm游戏

规则是一样的只是说最后没石子拿的人胜利 那么结论也相似 如果全部石子堆的数量都是1那么需要判断奇偶性 奇数后手胜 偶数先手胜 如果有一个或多个数量大于一的石子堆 那么还是取异或和如果 sum[1]^sum[2].....^sum[n]==0先手必败否则先手必胜

5.SG函数和Mex

Mex是对一个集合的运算 是求不等于集合中任意一个数的最小非负整数如Mex{1,2,3}=0;

SG=0时是必败点 其他为必胜点 所有的必败点都可以指向必胜点一定不会再指向必败点 而所有的必胜点都会指向必败点 SG函数就是对一个结点的所有后继点进行SG运算 比如已知SG[0]=0;

SG[1]=1; SG[2]=2;如果结点3指向1,2,0那么SG[3]=3;对于不同的游戏SG函数有不同的算法

如巴什游戏中

因为可以取1-m个石子所以n的后继结点(对n进行一次操作)为n-m,n-m-1,n-m-2,n-m-3.....n-1;

而每一个结点又有自己的后继结点

用SG解决巴什游戏代码如下

#include<iostream>
#include<cstring>
using namespace std;
int s[1000],sg[1000];//s记录每一个结点的后继结点的sg每循环一次都要清空一次
bool bashi(int n,int m)
{return n%(m+1)==0;
}
void getSG(int n,int m)
{memset(sg,0,sizeof(sg));for(int i=1;i<=n;i++){memset(s,0,sizeof(s));for(int j=1;j<=m&&i-j>=0;j++){s[sg[i-j]]=1;}for(int j=0;j<=n;j++){if(!s[j]){sg[i]=j;break;}}}
}
int main()
{int n,m;while(cin>>n>>m){int ans=bashi(n,m);if(ans)cout<<"后手
";else cout<<"先手
";getSG(n,m);if(sg[n])cout<<"先手
";elsecout<<"后手
";}} 

6.MUlti-SG

如果一个游戏可以再分成多个独立的游戏那么这个游戏的SG就是它分出独立的游戏的SG异或和再进行Mex运算

如 在NIM游戏上多加一个操作即玩家可以选择拿走任意石子或者把大于2的石子分为两堆那么这里分为两堆就是变成了两个独立的游戏就用到了Multi—SG 代码如下

#include<iostream>
#include<cstring>
using namespace std;
int sg[1000],s[1000];
void getsg()
{memset(sg,0,sizeof(sg));sg[0]=0;sg[1]=1;sg[2]=2;for(int i=3;i<=1000;i++){memset(s,0,sizeof(s));for(int j=0;j<=1000&&j<=i;j++){s[sg[i-j]]=1;3s[(sg[j]^sg[i-j])]=1;}for(int j=0;j<1000;j++){if(!s[j]){sg[i]=j;break;}}}
}
int main()
{int n;getsg();while(cin>>n){int a[100];int sum=0;for(int i=0;i<n;i++){cin>>a[i];sum^sg[a[i]];}if(sum==0)cout<<"0"<<endl;else cout<<"1"<<endl;}
} 

对于SG函数一开始我也是很不理解多做了一些的题目发现其实一个堆代表一个独立的游戏 而每一个堆的数量就是最高的SG结点而根据操作(仅操作一次)一开始的n会变为其他数量m,k,l,这些就是n的后继结点而在操作一次数量会再次变化这些就是m,k,l的后继结点 因此不同的题目SG的算法不同

7.规律型博弈

这种博弈我认为是我们先找到一个必胜点作为目标状态(如巴什游戏中的n*(m+1))然后当时其他状态的时候通过操作转为目标状态再加以分析题目就会简单明了许多

基础博弈论(NIm,威佐夫,巴什游戏)相关推荐

  1. 【博弈论】威佐夫博弈

    简介 威佐夫博弈( W y t h o f f G a m e Wythoff\ Game Wythoff Game):有两堆物品个数是 n n n和 m m m,甲乙两个人轮流从一堆选取 k k k ...

  2. 【小组专题二:博弈论入门综述(1)】NP状态 | SG函数 | 巴什博奕、威佐夫博弈、斐波那契博弈、Nim游戏、SJ定理

    博弈论综述[1] 前言 博弈与博弈论 博弈树 NP状态 SG函数(Sprague-Grundy) Sprague-Grundy Theorem 巴什博奕 Bash Game 威佐夫博弈 扩展威佐夫博弈 ...

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

    博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase) 转载自: http://tieba.baidu.com/p/1474319443 http://blog.sin ...

  4. 关于博弈基础知识的总结:巴什博弈(Bash Game)、威佐夫博奕(Wythoff Game)、尼姆博奕(Nim Game)

    转载自http://www.aiuxian.com/article/p-942548.html 博弈论是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论. 基础的基础 ...

  5. 基础博弈论(巴什博奕、斐波那契博弈、威佐夫博奕、尼姆博奕)

    [前言] 今天才算是搞明白了(??)最基本的四种博弈 [小结] 1.巴什博奕(Bash Game) 一堆中取石子,两个人轮流取石子,每次取石子量至少为1,至多为m,先取完者胜利. 当n%(m+1)== ...

  6. 四种基础博弈 巴什博奕+威佐夫博奕+斐波那契博弈+K倍博弈

    博弈论(Game Theory) 博弈论是指研究多个个体或团队之间在特定条件制约下的对局中利用相关方的策略,而实施对应策略的学科.有时也称为对策论,或者赛局理论,是研究具有斗争或竞争性质现象的理论和方 ...

  7. 博弈论入门(论和威佐夫、巴什、尼姆打牌被吊打是什么感受(╥﹏╥)

    威佐夫博弈-黄金分割比 经典例题: 有两堆石子,有两个绝顶聪明的人在玩一个游戏,每次每个人可以从一堆石子中取任意数量但不少于1个的石子,或从两堆中同时取走相同数量的石子,最后一个取完石子的人获胜. 面 ...

  8. 博弈论(巴什博奕/尼姆博奕/威佐夫博奕)详解

    博弈论 ,是经济学的一个分支,主要研究具有竞争或对抗性质的对象,在一定规则下产生的各种行为.博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略 通俗地讲,博弈论主要研究的是:在一个游戏中 ...

  9. 博弈论(巴什博弈)(威佐夫博弈)(尼姆博奕)

    1.巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 解释:这个理解简单,n%(m+1)==0时,先手定会输.比如n=3,m=2:你先取,你取1 ...

最新文章

  1. Java多线程复习:3(在操作系统中查看和杀死进程线程)
  2. (转载)BeanUtils.copyProperties() 用法
  3. 推荐 12 个好用的 React 的开源项目,开发效率又能提升了!
  4. 领域驱动设计之聚合与聚合根实例一
  5. 机器学习(part2)--线性方程组的列表达
  6. 线程池参数详解_java中常见的六种线程池详解
  7. python pymysql使用连接池连接mysql示例
  8. IBM发布人工智能显微镜,可检测海洋水资源
  9. matlab细胞计数并求目标区域求面积
  10. 矩阵的迹(Trace)
  11. 计算机考研 专业课 数据结构
  12. Java Instrument(一) Java Agent
  13. 最详细的工业网络通讯技术与协议总结解读(现场总线、工业以太网、工业无线)
  14. C# WinForm 使用SMS接口发送手机验证码+图形验证码+IP限制
  15. 护眼灯频闪是什么意思?如何消除led灯频闪
  16. 微信小程序解析后台返回的html格式
  17. 从svn拉下的代码无状态图标(绿色对勾)的解决方法
  18. oneNote如何导出学习笔记的各种格式
  19. 集线器、交换机以及路由器异同 + 冲突域和广播域详解
  20. 百度何中军:机器翻译——从设想到大规模应用

热门文章

  1. MicroC实现Expr部分和for循环,无续算版本Comp.fs展示
  2. anaconda python3.8目录_在Ubuntu 安装Anaconda、TensorFlow和PyCharm
  3. 广义线性混合模型(GLMM)变量选择
  4. 普乐蛙小型5d电影设备|5d电影动感电影体验馆|VR景区影院设备
  5. 调试多线程 查死锁的bug gcore命令 gdb对多线程的调试 gcore pstack 调试常用命令...
  6. 聊一聊清华读博的焦虑与成长
  7. Nginx编译安装与配置
  8. 我需要30部美或英剧的剧名
  9. 软件质量评判标准:高内聚、低耦合
  10. matlab生成随机矩阵