Game Theory In Competitive Programming|Part2(原创)

在上一个Part部分,我们介绍了Bash game、Nim game、Misere Nim game 这三个游戏的玩法、必胜策略,以及必胜策略的证明,并介绍了有关必胜态以及必败态的两条定理,接下来我们会以Part1为基础,深挖其中的理论。

文章目录

    • 1、Grundy Numbers/Numbers and Mex的引入
          • 定义Mex
          • 定义运算Mex(set)
    • 2、Sprague-Grundy Theorem
          • Sprague-Grundy Theorem是什么
          • 应用S-G Theorem
    • 3、Practice
          • Game1
          • Game2
          • Game2.1
          • Game3

1、Grundy Numbers/Numbers and Mex的引入

G r u n d y N u m b e r s Grundy Numbers GrundyNumbers 是一种在组合游戏理论中用来分析游戏局势的数学概念。

它主要用于判断在一些特定游戏中,当前局面对先手玩家是有利的还是不利的。

具体地说,给定一个游戏状态或局面, G r u n d y Grundy Grundy数能表示这个局面的胜负情况。

定义如下:

1、如果一个局面是终止局面,其 G r u n d y Grundy Grundy数为 0 0 0

2、对于非终止局面,其 G r u n d y Grundy Grundy数定义为所有可能的下一步局面的 G r u n d y Grundy Grundy​数中最小未出现的非负整数。

设当前状态为 S S S,其进行一次合法操作后的可能状态集合为: { S 1 , S 2 , . . . S k } \lbrace S_1,S_2,...S_k\rbrace {S1,S2,...Sk}

则有: G r u n d y ( S ) = M e x ( { G r u n d y ( S 1 ) , G r u n d y ( S 2 ) , . . . , G r u n d y ( S k ) } ) Grundy(S)=Mex(\lbrace Grundy(S_1),Grundy(S_2),...,Grundy(S_k)\rbrace) Grundy(S)=Mex({Grundy(S1),Grundy(S2),...,Grundy(Sk)})

定义Mex

集合中未出现的最小非负整数。

定义运算Mex(set)

求出集合中未出现的最小非负整数。

列表观察:

Mex(set)结果
Mex( ∅ \emptyset )0
Mex({1,2,3})0
Mex({0,2,3,4})1
Mex({0,1,2,3,4,…, w w w}) w + 1 w+1 w+1

下面用几个简单的游戏来验证 G r u n d y Grundy Grundy数:

Game1

题目:

有一堆数量为 n n n的石子,两个人轮流操作,每次操作可以取走任意数量的石子(不能不取)。

取走最后一个石子的玩家获胜。

列表观察 0 ∼ 10 0\sim10 010​的Grundy Numbers:

G r u n d y ( 0 ) = M e x ( ∅ ) = 0 Grundy(0)=Mex(\empty)=0 Grundy(0)=Mex()=0

G r u n d y ( 1 ) = M e x ( { G r u n d y ( 0 ) } ) = 1 Grundy(1)=Mex(\lbrace Grundy(0)\rbrace)=1 Grundy(1)=Mex({Grundy(0)})=1

G r u n d y ( 2 ) = M e x ( { G r u n d y ( 0 ) , G r u n d y ( 1 ) } ) = 2 Grundy(2)=Mex(\lbrace Grundy(0),Grundy(1)\rbrace)=2 Grundy(2)=Mex({Grundy(0),Grundy(1)})=2

. . . ... ...

G r u n d y ( n ) = M e x ( { G r u n d y ( n − 1 ) , . . . , G r u n d y ( 0 ) } ) = n Grundy(n)=Mex(\lbrace Grundy(n-1),...,Grundy(0)\rbrace)=n Grundy(n)=Mex({Grundy(n1),...,Grundy(0)})=n

N0123456789
Grundy(N)0123456789

观察到,只有 n = 0 n=0 n=0的时候Grundy Numbers = 0 , 所以 n = 0 n=0 n=0的时候先手必败。

否则先手必胜。

这显然和我们的结论是一样的。


Game2

题目:

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

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

只需要求解出每个状态的Grundy数即可。

G r u n d y ( 0 ) = M e x ( ∅ ) = 0. Grundy(0) = Mex(\empty) = 0. Grundy(0)=Mex()=0.

G r u n d y ( 1 ) = M e x ( { G r u n d y ( 0 ) } ) = 1. Grundy(1) = Mex(\lbrace Grundy(0)\rbrace) = 1. Grundy(1)=Mex({Grundy(0)})=1.

G r u n d y ( 2 ) = M e x ( { G r u n d y ( 0 ) , G r u n d y ( 1 ) } ) = 2. Grundy(2)=Mex(\lbrace Grundy(0),Grundy(1)\rbrace)=2. Grundy(2)=Mex({Grundy(0),Grundy(1)})=2.

G r u n d y ( 3 ) = M e x ( { G r u n d y ( 2 ) , G r u n d y ( 1 ) , G r u n d y ( 0 ) } ) = 3 Grundy(3)=Mex(\lbrace Grundy(2),Grundy(1),Grundy(0)\rbrace) = 3 Grundy(3)=Mex({Grundy(2),Grundy(1),Grundy(0)})=3

G r u n d y ( 4 ) = M e x ( { G r u n d y ( 3 ) , G r u n d y ( 2 ) , G r u n d y ( 1 ) } ) = 0 Grundy(4)=Mex(\lbrace Grundy(3),Grundy(2),Grundy(1)\rbrace)=0 Grundy(4)=Mex({Grundy(3),Grundy(2),Grundy(1)})=0

. . . ... ...

G r u n d y ( 15 ) = M e x ( { G r u n d y ( 14 ) , G r u n d y ( 13 ) , G r u n d y ( 12 ) } ) = 3 Grundy(15)=Mex(\lbrace Grundy(14) ,Grundy(13),Grundy(12)\rbrace)=3 Grundy(15)=Mex({Grundy(14),Grundy(13),Grundy(12)})=3

在这个游戏中,如果把 15 15 15换成 n n n也是一样能够求解的,我们可以通过线性递推的方式求解出Grundy(n).

如果 G r u n d y ( n ) = 0 Grundy(n)=0 Grundy(n)=0​即代表这是一个必败态。

N012345678
Grundy(N)012301230

这显然符合 B a s h g a m e Bash \:game Bashgame的结论。


Game3

题目:

最初有一堆数量为 10 10 10的石子,选手甲、乙交替操作,每次操作可以将石子的数量除以2、3、6,并向下取整。

甲先手操作,最后一次操作的人获胜。请问最终谁获胜?

G r u n d y ( 0 ) = 0 Grundy(0)=0 Grundy(0)=0.

G r u n d y ( 1 ) = M e x ( { G r u n d y ( [ 1 2 ] ) , G r u n d y ( [ 1 3 ] ) , G r u n d y ( [ 1 6 ] ) } ) = M e x ( { 0 , 0 , 0 } ) = 1 Grundy(1)=Mex(\lbrace Grundy([\frac{1}{2}]),Grundy([\frac{1}{3}]),Grundy([\frac{1}{6}])\rbrace) = Mex(\lbrace0,0,0\rbrace)=1 Grundy(1)=Mex({Grundy([21]),Grundy([31]),Grundy([61])})=Mex({0,0,0})=1

G r u n d y ( 2 ) = M e x ( { G r u n d y ( [ 2 2 ] ) , G r u n d y ( [ 2 3 ] ) , G r u n d y ( [ 2 6 ) ] } ) = M e x ( { 1 , 0 , 0 } ) = 2 Grundy(2)=Mex(\lbrace Grundy([\frac{2}{2}]),Grundy([\frac{2}{3}]),Grundy([\frac{2}{6})]\rbrace) = Mex(\lbrace1,0,0\rbrace)=2 Grundy(2)=Mex({Grundy([22]),Grundy([32]),Grundy([62)]})=Mex({1,0,0})=2

G r u n d y ( 3 ) = M e x ( { G r u n d y ( [ 3 2 ] ) , G r u n d y ( [ 3 3 ] ) , G r u n d y ( [ 3 6 ) ] } ) = M e x ( { 1 , 1 , 0 } ) = 2 Grundy(3)=Mex(\lbrace Grundy([\frac{3}{2}]),Grundy([\frac{3}{3}]),Grundy([\frac{3}{6})]\rbrace) = Mex(\lbrace1,1,0\rbrace)=2 Grundy(3)=Mex({Grundy([23]),Grundy([33]),Grundy([63)]})=Mex({1,1,0})=2

G r u n d y ( 4 ) = M e x ( { G r u n d y ( [ 4 2 ] ) , G r u n d y ( [ 4 3 ] ) , G r u n d y ( [ 4 6 ) ] } ) = M e x ( { 2 , 1 , 0 } ) = 3 Grundy(4)=Mex(\lbrace Grundy([\frac{4}{2}]),Grundy([\frac{4}{3}]),Grundy([\frac{4}{6})]\rbrace) = Mex(\lbrace2,1,0\rbrace)=3 Grundy(4)=Mex({Grundy([24]),Grundy([34]),Grundy([64)]})=Mex({2,1,0})=3

. . . ... ...

G r u n d y ( 6 ) = M e x ( { G r u n d y ( [ 6 2 ] ) , G r u n d y ( [ 6 3 ] ) , G r u n d y ( [ 6 6 ) ] } ) = M e x ( { 3 , 2 , 1 } ) = 0 Grundy(6)=Mex(\lbrace Grundy([\frac{6}{2}]),Grundy([\frac{6}{3}]),Grundy([\frac{6}{6})]\rbrace) = Mex(\lbrace3,2,1\rbrace)=0 Grundy(6)=Mex({Grundy([26]),Grundy([36]),Grundy([66)]})=Mex({3,2,1})=0

G r u n d y ( n ) = 0 ( n ≥ 6 ) Grundy(n) =0(n\geq6) Grundy(n)=0(n6)

列表有:

N012345678
Grundy(N)012233000

2、Sprague-Grundy Theorem

Sprague-Grundy Theorem是什么

S − G S-G SG定理 是一个解决类似于 N i m Nim Nim的公平组合游戏的通法。

我们把单个 N i m Nim Nim堆上的游戏对局叫作一个子对局。

S − G S-G SG定理的内容是:假设有 N N N个子对局和两个棋手 A 、 B A、B AB组成的综合对局,

如果 A 、 B A、B AB都按照最优策略下棋,那么在对局开始之前就能判断输赢。

各个子对局的 G r u n d y Grundy Grundy数异或和为 0 0 0,先手必败。

各个子对局的 G r u n d y Grundy Grundy数异或和不为 0 0 0,先手必败。

应用S-G Theorem
  1. 将综合对局分解为一个个子对局。
  2. 对于每一个子对局计算其 G r u n d y Grundy Grundy数。
  3. 计算所有子对局的 G r u n d y Grundy Grundy数的异或和。
  4. 如果异或和为 0 0 0,那么先手必败,否则先手必胜。

3、Practice

Game1

题目:

初始时有三堆石子,每一堆分别有 3 、 4 3、4 34 5 5 5个石子。

甲乙交替操作,每次操作可以取一堆石子中的 1 ∼ 3 1\sim3 13个。

取走最后一个石子的玩家获胜,请问最终谁会获胜?

S − G T h e o r e m : S-G\:Theorem: SGTheorem:

  1. 这个游戏可以分解为3个子游戏,每一个子游戏分别有 3 、 4 、 5 3、4、5 345​个石子。
  2. 可以计算出每个子游戏的 G r u n d y Grundy Grundy数 : 3 、 0 、 1 3、0、1 301
  3. 计算出子游戏 G r u n d y Grundy Grundy数的异或和 : : : 2。
  4. 得出结论:先手必胜。

Game2

题目:

给一个迷宫,迷宫内有空地和障碍物(蓝色格子),棋子在右下角。

甲乙交替操作,每次操作只能将棋子向上或向左移动任意单位长度(不能不移动)。

最后移动的玩家获胜。

迷宫的初始状态如下图:

在这里插入图片描述

我们可以对每个位置,都求出其 G r u n d y N u m b e r Grundy\: Number GrundyNumber,结果如下图:

在这里插入图片描述

如果初始位置的 G r u n d y Grundy Grundy数是 0 0 0,那么根据 S − G S-G SG定理:先手必输。

如果初始位置的 G r u n d y Grundy Grundy数非 0 0 0,根据 S − G S-G SG定理:先手必胜。


Game2.1

题目:

假如给定三个迷宫,每次操作都能选择一个迷宫,并操纵里面的棋子向上或向下走任意距离。

棋子在右下角,最终无法进行操作的人输。

题中迷宫如图:

在这里插入图片描述

可以求出每个迷宫的 G r u n d y Grundy Grundy数如下图:
在这里插入图片描述

注意到初始状态下,三个子状态的 G r u n d y N u m b e r Grundy\:Number GrundyNumber 异或和为 2 ⨁ 3 ⨁ 3 = 2 2\bigoplus 3\bigoplus 3=2 233=2

所以先手必胜。


Game3

题目:

最初有一个数量为 n n n的石子堆,甲乙轮流进行操作。

每次操作可以选择场上任意一堆石子,并将这堆石子分为石子数量不相同的两堆石子(不能为 0 0 0)。

不能进行操作的人输。

我们假设 n = 8 n=8 n=8,模拟这场游戏来观察规律:

1、 n = 1 n=1 n=1,显然这一堆石子无法继续分, G r u n d y ( 1 ) = 0 Grundy(1)=0 Grundy(1)=0.

2、 n = 2 n=2 n=2,显然这堆石子无法分为数量不相同的两堆石子, G r u n d y ( 2 ) = 0 Grundy(2)=0 Grundy(2)=0.

3、 n = 3 n=3 n=3,这堆石子可以分成 ( 1 , 2 ) (1,2) (1,2) G r u n d y ( 3 ) = M e x ( { G r u n d y ( 2 ) ⨁ G r u n d y ( 1 ) } ) = 1 Grundy(3)=Mex(\lbrace Grundy(2)\bigoplus Grundy(1)\rbrace)=1 Grundy(3)=Mex({Grundy(2)Grundy(1)})=1.​

这也代表着, n = 3 n=3 n=3​的石子可以分裂出两个子游戏

这两个子游戏的胜负会影响父游戏的胜负,所以需要用到 S − G T h e o r e m : S-G\:Theorem: SGTheorem:

一个游戏若是能分解为若干子游戏,那么这个游戏的结果取决于子游戏的 G r u n d y N u m b e r Grundy\: Number GrundyNumber异或和

G r u n d y ( 3 ) = M e x ( { G r u n d y ( 2 ) ⨁ G r u n d y ( 1 ) } ) = 1 Grundy(3)=Mex(\lbrace Grundy(2)\bigoplus Grundy(1)\rbrace)=1 Grundy(3)=Mex({Grundy(2)Grundy(1)})=1

4、 n = 4 n=4 n=4,这堆石子能分成 ( 1 , 3 ) (1,3) (1,3) G r u n d y ( 4 ) = M e x ( { G r u n d y ( 1 ) ⨁ G r u n d y ( 3 ) } ) = 0 Grundy(4)=Mex(\lbrace Grundy(1)\bigoplus Grundy(3) \rbrace)=0 Grundy(4)=Mex({Grundy(1)Grundy(3)})=0

5、 n = 5 n=5 n=5,这堆石子能分成 ( 1 , 4 ) , ( 2 , 3 ) (1,4),(2,3) (1,4),(2,3)

G r u n d y ( 5 ) = M e x ( { G r u n d y ( 1 ) ⨁ G r u n d y ( 4 ) } , { G r u n d y ( 2 ) ⨁ G r u n d y ( 3 ) } ) = M e x ( { 1 , 0 } ) = 2 Grundy(5)=Mex(\lbrace Grundy(1)\bigoplus Grundy(4) \rbrace,\lbrace Grundy(2)\bigoplus Grundy(3) \rbrace)=Mex(\lbrace 1,0 \rbrace)=2 Grundy(5)=Mex({Grundy(1)Grundy(4)},{Grundy(2)Grundy(3)})=Mex({1,0})=2

. . . ... ...

以此类推下去即可。

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

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

相关文章

【Oracle直播课】5月19日Oracle 19c OCM认证大师课 (附课件预览)

Oracle 19c OCM认证大师培训 - 课程体系 - 云贝教育 (yunbee.net) 部分课件预览 OCM部分课件预览 Oracle Database 19c Certified Master Exam (OCM) 认证大师 25 天 / 150课时 什么是Oracle 19c OCM? Oracle Certified Master (OCM)是Oracle认证大师,…

如何使用 iOS系统恢复软件修复 iPhone 问题

苹果公司向世界推出了他们可以拥有的最智能的手机。但即使是 iPhone 也无法避免智能手机常见的损坏和问题。您将熟悉最常见的问题。屏幕黑屏或卡在 Apple 徽标上;冻结或卡在恢复模式的 iPhone。但这样的问题不胜枚举,每天都有 iOS 用户在他们的设备中遇到…

利用傅里叶变换公式理解camera raw中的纹理和清晰度的概念(可惜的是camera raw的计算公式应该不会是这个傅里叶变换,只能说类似于这里的效果)

知乎说:在Adobe官方的解释中,就像图片可以分解成彩色通道(如:红绿蓝通道),同样的,图片也可以分解成不同的频率,一张图片可以是由高频,中频和低频组成,例如&am…

VALSE 2024年度进展评述内容分享-视觉基础大模型的进展

2024年视觉与学习青年学者研讨会(VALSE 2024)于5月5日到7日在重庆悦来国际会议中心举行。本公众号将全方位地对会议的热点进行报道,方便广大读者跟踪和了解人工智能的前沿理论和技术。欢迎广大读者对文章进行关注、阅读和转发。文章是对报告人…

docker安装redis命令及运行

docker安装redis: docker run -d -p 6379:6379 --name redis redis:latest -d: 以 守护进程模式 运行容器,容器启动后会进入后台运行,并脱离当前命令行会话。 -p: 显示端口号。 -p 6379:6379: 将容器内部的 6379 端口映射到宿主机 6379 端…

Redis学习3——Redis应用之缓存

引言 缓存的意义 Redis作为一个NoSql数据库,被广泛的当作缓存数据库使用,所谓缓存,就是数据交换的缓冲区。使用缓存的具体原因有: 缓存数据存储于代码中,而代码运行在内存中,内存的读写性能远高于磁盘&a…

2024年第十三届工程与创新材料国际会议(ICEIM 2024)即将召开!

2024年第十三届工程与创新材料国际会议(ICEIM 2024)将于2024年9月6-8日在日本东京举行。ICEIM 2024由东京电机大学主办,会议旨在材料科学与工程、材料特性、测量方法和应用等相关领域进行学术交流与合作,在材料的微观世界里&#…

npm install 及使用cordova打包常见错误大全(附解决方案)

问题1、cb() 这是我们在install过程中最最常见问题,网络上的解决方式也都是大同小异,要么就是升级node(误人子弟),项目里的node是不可以随意升级的,它有可能会导致其他依赖又不适配,起始很多时候就是由于咱们配置的镜像…

【docker】常用的Docker编排和调度平台

常用的Docker编排和调度平台 Kubernetes (K8s): Kubernetes是目前市场上最流行和功能最全面的容器编排和调度平台。它由Google开发并开源,现由CNCF(云原生计算基金会)维护。Kubernetes设计用于自动化容器部署、扩展和管理,支持跨…

v-for中的key是什么作用

在使用v-for进行列表渲染时,我们通常会给元素或者组件绑定一个key属性。 这个key属性有什么作用呢?我们先来看一下官方的解释: key属性主要用在Vue的虚拟DOM算法,在新Inodes对比时辨识VNodes; 如果不使用key,Vue会使用…

计算机系列之信息安全技术

15、信息安全技术 1、信息安全和信息系统安全 信息安全系统的体系架构 X轴是“安全机制”,为提供某些安全服务,利用各种安全技 术和技巧,所形成的一个较为完善的机构体系。 Y轴是“OSI网络参考模型”。 Z轴是“安全服务”。就是从网络中的各…

Spring框架学习笔记(一):Spring基本介绍(包含容器底层结构)

1 官方资料 1.1 官网 https://spring.io/ 1.2 进入 Spring5 下拉 projects, 进入 Spring Framework 进入 Spring5 的 github 1.3 在maven项目中导入依赖 <dependencies><!--加入spring开发的基本包--><dependency><groupId>org.springframework<…

【软考】模拟考卷错题本2024-05-05

1 算法 关键词&#xff1a;按照单位重量价值大优先&#xff0c;那就是1、2、3即430&#xff1b;之后的根据排除法又可以得到630&#xff1b;故C。 2 UML 序列图 上图已经基本上有解析&#xff1b;重点在于在四个选项中选正确的。根据概念排除&#xff1a;异步和同步是不一样的&…

Tomact安装配置及使用(超详细)

文章目录 web相关知识概述web简介(了解)软件架构模式(掌握)BS&#xff1a;browser server 浏览器服务器CS&#xff1a;client server 客户端服务器 B/S和C/S通信模式特点(重要)web资源(理解)资源分类 URL请求路径(理解)作用介绍格式浏览器通过url访问服务器的过程 服务器(掌握)…

Typecho文章采集器火车头插件

目前市面上基本没有typecho火车头采集器 而分享的这一款采集器 内置使用方法与教程&#xff01;

基于大语言模型多智体的综述:进步和挑战!

源自&#xff1a; 人工智能前沿讲习 “人工智能技术与咨询” 发布 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨&#xff0c;并不意味着支持其观点或证实其内容的真实性。版权归原作者所有&#xff0c;如转载稿涉及版权等问题&#xff0c;请立即…

Python高级编程-DJango2

Python高级编程-DJango2 没有清醒的头脑&#xff0c;再快的脚步也会走歪&#xff1b;没有谨慎的步伐&#xff0c;再平的道路也会跌倒。 目录 Python高级编程-DJango2 1.显示基本网页 2.输入框的形式&#xff1a; 1&#xff09;文本输入框 2&#xff09;单选框 3&#xff…

【docker 】 IDEA 安装 Docker 工具

打开File->Settings->Plugins 配置 Docker 的远程访问连接 Engine APIURL &#xff1a;tcp://192.168.0.1:2375 &#xff08;换成自己的docker开放端口&#xff09; 使用diea的docker插件 查看已有的镜像 创建一个容器 下面是最近更新的文章&#xff1a; 【docker 】 …

Spring与Mybatis-增删改查(注解方式与配置文件方式)

Spring框架下Mybaits的使用 准备数据库配置application.propertiespom.xml添加lombok依赖创建Emp实体类准备Mapper接口&#xff1a;EmpMapper预编译SQL根据id查询数据Mapper接口方法配置application.properties开启自动结果映射单元测试 条件模糊查询Mapper接口方法单元测试 根…

下一代自动化,国外厂商如何通过生成性AI重塑RPA?

企业自动化的未来趋势是什么&#xff1f;科技巨头们普遍认为&#xff0c;由生成性AI驱动的AI Agent将成为下一个重大发展方向。尽管“AI Agent”这一术语尚无统一定义&#xff0c;但它通常指的是那些能够根据指令通过模拟人类互动&#xff0c;在软件和网络平台上执行复杂任务的…