Game Theory In Competitive Programming|Part2(原创)

news2024/9/23 23:31:28

在上一个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.coloradmin.cn/o/1645164.html

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

相关文章

期权如何开户的流程是什么样的?

今天期权懂带你了解期权如何开户的流程是什么样的?期权账户开户是指投资者向期权经纪商或金融机构提交申请,以便可以在期权市场上进行交易并持有期权合约的账户开设过程。 期权如何开户的流程是什么样的? 1. 投资者参与营业部提供的股票期权…

【2022 深圳 ArchSummit 】大数据架构稳定性保障实践

文章目录 一、前言二、现状三、大数据架构的历史变迁(一)洪荒期&MR(二)远古期&MPP(四)近现代&Flink/Spark(五)现如今&实时数据湖架构 四、架构稳定的关键因素&#…

经典的设计模式和Python示例(一)

目录 一、工厂模式(Factory Pattern) 二、单例模式(Singleton Pattern) 三、观察者模式(Observer Pattern) 一、工厂模式(Factory Pattern) 工厂模式(Factory Pattern…

我独自升级崛起下载教程 我独自升级崛起一键下载

动作RPG游戏基于广大喜爱的动画和在线漫画《我独自升级崛起》在5月8日,这款新的游戏首次在全球亮相,意在给那些对游戏情有独钟的玩家带来更加丰富和多种多样的游戏体验。这个网络武侠题材的游戏设计非常具有创意,其主要故事围绕着“独孤求败”…

使用CUDA的PyTorch进行张量重整化的gpu加速

使用CUDA的PyTorch进行张量重整化的gpu加速 摘要IntroductionAlgorithm and TorchTrg discussionModels and Results GPU-Acceleration of Tensor Renormalization with PyTorch using CUDA 摘要 作者展示了基于张量重整化群(TRG)方法的数值计算可以通过…

鸿蒙OpenHarmony南向:【Hi3861开发板介绍】

Hi3861开发板介绍 简介 Hi3861开发板是一片大约2cm*5cm大小的开发板,是一款高度集成的2.4GHz WLAN SoC芯片,集成IEEE 802.11b/g/n基带和RF(Radio Frequency)电路。支持,并配套提供开放、易用的开发和调试运行环境。 …

Mysql8本地安装

官网: https://www.mysql.com/ yum安装下载:https://dev.mysql.com/downloads/repo/yum/ 二进制安装下载:https://downloads.mysql.com/archives/community/ 安装包下载 yum安装下载 打开网址(https://dev.mysql.com/downloads/r…

GEE错误——image.reduceRegion is not a function

简介 image.reduceRegion is not a function 这里的主要问题是我们进行地统计分析的时候,我们的作用对象必须是单景影像,而不是影像集合 错误"image.reduceRegion is not a function" 表示你正在尝试使用reduceRegion()函数来处理图像数据&…

VastGaussian:用于大型场景重建的巨大3D高斯函数

VastGaussian:用于大型场景重建的巨大3D高斯函数 摘要IntroductionRelated WorkPreliminariesMethod VastGaussian: Vast 3D Gaussians for Large Scene Reconstruction. 摘要 现有基于NeRF的大型场景重建方法在视觉效果和渲染速度方面往往存在限制。虽然最近的3D高斯分裂在小…

宝兰德通过广东教育行业信创适配认证,拓展教育信创生态圈

近日,由宝兰德自主研发的多款中间件产品通过广东省教育行业信创适配中心的适配测试。测试表明,宝兰德四款中间件产品(分布式缓存软件V3.0、应用服务器软件V9.5、消息中间件软件 V2.1、Web服务器软件V3.1) 与当前主流国产操作系统统…

SpringBoot集成阿里云短信验证码服务

一:前言 最近在项目开发过程中,需要去写一个发送手机短信验证码的功能。在网上查了一下,有很多服务器可供选择,本文的话是基于阿里云服务的短信验证码功能实现。 关于注册和开通服务这些需要操作的,请各位小伙伴参考官…

Flutter开发Dart中的队列(Queue)

文章目录 Dart中的队列(Queue)基本操作示例队列的类型队列的应用总结 Dart中的队列(Queue) 队列是一种抽象的数据结构,遵循“先进先出”(FIFO)的原则。这意味着最早添加的元素将首先被移除。队…

品高虚拟化后端存储的发展演进

在品高虚拟化技术不断发展的过程中,虚拟化的后端存储一直是关注的焦点之一。 本文将从最初的文件存储和NFS开始,追溯到集中式存储SAN,然后选择了Ceph的RBD方式,并最终抵达选择支持vhost协议的后端存储的现状,我们将探…

银价下跌怎么办?现货白银买卖分析方法要掌握

现货白银买卖分析是进行现货白银投资的基础,尤其是近几个交易日现货白银价格出现了下跌后,更加凸显了买卖分析能力在市场中的重要性。不光要会买,还得懂得如何卖。下面我们来介绍2个现货白银买卖分析的方法。 基于RSI指标的现货白银买卖分析。…

python+barcode快速生成条形码(电商测试小工具)

背景 需要测试自助收银机,每次都要在线生成条码,而且生成次数还有限制 需求 满足自定义条形码,可以生成条形码图片 方案 python 3.8以上 barcode 1.0.4 python-barcode 0.15.1 代码 用于生成Code128条形码…

WINDOWS配置IIS

1.安装IIS 1.1.打开启用Windows功能 打开“控制面板” > “程序和功能” > “启用或关闭 Windows 功能”。 1.2.启用IIS功能 打开“控制面板” > “程序和功能” > “启用或关闭 Windows 功能”。 勾选“Internet Information Services”,然后点击“确定…

学习中遇到的问题

1.UFUNCTION() 不是所有函数都能加UFUNCTION()修饰,涉及UE反射机制。 2.初始化用{} 初始化列表 3.创建C文件时修改了路径 这时.cpp文件会报错,只需删掉前面多余路径即可 4.函数的移除 1.虚幻5.1 UUserWidget不再包含OnLevelRemovedFromWorld() 转而使用…

ai续写软件哪个好?盘点3款经典好用的!

随着科技的不断发展,AI续写软件逐渐成为了许多内容创作者、学生、研究人员等的得力助手。这类软件能够通过机器学习和自然语言处理技术,为用户提供高质量的文本续写服务。但市场上众多的AI续写软件让人眼花缭乱,那么,究竟哪款AI续…

Nftables漏洞原理分析(CVE-2022-32250)

前言 在nftales中存在着集合(sets),用于存储唯一值的集合。sets 提供了高效地检查一个元素是否存在于集合中的机制,它可以用于各种网络过滤和转发规则。 而CVE-2022-32250漏洞则是由于nftables在处理set时存在uaf的漏洞。 环境搭建 ubuntu20 QEMU-4…

透明加密软件选哪个好?选择时一定要注意以下三点

透明加密软件哪个好? 这是许多企事业单位在面临数据防泄漏问题时经常思考的问题。随着信息技术的发展,企业的数据安全变得越来越重要。透明加密技术作为一种有效的数据保护手段,被越来越多的企业所采用。然而,市场上的透明加密软…