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

通俗地讲,博弈论主要研究的是:在一个游戏中,进行游戏的多位玩家的策略

对于算法竞赛中的博弈问题,一般具有以下特征:

博弈模型为两人轮流决策的非合作博弈。即两人轮流进行决策,并且两人都使用最优策略来获取胜利
博弈是有限的。即无论两人怎样决策,都会
在有限步后决出胜负
公平博弈。即两人进行决策所遵循的规则相同

(一)巴什博弈

术语:正经人称(m+1)的局面为奇异局势

1堆n个石子每次最多取m个、最少取1个--------(m+1的局势)

情形一:如果n=m+1,那么由于一次最多只能取m个,所以无论先者拿走多少个,后者都能够一次拿走剩余的物品,后者必胜

情形二:如果n=(m+1)*r+s,(r为任意自然数且s≤m),那么先者要拿走s个物品,如果后者拿走k(1≤k≤m)个,那么先者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先者必胜

情形三:如果n=(m+1)*r,先者拿走k(1≤k≤m)个,那么后者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,则后者必胜

总之,只要给对手留下(m+1)的倍数,就能获胜。(m+1)的倍数则后者比赛,反之先者必胜

变式

两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜(等价于从一堆100个石子中取石子,最后取完的胜)

例题:POJ2368 -- Buttons

解法一:数据为10^8,会TLE

#include<cstdio>
#include<iostream>
#define int long long
using namespace std;signed main(){int n;cin>>n;for(int i=2;i<n;i++){if(n%(i+1)==0){cout<<i;return 0;}}cout<<0;return 0;
}

解法二:遍历一遍n的所有因数并存起来,再输出最小大于等于3的因数减1

#include<iostream>
#include<algorithm>
#define int long long
using namespace std;const int N=10005;
int a[N];
signed main(){int n,t=0;cin>>n;for(int i=1;i*i<=n;i++){if(n%i==0&&i*i!=n){a[++t]=i;a[++t]=n/i;}else if(n%i==0&&i*i==n){a[++t]=i;}}sort(a+1,a+t+1);for(int i=1;i<=t;i++){if(a[i]>=3){cout<<a[i]-1;break;}} return 0;
} 

(二)尼姆博弈

术语:正经人称(m,m)的局面为奇异局势

n堆石子,每堆石子的数量是a1,a2,a3……,二个人依次从这些石子堆中的一个拿取任意的石子,至少一个,最后一个拿光石子的人胜利

情形一:n=1,先手全拿,先手必胜

情形二:n=2,有两种情况,一种可能相同,一种情况一堆比另一堆少或多

             (1)(m,m) 按照“有一学一,照猫画猫”法,后手必胜

             (2)(m,M)先手先从多的一堆中拿出(M-m)个,此时后手面对(m,m)的局面,先手必胜

情形三:n=3,(m,m,M)先手必胜,先手可以先拿M,之后变成了(m,m,0)的局面,是不是很熟悉~

 (a1,a2,a3)的话,举个例子(1,2,3),先手取完之后可能的局面为(0,2,3),(1,1,3),(1,0,3),(1,2,2),(1,2,1),(1,2,0)都是之前讲过的

异或为0,先手必输 ,后手必胜

(三)威佐夫博弈

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

先手必输局势的规律(奇异局势)无论先手怎么取,后手必胜

  • 第一种(0,0)
  • 第二种(1,2)
  • 第三种(3,5)
  • 第四种  (4,7)
  • 第五种(6,10)
  • 第六种  (8,13)              
  • 第七种  (9,15)
  • 第八种  (11,18)
  • 第n种(a,b)

他们的差值递增的,分别是0,1,2,3,4,5,6,7......n

还有一个规律(正常人都发现不了):a=(b-a)*1.618向下取整!!!!!

a=int(b-a)*1.618

注:这里的int是强制类型转换,注意这不是简单的四舍五入,假如后面的值是3.9,转换以后得到的不是4而是3,也就是说强制int类型转换得到的是不大于这个数值的最大整数。

有些题目要求精度较高,我们可以用下述式子来表示这个值:

1.618=(sqrt(5.0)+1)/2;   

头文件:include<math.h>

例题:POJ1067 -- 取石子游戏

#include<iostream>
#include<cmath>
#define int long long
using namespace std;signed main(){double a,b;while(cin>>a>>b){if(a>b){swap(a,b);}double x=(int)((b-a)*((sqrt(5.0)+1)/2));if(a==x){cout<<0<<endl;}else{cout<<1<<endl;}}return 0;
}

博弈论(巴什博奕/尼姆博奕/威佐夫博奕)详解相关推荐

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

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

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

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

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

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

  4. 三种经典博弈(巴什博弈,威佐夫博奕,尼姆博奕)

    前言: 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等 均可.两个人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间 很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的 ...

  5. 三大数学博弈:巴什博奕 威佐夫博奕 尼姆博奕

    有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个 人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间很古老的一个游戏 ,别看这游戏极其简单,却蕴含着深刻的数学原理 ...

  6. 巴什博奕,威佐夫博奕,尼姆博奕,斐波那契博弈模板

    1.巴什博奕 只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够 ...

  7. 博弈的三个巨人 巴什博奕 威佐夫博奕 尼姆博奕

    转载一篇有关博弈写得不错的文章,同时也对文章中的错误部分修正. 博客正容:[一](先来苦涩的理论) (一)巴什博奕(Bash Game):只有一堆n 个物品,两个人轮流从这堆物品中取物, 规定每次至少 ...

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

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

  9. python博弈论_博弈论 威佐夫博奕呜

    有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者. ...

  10. 【威佐夫博奕】 betty定理 poj 1067

    Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

最新文章

  1. python俄罗斯方块算法详解_用 Python 写一个俄罗斯方块游戏 (
  2. python怎么写文件-Python读写文件
  3. 基于沙盒环境,安装python3.6
  4. loadrunner基础知识问答(转)
  5. android 标题图标,android 中 actionbar 常用方法。设置标题,隐藏图标等
  6. WCF(五) 深入理解绑定
  7. 计算机符号的英文名,【常见符号英文名称】英文名称
  8. mysql redis hbase_MySQL之基本介绍
  9. labelme新版本的使用须知
  10. [LeetCode-JAVA] Remove Duplicates from Sorted Array II
  11. 关于语雀知识库的二三事
  12. 中国大学生学习与发展追踪研究(2007年至今)与中国综合社会调查(2003-2017年)与中国社会状况综合调查(2006-2019年)
  13. http协议如何获取请求参数
  14. python的撤销和回退_撤销和回退
  15. 封装一个简单showToast组件 / 自定义toast组件
  16. 怎么把视频内存压缩小?视频内存过大怎么压缩?
  17. 免费实时汇率查询Api接口
  18. TI公司TMS封装与引脚对应关系
  19. 可怜的RSA【网络攻防CTF】(保姆级图文)
  20. easyui datagrid列表右侧空白解决办法

热门文章

  1. 那些年 我们一起玩的ICQ
  2. 直板手机天量超2000款,国产品牌泥牛入海
  3. 【18】[C语言]抓交通肇事犯。一辆卡车违反交通规则,撞人后逃跑。现场有3人目击事件,但没有记住车牌号,只记住了车号的一些特征。
  4. 海康威视摄像机的实时读取篇二(海康SDK开发环境配置)
  5. excel实现排列组合
  6. MATLB|改进遗传算法优化微电网调度(考虑环境)
  7. 零基础Python数据分析实战:豆瓣人的电影口味重吗?
  8. Linux下抓包工具tcpdump详解
  9. 软件测试--软件测试模型:V模型和W模型
  10. egg渲染html模板