【算法设计与分析】三个博弈论算法分析
主要讨论三个比较常见的博弈游戏
Bash Game,Nim Game和Wythoff Game,较为领人惊叹的是,他们最后都是通过数论或者自然数性质完美解决:
Bash Game:同余理论
Nim Game:异或理论
Wythoff Game:黄金分割
(1)Bash Game:一堆n个物品,两人轮流取,每次取1至m个,最后取完者胜
比如10个物品,每次只能取1到5个,则先手方必赢
1.面对[1...m]个局面,必胜
2.面对m+1个局面,必输
3.如果可以使对手面临必输局面,那么是必赢局面
4.如果不能使对手面临必输局面,那么是必输局面
基础:1 , 2, ..., m是必赢局面, m+1是必输局面
递推:m+2,m+3, ... ,2m+1是必赢局面,2m+2是必输局面
...
k(m+1)是必输局面,应该允许k=0,因为0显然也是必输局面
在必输局和必赢局中,赢的一方的策略是: 拿掉部分物品,使对方面临k(m+1)的局面
例如上例中10个物品,只能拿1到5个,先手方拿4个即可,对手无论拿多少个,你下次总能拿完
从另一个角度思考这个问题,如果物品数量随机,那么先手一方胜利的概率是m/(m+1),后手方胜利的概率是1/(m+1)
(2)Nim Game: m堆n个物品,两人轮流取,每次取某堆中不少于1个,最后取完者胜
详细分析见:POJ-2234:Matches Game
所有物品数目二进制异或 为0,则先手必输
所有物品数目二进制异或不为0,则后手必输
从另一个角度思考这个问题,如果物品数量随机,那么每个数目的每一位上1或0概率相同,
如果有奇数个堆,那么1的个数为偶数或者奇数的概率相同,
如果有偶数个堆,那么1的个数为偶数的概率略大1/(m+1),
也就是说异或结果的每一位为0或1的概率几乎差不多,而先手必输要求异或结果每一位都为0,其实输的概率很小
(3)Wythoff Game:两堆(ak,bk)(ak<=bk)个物品,两人轮流取,每次从一堆中取k个或者从2堆中同时取k个,最后面对(0,0)局面的输(设ak<=bk是为了忽略顺序的影响)
1.面对(0,0)局面必输
2.面对(1,1)(2,2)...(n,n)局面必赢
(0,1)(0,2)...(0,n)局面必赢
3.如果可以使对手面临必输局面,那么是必赢局面
4.如果不能使对手面临必输局面,那么是必输局面
基础:(0,0)是必输局面;(0,1)(0 ,2)...(0,n)是必赢局面,
递推:(1,2)是必输局面;(1,1)是必赢局面
(1,3)(1 ,4)...(1,n)是必赢局面
(2,2),(2,3)...(2,n)是必赢局面
(3,5)是必输局面;(3,3)(3,4)是必赢局面
(3,6)(3,7)...(3,n)是必赢局面
(5,5)(5,6)...(5,n)是必赢局面
(4,7)是必输局面;(4,4)(4,5)(4,6)是必赢局面
(4,8)(4,8)(4,9)...(4,n)是必赢局面
(7,7)(7,8)(7,9)...(7,n)是必赢局面
(6,10)是必输局面;(6,6)(6,7)(6,8)(6,9)是必赢局面
(6,11)(6,12)(6,13)...(6,n)是必赢局面
(10,10)(10,11)(10,12)...(10,n)是必赢局面
首先发现规律:(必输局面的规律比较容易找到)
ak是前面必输局未出现的数中最小者,
bk=ak+k( k=0,1,2,3,...n)
下面介绍必输局(奇异局)的最重要性质:
1,2,...,n中每一个自然数,出现且只出现在一个奇异局中。
推导:1.由于ak总是选择未出现的数,所以每个数总能出现在奇异局中
且ak不会选择到重复的数
2.bk=ak+k,所以bk总是比前面所有奇异局出现的数都大,
所以bk不会选择到重复的数
必赢一方的策略是:始终让对手面对必输局(奇异局)
给定任意局势(a,b),判定(a,b)是否为必输局的方法是:
k=0,1...n 记黄金比例是φ=1.618033
ak=[k*φ],bk=ak+k=[k*φ*φ]
如k=0,ak=0,bk=0
k=1,ak=1,bk=2
k=2,ak=3,bk=5 k=3,ak=4,bk=7
更好的一种判断策略是 k = bk-ak ,如ak=k*φ时,当前局势为奇异局
从胜负概率角度,如果堆中数量随机,先手一方优势很大
(相应经典题目是POJ-1067)
三个十分相似的游戏,但局势的判断和必胜策略差异却很大,但却又都来自数的性质,这不得不说是一件让人惊奇的事情。
【算法设计与分析】三个博弈论算法分析相关推荐
- 哈工大威海算法设计与分析_【斯坦福算法分析和设计02】渐进分析
点击上方蓝字,关注公众号 目录 1. The Gist 1.1 为什么要学它(Motivation) 1.2 High level idea 1.3 4个例子 2. Big-Oh Notation 2 ...
- 算法设计与分析——算法学基础(三):渐进记号
分类目录:<算法设计与分析>总目录 相关文章: 算法学基础(一):算法学概述 算法学基础(二):分析算法 算法学基础(三):渐进记号 第<算法学基础(二):分析算法>中定义了算 ...
- 【算法设计与分析】经典常考三十三道例题AC代码
❥小虾目前大三,我校在大一下开设<数据结构>这门课,大二上开了<算法设计与分析>这门课,很庆幸这两门课的上机考试总成绩一门100,一门99,最后总分也都90+.下文会给出机试的 ...
- C++算法设计与分析课后习题(第三章)
C++算法设计与分析课后习题[第三章] 前言 一.求2+22+222+2222+...+22...(n个2)...22(精确计算) 变量解释 运行截图 二.编写一个算法,其功能是给一维数组a输入任意6 ...
- 算法设计与分析——全排列问题算法分析(递归调用分析图)
(目前网上最易理解递归调用的分析过程--递归调用分析图) 全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况 ...
- 算法设计与分析(python版)-作业三
参考教材:算法设计与分析(Python版) 作者:王秋芬 1 . 普通 (5分)以下问题中,哪些问题的分治算法消耗的时间与输入序列无关.() A. 二分查找 B. 合并排序 C. 快速 ...
- 算法设计与分析之最大流问题
最近在复习算法 对最大流问题加以学习和总结 配套视频学习效果更加 算法设计与分析_北京航空航天大学_中国大学MOOC(慕课) (icourse163.org) 一.实际背景/应用场景 最大流算法作为算 ...
- 算法设计与分析------蛮力法
算法设计与分析------蛮力法(c语言) 一.蛮力法(穷举法 枚举法) 1.定义 2.蛮力法使用情况 3.蛮力法的优点 4.蛮力法的缺点 5.采用蛮力法设计算法的2类: 6.简单选择排序和冒泡排序 ...
- 程振波 算法设计与分析_算法设计与分析
本书按照教育部*制定的计算机科学与技术专业规范的教学大纲编写,努力与国际计算机学科的教学要求接轨.强调 算法 与 数据结构 之间密不可分的联系,因而强调融数据类型与定义在该类型上的运算于一体的抽象数据 ...
- 算法设计与分析第一章递推算法
算法设计与分析 第一章 递推算法 1.概述 在**已知条件**和**所求问题**之间总存在着某种相互联系的关系,如果可以找到前后过程之间的数量关系(即递推式),那么,从**问题出发逐步推到已知条件** ...
最新文章
- [iptables]Redhat 7.2下使用iptables实现NAT
- php前端开发语言,web前端编程语言有哪些?
- Angular项目中,基于esriLoader+iframe实现不同页面调用3.x与4.x ArcGIS JS API
- linux内核printk调试
- 下载视频的一种简便方法
- 【Boost】boost库asio详解1——io_service::run函数无任务时退出的问题
- 书生云王东临:真正的超融合产品要像“机器猫” 开箱即用
- html代码type,HTML中type是什么意思
- HDU1181:变形课(DFS)
- python-面向对向-静态方法的继承-父类中的super方法
- 新一代Web安全治理体系让“我的地盘我做主”不再只是梦
- 阿里云产品专家解读链路追踪(Tracing Analysis)
- asp.net mvc源码分析-Action篇 Action的执行
- 在centos 6.5下安装svn (Subversion)
- MFC 教程【6_应用程序的退出 】
- 《Java深入解析》阅读笔记二(运算符与表达式)
- 新视觉在线制作网总汇模块代码(4例)
- 【PC】小米路由器Pro(R3P)升级/刷机
- 华为路由器:首次登陆配置Console、Telnet登录、Web登录
- 大数据常用命令-超全