博弈论总结(只会打表,永不证明)(博弈论)
概述
博弈论的研究对象是一类游戏,有特定的模型。
基础模型——先手必胜还是后手必胜?
好像有个专门的名词叫做Impartial Combinatorial Games(简称ICG)
大概的定义如下:
整个游戏可以抽象成一个DAG;
每个点都代表游戏过程中的某个决策状态(特殊的,出度为0的点是游戏的终止状态);
每条边都表示可以从某个状态,经过直接的一次操作,转移到另一个状态。
有两个玩家,从指定的某个状态开始,依次执行操作,谁先因为当前到达了终止状态而无法操作的人输。
因为是DAG,所以一定会转移到终止状态的。
问题就是,从某状态开始,先手必胜还是后手必胜?
举个栗子——Nim游戏的一个变种
有一堆个石子,每次可以取个,当前无法操作的人输,问是否先手存在必胜策略?
对于这种问题,对于以每个状态为起点的情况,我们都会唯一确定是先手必胜还是后手必胜。
这应该是很好想,几乎不用证明的。
可以对每个点标记两种状态N和P,分别表示先手必胜和后手必胜
首先根据定义,终状态为P
然后,所有能直接到达终状态的状态就为N了
进一步推广,如果某点的出边指向的点的集合中,有至少一个点为P,那么这个点为N;否则就为P。
比如对于上面提到的栗子
对每个状态都标号为当前剩余石子数
那么是P,就都是N,是P。。。。。。
接着就可以推出当且仅当时a是P。
对于这种基础的问题,枚举状态建好图后DP或者记忆化搜索就可以快速解决了。
模型升级——SG函数与SG定理
博弈论所涉及到的更多的游戏,会把若干ICG拼凑在一起,成为一个规模更大的模型。
比如说上面那个Nim游戏变种的升级版——
有堆石子,每堆个,每次可以取个,当前无法操作的人输,问是否先手存在必胜策略?
这时候,如果仍沿用上面的方法求解,我们会发现状态维度很大,时间和空间根本承受不了。
这里介绍SG函数与SG定理,详细证明就算了,我太弱了。
strangedbly巨佬的博客给出了十分易懂的证明,个人力荐。
定义运算(S是一个自然数集合),结果为S中未出现的最小自然数。
定义(i是一个状态,在图中是一个点)为对所有可直达状态(在图中与i通过有向边连接的所有点)的SG函数值取mex的值,即。
定义SG定理:点为P当且仅当
若干ICG(可以不相同)组合在一起的游戏,把每个游戏的SG值异或起来,不为0则先手必胜。
接着对例子分析一下。
可以发现,对于单堆石子来说,剩零个时值为,剩一个时为。。。剩个为,剩个时因为不能转移到零个,值又变成了。。。。。。
这可以说明SG函数对于判断状态为N还是P是非常有效的。
那么对于若干堆石子(即整个升级版游戏)来说,胜负又会如何呢?只要把这若干个值都异或起来就完全OK啦。
实现
简单的ICG可直接通过递推、DP等方法推导出所有点的状态。当然,如果找到规律,可以直接判断都说不好。
多个ICG的组合游戏,则一定是离不开SG函数的。
但假如点非常多,或者每个点的后继确定起来非常麻烦的时候,DP是不能解决问题的。
那怎么办?那肯定是有规律啊!一眼看不出规律怎么办?可别忘了打表啊!
当然,打表也是有技巧的。至于如何如何,蒟蒻也说不出什么门道来,还是多刷题为上上策。
题目
- 【Done】洛谷P2197 nim游戏
- 【Sol.】洛谷P2148 [SDOI2009]E&D
- 【Todo】洛谷P2575 高手过招
- 【Todo】洛谷P2594 [ZJOI2009]染色游戏
- 【Todo】洛谷P3185 [HNOI2007]分裂游戏
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析