博弈论经典入门

文章目录

  • 博弈论
        • 常见模型
          • 必胜点和必败点的概念:
          • 必胜点和必败点的性质:
        • 巴什博弈
        • 斐波那契博弈
        • 威佐夫博弈
        • 尼姆博弈
        • SG函数与SG定理

博弈论

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

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

算法中常见的博弈论题目一般是公平组合游戏,那么什么是公平组合游戏呢?

公平组合游戏的定义如下:

​ 游戏有两个人参与,二者轮流做出决策,双方均知道游戏的完整信息;

​ 任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关,而与游戏者无关;

​ 游戏中的同一个状态不可能多次抵达,游戏以玩家无法行动为结束,且游戏一定会在有限步后以非平局结束。

大部分的棋类游戏都 不是 公平组合游戏,如国际象棋、中国象棋、围棋、五子棋等(因为双方都不能使用对方的棋子)。

常见模型

几种模型均存在奇异局面,即双方均采取最优策略,若处于奇异局面,必败。

所谓奇异局面,就是必败点。

必胜点和必败点的概念:

​ P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败。

​ N点:必胜点,处于此情况下,双方操作均正确的情况下必胜。

必胜点和必败点的性质:

​ 1、所有终结点是 必败点 P 。(我们以此为基本前提进行推理,换句话说,我们以此为假设)

​ 2、从任何必胜点N 操作,至少有一种方式可以进入必败点 P。

​ 3、无论如何操作,必败点P 都只能进入 必胜点 N。

我们研究必胜点和必败点的目的时间为题进行简化,有助于我们的分析。通常我们分析必胜点和必败点都是以终结点进行逆序分析。

巴什博弈

只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。

分析

当总个数小于等于m的时候,先手胜。

当总个数为m + 1的时候,后手胜。

当总个数为m + 2的时候,先手可使后手面对m + 1局面,先手胜。

可推断,若总个数为k *(m + 1),后手胜。

若总个数为k * (m + 1) + s(s <= m),先手胜。

例题:https://ac.nowcoder.com/acm/contest/11746/D

if(n % (m + 1) != 0)return first win;
elsereturn second win;

斐波那契博弈

1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.

结论:当n为斐波那契数时,先手必败。

分析见: https://blog.csdn.net/dgq8211/article/details/7602807

模板

void Init()//斐波那契数列,先打表,范围看情况
{f[0]=f[1]=1;for(int i=2;i<=55;i++){f[i]=f[i-1]+f[i-2];}
}
int n;
int flag = 0;
for(int i = 0;f[i];i++){//分别比较,判断出n是否是斐波那契数if(f[i] == n){flag = 1;break;}
}
if(!flag)return first win;
elsereturn second win;

威佐夫博弈

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

结论:若两堆物品的初始值为(x,y),则令z = abs(y-x);记w =(int)[ ( (sqrt(5)+1) /2 )*z ];若w = min(x,y),则先手必败,否则先手必胜。

例题:https://ac.nowcoder.com/acm/contest/11746/E

分析见:https://blog.csdn.net/qq_41311604/article/details/79980882

模板

 int z = abs(y-x);if((int)(((sqrt(5)+1)/2)*z)!=min(x,y))return first win;elsereturn second win;

尼姆博弈

有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人获胜。

结论:判断这几堆物品的异或运算结果是否为0,如果为零,则先手必败。

分析:https://blog.csdn.net/Elliot_Alderson/article/details/84778775?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

模板

int n;
int a;
int num = 0;
cin >> n;
for(i = 0;i < n;i++){cin >> a;num ^= a;
}
if(num)return first win;
elsereturn second win;

台阶-Nim游戏

题目描述


现在,有一个n级台阶的楼梯,每级台阶上都有若干个石子,其中第i级台阶上有ai个石子(i≥1)。两位玩家轮流操作,每次操作可以从任意一级台阶上拿若干个石子放到下一级台阶中(不能不拿)。已经拿到地面上的石子不能再拿,最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。

此时我们需要将奇数台阶看做一个经典的Nim游戏,如果先手时奇数台阶上的值的异或值为0,则先手必败,反之必胜

证明:
先手时,如果奇数台阶异或非0,根据经典Nim游戏,先手总有一种方式使奇数台阶异或为0,于是先手留了奇数台阶异或为0的状态给后手
于是轮到后手:
①当后手移动偶数台阶上的石子时,先手只需将对手移动的石子继续移到下一个台阶,这样奇数台阶的石子相当于没变,于是留给后手的又是奇数台阶异或为0的状态
②当后手移动奇数台阶上的石子时,留给先手的奇数台阶异或非0,根据经典Nim游戏,先手总能找出一种方案使奇数台阶异或为0
因此无论后手如何移动,先手总能通过操作把奇数异或为0的情况留给后手,当奇数台阶全为0时,只留下偶数台阶上有石子。
(核心就是:先手总是把奇数台阶异或为0的状态留给对面,即总是将必败态交给对面)

因为偶数台阶上的石子要想移动到地面,必然需要经过偶数次移动,又因为奇数台阶全0的情况是留给后手的,因此先手总是可以将石子移动到地面,当将最后一个(堆)石子移动到地面时,后手无法操作,即后手失败。

因此如果先手时奇数台阶上的值的异或值为非0,则先手必胜,反之必败!

int res = 0;
int n;
cin >> n;for(int i = 1 ; i <= n ; i++)
{int x;cin >> x;if(i % 2) res ^= x;
}
if(res) return first win;
else return second win;

SG函数与SG定理

https://www.cnblogs.com/ECJTUACM-873284962/p/6921829.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度校园招聘历年经典面试题汇总:Java开发岗

&#xff08;1&#xff09;、Java中的多态 &#xff08;2&#xff09;、Object类下的方法 &#xff08;3&#xff09;、Finalize的作用和使用场景 &#xff08;4&#xff09;、Hashcode和equals &#xff08;5&#xff09;、为什么要同时重写hashcode和equals&#xff0c;不同时…

如何实现Oracle数据库之间的数据同步?

我们都知道&#xff0c;在Oracle数据库的管理与开发工作中&#xff0c;总会存在着一些表数据和基础资料数据&#xff0c;这时需要有效的将这些数据库进行同步合并&#xff0c;有没有什么简单的方法可以实现Oracle数据库之间的数据同步呢&#xff1f;在此诚恺科技重庆服务器频道…

c++面试题总结1

内存结构 堆&#xff1a;由程序员手动分配和释放&#xff0c;完全不同于数据结构中的堆&#xff0c;分配方式类似链表。由malloc&#xff08;c语言&#xff09;或new&#xff08;c&#xff09;来分配&#xff0c;free&#xff08;c语言&#xff09;和delete&#xff08;c&…

JBPM4.4整合SSH2项目

一&#xff1a;导入相应的jar包: *注意事项&#xff1a; (1).与项目中的jar包不能出现冲突 (2).版本应一致 jbpm-bpmn.jar jbpm-console-form-plugin.jar jbpm-console-graphView-plugin.jar jbpm-console-integration.jar jbpm-console-reports.jar jbpm-db.jar jbpm-example…

Linux简单命令收录(who,echo,date)【上】

shell严格区分输入命令的大小写&#xff0c;如who、Who和WHO是不同的&#xff0c;其中只有全小写——who是正确的Linux命令。 命令与选项和参数之间要用空格或制表符隔开。连续空格会被shell解释称单个空格。 选项&#xff1a;对命令的特殊定义&#xff0c;以“-”开始&#…

移动端测试面试题目大全

ADB工作原理 当用户启动一个adb客户端&#xff0c;客户端首先确认是否已有一个adb服务进程在运行。如果没有&#xff0c;则启动服务进程。当服务器运行&#xff0c; adb服务器就会绑定本地的TCP端口5037并监听adb客户端发来的命令&#xff0c;所有的adb客户端都是用端口 5037与…

Linux简单命令收录(cal,passwd,clear)【下】

1、cal NAME cal - display a calendar 显示日历 SYNOPSIS cal [options] [[[day] month] year] cal [options] [timestamp|monthname] 用法&#xff1a; cal [选项] [[[日] 月] 年] cal [选项] <时间戳|月份名> OPTIONS -1…

web知识点大总结

#第一章 Web基础知识 Web开发基本概念 1、万维网是一个由许多相互链接的超文本组成的系统&#xff0c;通过互联网访问。 2、web&#xff1a;worldwideweb&#xff0c;万维网&#xff0c;简称web&#xff0c;www&#xff0c;通常称为网页。 3、web开发&#xff1a;进行网页页…

Linux命令集—— cat AND more

1、cat NAME cat - concatenate files and print on the standard output 连接所有指定文件并将结果写到标准输出。【经常用来显示文件的内容&#xff0c;类似DOS的TYPE 命令】 SYNOPSIS cat [OPTION]... [FILE]... cat [选项]... [文件]... With no FILE, or when FILE…

Linux简单命令集——less

NAME less - opposite of more more的对立面 注意 与more命令类似&#xff0c;less命令也用来分屏显示文件的内容&#xff0c;但是less命令允许用户向前或向后浏览文件。例如&#xff0c;less命令显示文件内容时&#xff0c;可以用⬆键和⬇键分别将屏幕内容下移一行和上移一…

《重构-改善既有代

重要列表 1、如果你发现自己需要为程序添加一个特性&#xff0c;而代码结构使你无法很方便地达成目的&#xff0c;那就先重构哪个程序&#xff0c;使特性的添加比较容易的进行&#xff0c;然后再添加特性 2、重构前&#xff0c;先检查自己是否有一套可靠的测试机制&#xff0…

Myeclipse 6.5 优化

1、取消自动validation validation有一堆&#xff0c;什么xml、jsp、jsf、js等等&#xff0c;我们没有必要全部都去自动校验一下&#xff0c;只是需要的时候才会手工校验一下&#xff01; 取消方法&#xff1a; windows–>perferences–>MyEclipse Enterprise Workbench–…

Linux简单命令集——head

NAME head - output the first part of files 输出文件的第一部分SYNOPSIS head [OPTION]... [FILE]...head [选项]... [文件]...head命令在屏幕上显示指定文件file的开头若干行&#xff0c;行数由参数值来确定。显示行数的默认值是10。-c, --bytes[-]NUM print the firs…

操作系统中避免死锁的银行家算法【表面C++实际C语言】一学就废的菜鸡代码

文章目录银行家算法实验原理数据结构初始化输出资源分配量安全性算法银行家算法完整代码测试数据测试结果第一题第二题银行家算法 银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源&#xff0c;但系统在进行资源分配之前&#xff0c;应先…

GitHub 使用指南

目录切换分支删除已有文件只删除远程仓库中的文件&#xff0c;不删除本地仓库中的文件同时删除远程仓库和本地仓库中的文件提交文件git查看本地分支连接的是哪个远程分支切换分支 查看本地和远程所有分支 git branch -a当前本地分支为绿色&#xff0c;当前所在分支前带有“*”号…

百度EBG测试部AI测试工程师面经

百度EBG测试部AI测试工程师 1、自我介绍 自我介绍尽量多说一点&#xff0c;她会问你“还有吗&#xff1f;” 2、项目介绍 简历上的项目都让介绍了。会问这个项目是做什么的&#xff0c;是由谁开发&#xff0c;项目如何得到的&#xff0c;在测试过程中实现了什么。 3、自己…

一学就废的并查集它来了

文章目录题目描述输入输出样例输入样例输出提示算法思想代码实现寻找根节点汇总连接情况完整代码关于flag的初值题目描述 某省调查城镇交通状况&#xff0c;得到现有城镇道路统计表&#xff0c;表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城…

一道很简单的贪心算法题~【贪心:我不要脸的伐?】

文章目录题目描述输入输出样例输入样例输出C语言代码实现思路排序处理完整代码C代码实现排序完整代码彩蛋题目描述 小健有一家自己的商店&#xff0c;主营牛奶饮品&#xff0c;最近资金紧张&#xff0c;他想以尽可能低的价格进购足够的牛奶以供日常的需要。所以小健想要求助你…

Eclipse 中修改java编译版本

修改方法是&#xff1a; 1&#xff1a;Preferences-->Java-->Compiler->Compiler compliance level&#xff0c;选择一个需要的版本&#xff0c;比如从默认的1.4改为5.0 2&#xff1a;如果只想修改一个工程的Compiler compliance level,就右单击工程&#xff0c;选择属…

百战c++(1)

Public和private的区别 public和private是类里的关键字&#xff0c;用于规定类内数据或者成员函数的访问权限。private类型的数据或者函数&#xff0c;只能在相应的类内被访问&#xff0c;而public类型的数据或者函数被访问的权限比较宽&#xff0c;还可以在其它类或者其它函数…