博弈论

理论铺垫:

定义P-position和N-position:其中P代表Previous,N代表Next。直观的说,上一次move的人有必胜策略的局面是P-position,即P-position代表先手必输,N-position代表先手必赢。

1.公平组合博弈(ICG)

定义:

1.两个人轮流参与; 2.游戏局面有限; 3.同一个局面两个人操作完全相同; 4.无法进行操作的人输; 5.在有限步内结束。

模型:给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移动者判负。

解题思路:SG函数(Sprague-Grudy)

SG定理:

1:给定一个有限子集 S ? N,令mex S为没有出现在S中的最小自然数。例:mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。

2:对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Garundy函数g如下:sg(x)=mex{ sg(y) | y是x的后继 }。即y可以一步操作到x;

SG函数性质:

1:SG值为0必败态, 否则为必胜态

2:对于一个sg(x)=0的顶点x,它的所有后继y都满足g(y)!=0。同理,对于一个sg(x)!=0的顶点,必定存在一个后继y满足g(y)=0。

例:有三堆石子,第一堆石子的可以取1、2、3个石子,则:sg[x] = x % 4;第二堆可以取奇数个石子,则sg[x] = n % 2;第三堆有n个石子,其为Nim博弈,sg值为n,将三堆的sg值全部异或一下,判断是不是0,是0则先手必败(推广到n堆其结论一样适用)。

SG函数求法

其sg函数可以通过下面的模板来求:

//f[]:可以取走的石子个数

//sg[]:0~n的SG函数值

//hash[]:mex{}

int f[N],sg[N],hash[N];

void getSG(int n)

{

int i,j;

memset(sg,0,sizeof(sg));

for(i=1;i<=n;i++)

{

memset(hash,0,sizeof(hash));

for(j=1;f[j]<=i;j++)

hash[sg[i-f[j]]]=1;

for(j=0;j<=n;j++) //求mes{}中未出现的最小的非负整数

{

if(hash[j]==0)

{

sg[i]=j;

break;

}

}

}

}

记忆化搜索求SG函数,判断该点的sg值是否为-1,如果是,则调用函数:

//注意 S数组要按从小到大排序 SG函数要初始化为-1 对于每个集合只需初始化1遍

//n是集合s的大小 f[i]是定义的特殊取法规则的数组

int s[110],sg[10010],n;

void SG_dfs(int x)

{

int i;

if(sg[x]!=-1)

return;

bool vis[maxn];

memset(vis,0,sizeof(vis));

for(i=1;i<=k;i++)

{

if(x>=f[i])

{

if(sg[x-f[i]]==-1)

SG_dfs(x-f[i]);

vis[sg[x-f[i]]]=1;

}

}

int e;

for(i=0;;i++)

if(!vis[i])

{

sg[x]=i;

break;

}

}

AC代码:

#include

using namespace std;

const int maxn=1e4+5;

int f[101],sg[maxn];

int k,T,tot=0,temp,inf;

void SG_dfs(int x)

{

int i;

if(sg[x]!=-1)

return;

bool vis[maxn];

memset(vis,0,sizeof(vis));

for(i=1;i<=k;i++)

{

if(x>=f[i])

{

if(sg[x-f[i]]==-1)

SG_dfs(x-f[i]);

vis[sg[x-f[i]]]=1;

}

}

int e;

for(i=0;;i++)

if(!vis[i])

{

sg[x]=i;

break;

}

}

int main()

{

//ios::sync_with_stdio(false);

while(scanf("%d",&k)&&k)

{

//memset(f,0,sizeof(f));

memset(sg,-1,sizeof(sg));

sg[0]=0;

for(int i=1;i<=k;++i){

scanf("%d",&f[i]);

}

//sort(f+1,f+k+1);

scanf("%d",&T);

while(T--)

{

tot=0;

scanf("%d",&temp);

for(int i=1;i<=temp;++i){

scanf("%d",&inf);

if(sg[inf]==-1)

SG_dfs(inf);

tot^=sg[inf];

}

!tot?cout<

}

cout<

}

system("pause");

return 0;

}

2.Bash(巴什博弈)

定义:有一堆共n个物品,两个人轮流从中间取,每次最多取m个物品,先取完的人赢。

解题思路:n对(m+1)取模,模不为0,则先手必胜,模为0,则先手必败(由SG函数知)。

3.Nim博弈(尼姆博弈)

定义:有n堆物品,两人轮流从每堆中取物品,每次最少取一个,无上限,先取完者胜利。

解题思路:所有堆的个数相异或,如果结果为0,则先手必败,不为0则先手必胜。必胜走法的方案数:将总的异或结果同每一堆相异或,如果结果小于该堆的数量,则可以从该堆取出x-x^tot个;

4.Wythoff Game(威佐夫博弈)

定义:有两堆若干个物品,两人轮流从一堆中取若干的物品或两堆取同样多的额物品,至少取一个,先取完的为胜。

解题思路:令当前局势(Ak,Bk),则当前态势为先手必败态当且仅当Ak=((sqrt(5)+1)/2)*k、Bk=Ak+k;取出多少个则直接暴力循环判断是不是必败态即可

5.Fibonacci博弈

定义:有一堆个数为n的石子,双方轮流取石子,先手不能一次把所有石头取完,且后者取得石子的数目不能超过前者所取数目的2倍(可以包含1和2倍)。

解题思路:判断该数是不是裴波那契数列,如果是,则先手必败,否则先手必胜。

matlab 博弈论代码,各种博弈论详解(示例代码)相关推荐

  1. java 注释 超链接_java_Java代码注释规范详解,代码附有注释对程序开发者来 - phpStudy...

    Java代码注释规范详解 代码附有注释对程序开发者来说非常重要,随着技术的发展,在项目开发过程中,必须要求程序员写好代码注释,这样有利于代码后续的编写和使用. 基本的要求: 1.注释形式统一 在整个应 ...

  2. 贪心算法思想详解+示例代码

    CSDN话题挑战赛第2期 参赛话题:学习笔记 文章目录 五大算法思想 贪心算法 举例说明 选择排序 删除数字 寻找数字最大和 买股票 最大回文字符串 背包问题 小结 五大算法思想 分治思想 贪心算法/ ...

  3. android demo示例代码,Android Service demo例子使用详解(示例代码)

    Android Service demo例子使用详解\ 概述 Service 是 Android 的四大组件之一,它主要的作用是后台执行操作,Activity 属于带有 UI 界面跟用户进行交互,而 ...

  4. android代码查找快捷键是什么,Android Studio搜索功能(查找功能)及快捷键图文详解(示例代码)...

    1.在当前窗口查找文本[Ctrl+F] F3 向下查找关键字出现位置 Shift+F3 向上一个关键字出现位置 2.在当前工程内查找文本[Ctrl+Shift+F] 先会弹出一个对话框,直接点击[fi ...

  5. 如何查看mysql备份的情况_MySQL数据库备份详解(示例代码)

    原文:MySQL数据库备份详解 对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据 ...

  6. android+tracert命令详解,tracert 命令详解(示例代码)

    tracert 命令详解 How to Use the TRACERT Utility The TRACERT diagnostic utility determines the route to a ...

  7. html语言head里面的link示例,Html之head部分详解(示例代码)

    随便打开一个网页,右击查看网页源代码,总能看到 -封闭标签,在里面通常会包含5类标签:title.link.script.meta.style.这5类标签看着都挺熟悉的哈,那么在web前端技术中具体要 ...

  8. matlab三位画图_matlab 3D绘图详解(示例代码)

    1.三维曲线: plot3() →plot3(X1,Y1,Z1,...) →plot3(X1,Y1,Z1,LineSpec,...) →plot3(...,'PropertyName',Propert ...

  9. Jython-在JAVA调用Python脚本使用方法详解+示例代码

    目录 前言 一.Jython简介 1.场景 2.下载 二.运用示例 构建Maven项目 构建java,运行python语句: 运行python脚本: 运行带有第三方库的Python脚本 转为jar包 ...

  10. c语言Null详解,c语言NULL和0区别及NULL详解(示例代码)

    先看下面一段代码输出什么: #include int main() { int *p=NULL; printf("%s",p); } 输出 ,单步调试可以看出执行int *p=NU ...

最新文章

  1. tar -cvPf new.tar `rpm -ql vsftpd` 建议不要用绝对路径'/'
  2. R语言ggplot2可视化分面图(facet_grid)、自定义缩小分面图标签栏的高度、但是不改变标签栏标签文本的大小、通过element_text函数的margin参数设置实现
  3. Web中的XHRHttpRequest
  4. C#基础(七)虚函数
  5. 小程序上拉加载,下拉刷新
  6. Discuz!NT 缓存设计简析 [原创]
  7. 需要的依赖_三十而已:夫妻关系中需要的是坦诚和依赖
  8. 搜索做成html静态,如何在静态的html里实现搜索功能?
  9. 关于css的一切(updating...)
  10. 吴恩达深度学习笔记 course2 week2 优化算法
  11. 台式计算机m9870t,新闻中心 ——驱动之家:您身边的电脑专家
  12. java/php/net/pythont房产信息管理系统设计
  13. 全球时区 简称 缩写 简介 PST EST GMT CST EDT UTC 等
  14. html font设置字号,html font标签怎么设置字体大小
  15. 支付宝小程序会员卡开通
  16. python ar_四种AR的实现方式
  17. 揭晓丨易知微吉祥物WEI WEI IP形象设计大赛获奖作品出炉
  18. 哔哩哔哩php开发工作怎么样,[上海] [哔哩哔哩]-努力寻求[PHP /C++/Andro/iOS/前端开发工程师]-会是你吗?...
  19. 面试总结(四)——如涵
  20. 推荐几个非常棒的学习计算机语言的网站

热门文章

  1. VGG合成文字数据生成方法
  2. base64格式的pdf预览
  3. mysql运维监控工具排名_运维监控工具
  4. 2020年javaWeb面试题(初)
  5. 索尼微单连android手机软件,(收藏)如何将手机连接上SONY微单的WIFI进行遥控拍摄...
  6. 汇编实验 用Radasm设计生成一个对话框,实现如图1.1所示的四则运算计算器
  7. cad2020打印样式放在哪个文件夹_打印机故障:打印一直出现乱码,什么原因?...
  8. 【Web漏洞探索】跨站请求伪造漏洞
  9. P7 黑客是如何发现女朋友出轨的,痛心的经历!
  10. 国产CI520 13.56MHz非接触式读写器NFC读卡芯片替代CV520