博弈论总结(只会打表,永不证明)(博弈论)

概述

博弈论的研究对象是一类游戏,有特定的模型。

基础模型——先手必胜还是后手必胜?

好像有个专门的名词叫做Impartial Combinatorial Games(简称ICG)

大概的定义如下:

整个游戏可以抽象成一个DAG;

每个点都代表游戏过程中的某个决策状态(特殊的,出度为0的点是游戏的终止状态);

每条边都表示可以从某个状态,经过直接的一次操作,转移到另一个状态。

有两个玩家,从指定的某个状态开始,依次执行操作,谁先因为当前到达了终止状态而无法操作的人输。

因为是DAG,所以一定会转移到终止状态的。

问题就是,从某状态开始,先手必胜还是后手必胜?


举个栗子——Nim游戏的一个变种

有一堆n个石子,每次可以取1k个,当前无法操作的人输,问是否先手存在必胜策略?

对于这种问题,对于以每个状态为起点的情况,我们都会唯一确定是先手必胜还是后手必胜。

这应该是很好想,几乎不用证明的。

可以对每个点标记两种状态N和P,分别表示先手必胜和后手必胜

首先根据定义,终状态为P

然后,所有能直接到达终状态的状态就为N了

进一步推广,如果某点的出边指向的点的集合中,有至少一个点为P,那么这个点为N;否则就为P。

比如对于上面提到的栗子

对每个状态都标号为当前剩余石子数

那么0是P,1k就都是N,k+1是P。。。。。。

接着就可以推出当且仅当(k+1)a时a是P。

对于这种基础的问题,枚举状态建好图后DP或者记忆化搜索就可以快速解决了。

模型升级——SG函数与SG定理

博弈论所涉及到的更多的游戏,会把若干ICG拼凑在一起,成为一个规模更大的模型。

比如说上面那个Nim游戏变种的升级版——

n堆石子,每堆ai个,每次可以取1k个,当前无法操作的人输,问是否先手存在必胜策略?

这时候,如果仍沿用上面的方法求解,我们会发现状态维度很大,时间和空间根本承受不了。

这里介绍SG函数与SG定理,详细证明就算了,我太弱了。

strangedbly巨佬的博客给出了十分易懂的证明,个人力荐。

定义运算mex(S)(S是一个自然数集合),结果为S中未出现的最小自然数。

定义SG(i)(i是一个状态,在图中是一个点)为对所有i可直达状态(在图中与i通过有向边连接的所有点)的SG函数值取mex的值,即。

SG(i)=mex(jSG(j),(i,j)G)

定义SG定理:点i为P当且仅当SG(i)=0

若干ICG(可以不相同)组合在一起的游戏,把每个游戏的SG值异或起来,不为0则先手必胜。


接着对例子分析一下。

可以发现,对于单堆石子来说,剩零个时SG值为0,剩一个时为1。。。剩k个为k,剩k+1个时因为不能转移到零个,SG值又变成了0。。。。。。

这可以说明SG函数对于判断状态为N还是P是非常有效的。

那么对于若干堆石子(即整个升级版游戏)来说,胜负又会如何呢?只要把这若干个SG值都异或起来就完全OK啦。

实现

简单的ICG可直接通过递推、DP等方法推导出所有点的状态。当然,如果找到规律,可以直接O(1)判断都说不好。

多个ICG的组合游戏,则一定是离不开SG函数的。

但假如点非常多,或者每个点的后继确定起来非常麻烦的时候,DP是不能解决问题的。

那怎么办?那肯定是有规律啊!一眼看不出规律怎么办?可别忘了打表啊!

当然,打表也是有技巧的。至于如何如何,蒟蒻也说不出什么门道来,还是多刷题为上上策。

题目

posted @   Flash_Hu  阅读(4014)  评论(6编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示
哥伦布
-1°
10:09发布
哥伦布
10:09发布
-1°
西南风
2级
空气质量
相对湿度
87%
今天
小雨
-1°/13°
周六
多云
-3°/10°
周日
-4°/2°