一、巴什博弈(Bash Game)

只有一堆n个物品,两个人从轮流中取出(1~m)个;最后取光者胜。

考虑到 若n=m+1 那么 第一个人不论如何取都不能取胜。

进一步我们发现 若 n=k*(m+1)+r; 先取者拿走 r 个,那么后者再拿(1~m)个

n=(k-1)*(m+1)+s; 先取者再拿走s 个 最后总能造成 剩下n=m+1 的局面。

因此,此时先手有必赢策略。

相对应的,若n=k*(m+1) 那么先取者必输。

因此我们可以写出对应的程序(默认 n m都大于0)

 int Bash_Game(int n,int m)//是否先手有必赢策略{if (n%(m+1)!=0) return 1;return 0;}

二、尼姆博弈(Nimm Game)

正如上述.

从巴什博弈我们知道一个当情形对应一种状态,而由一个状态只能变为另一种状态时能很轻易地判断是否先手有必赢策略

那么怎么样才能在尼姆博弈里找到这样的状态呢?

如果把n堆抽象为n个非负整数,再将n个整数转化为二进制,然后对n个二进制数按位相加(不进位),若每一位相加都为偶数,

那么称这个状态为偶状态,否则称它为奇状态.

可以证明:任何一个偶状态在其中一个数变小后一定成为奇状态,而一个奇状态一定可以通过改变一个数变成偶状态.

前一点很显然,因为一个数变小至少有一位发生改变,这一位就改变了原来的偶状态.

对于后一点,对于一个从高位到低位某一位和为奇的奇状态,必定有一个数的二进制表示在此位为1,对于后面的较低位和为奇的情况,只要把这个数对应位取反即可得到一个偶状态.

到此,成功的构造了两个可以转换的状态!!!

那么对于n堆物品,只要判断它是否是奇状态就可以判断是否先手有必赢策略.

但是求每个数的二进制表示略显麻烦,可以用更好的办法,也是我偏爱的位运算.

XOR 和判断:

如果有奇数个二进制数在第K位为1 那么在这一位上的和为奇,同样的,偶数个1和为偶.

很明显位运算xor满足我们的要求,偶数个1异或和为0,奇数个为1;

由此,终于可以给出算法

int Nimm_Game(int n)//假设n个数存在数组f[]中,有必胜策略返回1
{int flag=0;for(int i=1;i<=n;i++)flag^=f[i];if(flag) return 1;return 0;
}

三 威佐夫博奕(Wythoff Game):

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

这种情况下是颇为复杂的。我们用(ak,bk)(ak ≤ bk ,k=0,1,2,…,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。

前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。

可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而 bk= ak + k,奇异局势有
如下三条性质:

1、任何自然数都包含在一个且仅有一个奇异局势中。
    2、任意操作都可将奇异局势变为非奇异局势。
    3、采用适当的方法,可以将非奇异局势变为奇异局势。

判断是否为奇异局势

设x=      k=[a*x],向上取整

如果a+k=b,则(a,b)为奇异局势,后手胜,反之为先手胜

对应的代码在这里:

int Wythoff_Game(int a,int b)
{if(a>b)swap(a,b);double x=(sqrt(5.0)-1.0)/2.0;int k=ceil(1.0*a*x);if(a+k==b)return 0;//奇异局势,后手胜!elsereturn 1;//非奇异局势,先手胜!
}

博弈论及算法实现(三种基础博弈)相关推荐

  1. c语言勾股定理程序流程图,方法总结1.表达算法的方法有自然语言.流程图和基本算法语句三种.先有自然语言.再画流程图.最后才能写出基本算法语句.即程序,——青夏教育精英家教网——...

    考点一:自然语言表示的算法 [内容解读]通过对解决具体问题过程与步骤的分析,体会算法的思想,了解算法的含义:对于某一问题往往可以设计出多种算法,通过选用步骤最少的.结构最好的算法. [命题规律]以选择 ...

  2. K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比

    原文:http://www.cnblogs.com/yixuan-xu/p/6272208.html K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means ...

  3. html引入外部css_CSS 三种基础选择器

    本节我们来学习 CSS 中的选择器,选择器是 CSS 里面一个很重要的概念,HTML 中的所有标签样式,都是通过不同的 CSS 选择器进行控制的.我们只需要通过选择器,就可以对不同的 HTML 标签进 ...

  4. js实现阶乘算法的三种方法

    js实现阶乘算法的三种方法 // 非递归写法 function f(n) {if (0 === n) {return 1;}let res = 1;for (let i = 1; i <= n; ...

  5. uniapp怎么引入css_CSS 三种基础选择器

    本节我们来学习 CSS 中的选择器,选择器是 CSS 里面一个很重要的概念,HTML 中的所有标签样式,都是通过不同的 CSS 选择器进行控制的.我们只需要通过选择器,就可以对不同的 HTML 标签进 ...

  6. ML之R:通过数据预处理利用LiR/XGBoost等(特征重要性/交叉训练曲线可视化/线性和非线性算法对比/三种模型调参/三种模型融合)实现二手汽车产品交易价格回归预测之详细攻略

    ML之R:通过数据预处理利用LiR/XGBoost等(特征重要性/交叉训练曲线可视化/线性和非线性算法对比/三种模型调参/三种模型融合)实现二手汽车产品交易价格回归预测之详细攻略 目录 三.模型训练 ...

  7. C语言快速排序算法及三种优化方式

    C语言快速排序算法及三种优化方式 C语言快速排序算法及三种优化方式 原理 快速排序复杂度分析 1 时间复杂度 2 空间复杂度 快速排序代码实现 1 普通快速排序 2 快速排序优化1-三数取中优化不必要 ...

  8. 弘辽科技:适合淘宝新手的三种基础引流技巧

    原标题<弘辽科技:适合淘宝新手的三种基础引流技巧> 要想网店生意好,那流量是必不可缺少的因素,因为流量是一家网店运营的基础,没有流量的店铺基本上无法维持正常运营的.作为一家网店的运营者,大 ...

  9. 智能重卡产品研发的三种逻辑博弈

    摘要 本文以智能驾驶重卡产品研发流程作为研究对象,首先简要阐述智能重卡行业发展故事,接着从分别阐述主机厂.传统Tier1.智驾公司的产品开发流程,由此总结出未来智能重卡的开发流程,供大家参考. 一.故 ...

最新文章

  1. Arm Cortex-M3 MCU性能
  2. 【TX2】安装NVIDIA SDK Manager(JetPack 4.6)后,下载kernel和u-boot源码
  3. 脑源(brainsourcing)技术可以自动识别人类的偏好
  4. [首次分析]PHP写框架
  5. [Usaco2010 Mar]gather 奶牛大集会
  6. java都市男人心痒痒_会让男人心痒痒的女人,是懂得套路的
  7. 前端每周清单第 39 期: OpenAI 与 gRPC, Gitlab 的 Vue 年度总结,GraphQL 技术栈漫游
  8. Mcafee VirusScan系列
  9. 华为无线设备配置WAPI-证书安全策略
  10. Android Beam 文件传输失败分析与解决
  11. 穿行大街小巷 寻找“没落儿”的扬州
  12. 完整登录、注册页面(无功能)
  13. ntp网络时间服务器(网络时钟同步)客户端与服务器端设置方法说明
  14. 五子棋-进阶版:C#窗体编写
  15. POJ 2455 dinic
  16. ‘When we dream, we have the perfect chemical canvas for intense visions’ “入梦时,我们就拥有了能够呈现强烈幻象的完美化学画布”
  17. 计算机中最基础 最重要的部件是,电脑最重要的部件是什么
  18. 中科蓝汛 ----POWER 10S复位系统的坑
  19. Android增量升级
  20. NanoPi开发板硬件接口

热门文章

  1. python 文件命令_python中写入文件数据及文件定位操作命令
  2. 【MySQL数据库系列】一、认识数据库、建库建表操作
  3. 数据库——完整性约束条件
  4. 项目案例:网上书店数据库设计
  5. 【JEECG技术文档】JEECG平台对外接口JWT应用文档V3.7.2
  6. BZOJ3238[Ahoi2013]差异
  7. 关于光纤收发器的一些基本常识介绍
  8. 简易的MySQL主从复制
  9. Android设备使用libusb和usb声卡
  10. Follow your heart (189)---那些正话反说,反话正说的方向