Game Theory In Competitive Programming|Part1 (原创)

Game Theory In Competitive Programming|Part1

在算法竞赛中,博弈论是一个经常出现的题目类型。通常是两个人在给定规则下,每个人都按照最优策略进行博弈,我们的任务是找出获胜者。这通常是贪心算法、动态规划等算法的混合。下面,将对博弈论中的一些经典问题进行讨论。

文章目录

  • Game Theory In Competitive Programming|Part1
    • Bash game
    • Nim game
    • Misère Nim game

在这里,我们讨论的是博弈游戏中的一类,即能够找到必胜策略的博弈。

并分析它的通用策略是什么?

Bash game

巴什博弈是一个简单的游戏,我们将通过分析这个游戏来引出我们分析博弈游戏的通用策略

让我们考虑这样一个游戏:

题目:

最初有一堆数量为 15 15 15的石子,选手甲、乙交替操作,每次操作需要从石子堆中拿走不超过 3 3 3个石子。

甲先手操作,取走最后一个石子的选手获胜。请问最终谁获胜?

分析:

没错,这是一个有必胜策略的游戏。

如果必胜策略不明显的话,不妨手动写出所有的状态来观察规律。

(这是一种常用的解决博弈问题的手段)。

下图为当先手操作时,面对特定的石子数量的时候,游戏最终的结果:

(L:Lose,W:Win)。

石子个数0123456789101112131415
最终结果LWWWLWWWLWWWLWWW

结论:

不难观察出,当石子个数被 4 4 4​整除的时候,先手必败,否则先手必胜。

这是为什么呢?

是因为,几乎所有具有必胜策略的游戏,都遵守两条关于必胜态,必败态的准则:

  • 如果当前状态能转移到必败态,当前状态是必胜态。
  • 如果当前状态只能转移到必胜态,当前状态是必败态。

我们能知道的是, 0 0 0是一个必败态。而先手能一次拿走 1 ∼ 3 1\sim3 13个石子。

故当石子个数为 1 1 1 2 2 2 3 3 3的时候,

这三个状态能转移到必败态,所以它们是必胜态。

于是我们可以抽象出一张图:(黑色是必败点,粉色是必胜点)。

在这里插入图片描述


现在我们将题目改的更普通一点还能得到必胜策略吗?

题目:

最初有一堆数量为 N N N的石子,选手甲、乙交替操作,每次操作需要从石子堆中拿走不超过 k k k个石子。

甲先手操作,取走最后一个石子的选手获胜。请问最终谁获胜?

必胜策略:

如果石子的个数是 ( k + 1 ) (k+1) (k+1)​的整数倍,说明先手必败,否则先手必胜。

我们依然能通过画图列表来得到这个结论。

这说明它们是博弈游戏中通用的观察必胜策略的手段。


现在我们考虑另一个游戏来试验这种分析手段是否可行:

题目:

最初有一堆数量为 8 8 8的石子,选手甲、乙交替操作,每次操作可以从石子堆中拿走数量为 x x x的石头,

x x x是当前石子数量的约数,且小于当前石子数量。

甲先手操作,无法取石头的人输。请问最终谁获胜?

分析:

石头数量12345678
最终结果LWLWLWLW

通过列表的方法,我们发现了这样的结论:当石头个数为奇数,先手必败,否则先手必胜。

Nim game

Nim游戏是博弈游戏中的一个重要角色,因为它和其他很多博弈有着相同的特性。

甚至能用相同策略进行解决,我们将重点讨论Nim游戏,Nim游戏的策略推广到其他博弈。

题目:

最初有 n n n堆石子,第 i i i堆石子最初有 x i x_i xi个。

A l i c e 、 B o b Alice、Bob AliceBob轮流操作,每次操作可以选择拿走一堆石子中取任意数量的石子(至少为 1 1 1)。

无法取石子的玩家输掉比赛。

这也是一个具有必胜策略的游戏。

结论:

设每一堆石子最初的数量异或和为: s s s ( s = x 1 ⨁ x 2 ⨁ . . . ⨁ x n ) (s=x_1\bigoplus x_2\bigoplus...\bigoplus x_n) (s=x1x2...xn)

s = 0 s=0 s=0的时候,先手必败,否则先手必胜。

分析:

不妨设 W W W是必胜态, L L L是必败态。

根据之前说的理论:

  • 如果当前状态能转移到必败态,当前状态是必胜态。
  • 如果当前状态只能转移到必胜态,当前状态是必败态。

需要验证 N i m   g a m e Nim \:game Nimgame的结论是否符合上述理论:

1、当 s = 0 s=0 s=0时,拿走任意一堆的任意数量的石头,都会使得 s ≠ 0 s\neq0 s=0

2、当 s ≠ 0 s\neq0 s=0时,总有方法拿走某个堆的某个数量的石头,使得 s = 0 s=0 s=0。​

验证:

x 1 , . . . , x n x_1,...,x_n x1,...,xn是移动前的各堆石子数, y 1 , . . . y n y_1,...y_n y1,...yn是移动后各堆石子数。

s = x 1 ⨁ . . . ⨁ x n s=x_1\bigoplus...\bigoplus x_n s=x1...xn t = y 1 ⨁ . . . ⨁ y n t=y_1\bigoplus...\bigoplus y_n t=y1...yn

可以进行等价变换:

t = 0 ⨁ t t=0\bigoplus t t=0t

   = s ⨁ s ⨁ t \:\: =s\bigoplus s\bigoplus t =sst

    = s ⨁ ( x 1 ⨁ . . . ⨁ x i ⨁ . . . ⨁ x n ) ⨁ ( y 1 ⨁ . . . ⨁ y i ⨁ . . . ⨁ y n ) \:\:\:=s\bigoplus (x_1\bigoplus...\bigoplus x_i\bigoplus...\bigoplus x_n)\bigoplus (y_1\bigoplus...\bigoplus y_i\bigoplus...\bigoplus y_n) =s(x1...xi...xn)(y1...yi...yn)

    = s ⨁ ( x 1 ⨁ y 1 ) . . . ( x i ⨁ y i ) . . . ( x n ⨁ y n ) \:\:\:=s\bigoplus(x_1\bigoplus y_1)...(x_i\bigoplus y_i)...(x_n\bigoplus y_n) =s(x1y1)...(xiyi)...(xnyn)

    = s ⨁ x i ⨁ y i \:\:\:=s\bigoplus x_i\bigoplus y_i =sxiyi

    = s ⨁ x i ⨁ y i \:\:\:=s\bigoplus x_i\bigoplus y_i =sxiyi

x i x_i xi代表的是第 i i i堆在操作前的石子数量, y i y_i yi是操作后的石子数量,因为只操作了一堆,所以其他堆的异或值是 0 0 0​。

理论 1 1 1

  • s = 0 s=0 s=0时,拿走任意一堆的任意数量的石头,都会使得 s ≠ 0 s\neq0 s=0

s = 0 s=0 s=0时,若想要 t = 0 t=0 t=0,那么说明 x i = y i x_i=y_i xi=yi,不可能实现。

理论 2 2 2

  • s ≠ 0 s\neq0 s=0时,总有方法拿走某个堆的某个数量的石头,使得 s = 0 s=0 s=0

s ≠ 0 s\neq 0 s=0时,若想要 t = 0 t=0 t=0,只需要令$ y_i=s\bigoplus x_i$ 即可,也就转证为是否存在一个堆满足 x i > s ⨁ x i x_i>s\bigoplus x_i xi>sxi

这是存在的:

d d d s s s二进制中最左边 1 1 1的位置。

可以选择第 i i i堆,使得 x i x_i xi在第 d d d位是 1 1 1(这样的堆一定存在不然 s s s的第 d d d位只能是 0 0 0)。

此时 y i = x i ⨁ s y_i=x_i\bigoplus s yi=xis

这也代表着, y i y_i yi d d d的左边的所有位都与 x i x_i xi相同,但第 d d d位为 0 0 0,所以 y i < x i y_i<x_i yi<xi

Misère Nim game

这是Nim game的相反版本,因为它规定,取走最后一个石子的人是输家。

这样的情况是比较复杂的,因为我们不能简单的取反Nim game的结论。

我们假设Misère Nim game的获胜条件是:

设每一堆石子最初的数量异或和为: s s s ( s = x 1 ⨁ x 2 ⨁ . . . ⨁ x n ) (s=x_1\bigoplus x_2\bigoplus...\bigoplus x_n) (s=x1x2...xn)

s = 0 s=0 s=0的时候,先手必胜,否则先手必败。

我们需要证明这是错的:

显然能找到反例,当只有 1 1 1堆,且这一堆的石子数量为 1 1 1的时候, s ≠ 0 s\neq 0 s=0,但先手败了。

所以简单的取反Nim game的结论是无法解决这样的问题的。

给出结论:

1、如果每堆石子个数都是 1 1 1,结论与Nim game相反

2、若存在石子数量大于 1 1 1​的石子堆,此时结论与Nim game相同。

证明 1 1 1是对的:

如果每一堆石子个数都是1,如果有奇数堆,显然先手必败,如果有偶数堆,显然先手必胜。

证明 2 2 2是对的:

设先手面临的局面是: s ≠ 0 s\neq 0 s=0

先手进行一次操作使得局面变为 s = 0 s= 0 s=0

后手不管怎么操作,都只能将这个局面变为 s ≠ 0 s\neq 0 s=0

不断这样下去,在游戏的终态总会出现两堆不一样的石子 ( s ≠ 0 ) (s\neq 0) (s=0)

因为我们已经假设石子数大于 1 1 1,可以证明的是,在这种情况下,先手总是能迫使后手移走最后一个棋子。

设最终剩下了两堆石子,每堆石子的数量为 x x x y y y ( x > y ) (x>y) (x>y)

1、如果 y = 1 y=1 y=1,那么先手直接拿走 x x x,后手只能被迫拿走最后一个石头,先手获胜。

2、如果 y ≠ 1 y\neq 1 y=1,那么先手拿走 x − y x-y xy,后手的操作情况如下:

  • 拿走一堆,此时先手只需要将另一堆拿至剩下 1 1 1,后手只能被迫拿走最后一个石子,先手获胜。
  • 将一堆拿至剩下 1 1 1,此时先手只需要将另一堆拿走,后手只能被迫拿走最后一个石子,先手获胜。
  • 拿走一堆中的一些,此时先手仿照后手拿走另一堆的相同数量即可。

所有情况总是先手获胜,所以证明了结论2。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apache和Nginx的区别以及如何选择

近来遇到一些客户需要lnmp环境的虚拟主机&#xff0c;但是Hostease这边的虚拟主机都是基于Apache的&#xff0c;尽管二者是不同的服务器软件&#xff0c;但是大多数情况下&#xff0c;通过适当的配置和调整两者程序也是可以兼容的。 目前市面上有许多Web服务器软件&#xff0c;…

哈希表实现-哈希桶法

哈希桶方法 由于直接定值法实现哈希表有着明显的弊端——如果多个节点的hash值相同会往后堆积&#xff0c;所以衍生出哈希桶方法 我们的哈希表设置成一个结点指针数组&#xff0c;每个哈希值对应的是一串链表&#xff0c;形状就像一个一个的桶我们就会把hash值相同的节点放到一…

宝塔怎么配置nginx

宝塔怎么配置nginx 1.找到nginx配置位置 2.修改nginx.conf文件 3.重启nginx

21岁的人生赚51W!拒绝捞男捞女,翻身也要爱惜身体!——早读(逆天打工人爬取热门微信文章解读)

身体是革命的本钱 引言Python 代码第一篇 卢克文工作室 捞女在今天的中国是怎样的存在第二篇 人民日报 来啦 新闻早班车要闻社会政策 结尾 我将我的健康视为生活的基石 不会为了短暂的成功而牺牲 我珍惜身体 知道健康是实现梦想的前提 引言 这里毕竟是一个程序员的代码学习平台…

基于SpringBoot实现各省距离Excel导出实战

目录 前言 一、列表及图表信息展示 1、数据过滤调整 2、信息列表及图表展示 3、Excel写入 二、界面可视化 1、Echarts图表和列表展示 2、城市详情和下载功能设计 三、成果展示 1、图表展示 2、部分城市数据分析 总结 前言 今天是五一黄金周假期第二天&#xff0c;不知…

Redis(Jedis和SpringBoot整合Redis)

文章目录 1.Jedis1.介绍2.环境配置1.创建maven项目2.pom.xml引入依赖3.新建一个包并创建一个文件 3.Jedis远程连接到Redis1.Redis放到服务器可以连接的前提条件2.为Redis设置密码1.编辑配置文件2.找到 requirepass3.设置密码为root4.重启Redis&#xff0c;在shutdown的时候报错…

R语言实战——中国职工平均工资的变化分析——相关与回归分析

链接: R语言学习—1—将数据框中某一列数据改成行名 R语言学习—2—安德鲁斯曲线分析时间序列数据 R语言学习—3—基本操作 R语言学习—4—数据矩阵及R表示 R语言的学习—5—多元数据直观表示 R语言学习—6—多元相关与回归分析 1、源数据 各行业平均工资变化 各地区平均工资…

常用算法介绍

1. 冒泡排序&#xff1a;冒泡排序是一种简单的排序算法&#xff0c;它的基本思想是比较相邻的两个元素&#xff0c;如果顺序错误就交换它们的位置&#xff0c;直到所有元素都按照升序排列。 2. 快速排序&#xff1a;快速排序是一种高效的排序算法&#xff0c;它的基本思想是选取…

内网端口转发与代理

思路&#xff1a;渗透的前提是双方能够建立通信。目前无法和win7建立通信&#xff0c;但是拿到了windows2003的权限&#xff0c;所以可以在Windows2003主机上面建立节点&#xff0c;作为跳板机去访问到内网。 目前状态&#xff1a;控制win2003&#xff08;IP&#xff1a;192.1…

基于JSP的人才公寓管理系统

目录 背景 技术简介 系统简介 界面预览 背景 随着互联网的广泛推广和应用&#xff0c;人才公寓管理系统在网络技术的推动下迅速进步。该系统的设计初衷是满足住户的实际需求&#xff0c;通过深入了解住户的期望&#xff0c;开发出高度定制化的人才公寓管理系统。利用互联网…

如何进行Go语言的性能测试和调优?

文章目录 开篇一、性能测试1. 使用标准库中的testing包2. 使用第三方工具 二、性能调优1. 优化算法和数据结构2. 减少不必要的内存分配和垃圾回收3. 并发和并行 结尾 开篇 Go语言以其出色的性能和简洁的语法受到了广大开发者的喜爱。然而&#xff0c;在实际开发中&#xff0c;…

39.乐理基础-拍号-认识音符

拍号是一个分数的形式&#xff0c;如下图篮色的圈圈里的东西&#xff0c;但它的实际意义和分数没什么关系&#xff0c;只是外观上是一个分数的形式 单独拿出拍号&#xff0c;如下图&#xff1a; 然后接下来只要搞懂什么是 Y分音符、一拍、小节就可以了。 音符&#xff1a; 控…

Java | Leetcode Java题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; class Solution {public String addBinary(String a, String b) {StringBuffer ans new StringBuffer();int n Math.max(a.length(), b.length()), carry 0;for (int i 0; i < n; i) {carry i < a.length() ? (a.charAt(a.leng…

特征提取(Feature Extraction)常见统计特征笔记(三)

统计特征是描述数据集中值的一组量&#xff0c;通常用于了解数据的分布、集中趋势和变异程度。常见的统计特征包括均值、中位数、众数、标准差、方差等。下面会详细解释每个统计特征&#xff0c;并给出相应的Python代码。 1、均值&#xff08;Mean&#xff09;&#xff1a;所有…

分布式存储 Ceph 的演进经验

从 2004 年到今天&#xff0c;Ceph 的存储后端一直都在演变&#xff0c;从最开始基于 B 树的 EBOFS 演变到今天的 BlueStore&#xff0c;存储后端已经变得非常成熟&#xff0c;新的存储系统不仅能够提供良好的性能&#xff0c;还有着优异的兼容性。我们在这篇文章中将要简单介绍…

华为eNSP小型园区网络配置(上)

→跟着大佬学习的b站直通车← 目标1&#xff1a;dhcp分配ip地址 目标2&#xff1a;内网用户访问www.yzy.com sw1 # vlan batch 10 # interface Ethernet0/0/1port link-type accessport default vlan 10 # interface Ethernet0/0/2port link-type trunkport trunk allow-pass…

【Linux】网络连接配置——nmcli工具配置连接增删改查实例

nmcli工具配置连接增删改查实例 &#xff08;一&#xff09;网络连接配置基本项目1.网络接口配置2.主机名配置3.DNS服务器配置 &#xff08;二&#xff09;网络连接配置文件&#xff08;三&#xff09;网络配置方法&#xff08;四&#xff09;nmcli工具配置连接管理1.增2.查3.改…

prometheus+grafana的安装与部署及优点

一、Prometheus 的优点 1、非常少的外部依赖&#xff0c;安装使用超简单&#xff1b; 2、已经有非常多的系统集成 例如&#xff1a;docker HAProxy Nginx JMX等等&#xff1b; 3、服务自动化发现&#xff1b; 4、直接集成到代码&#xff1b; 5、设计思想是按照分布式、微服…

GPT-3

论文&#xff1a;Language Models are Few-Shot Learners&#xff08;巨无霸OpenAI GPT3 2020&#xff09; 摘要 最近的工作表明&#xff0c;通过对大量文本进行预训练&#xff0c;然后对特定任务进行微调&#xff0c;在许多NLP任务和基准方面取得了实质性进展。虽然这种方法…

stm32单片机开发二、定时器-内部时钟中断和外部时钟中断、编码器

定时器本质就是一个计数器 案例&#xff1a;定时器定时中断 内部时钟中断 Timer_Init(); //定时中断初始化 /*** 函 数&#xff1a;定时中断初始化* 参 数&#xff1a;无* 返 回 值&#xff1a;无*/ void Timer_Init(void) {/*开启时钟*/RCC_APB1PeriphClockCmd(RCC…