前言
听到博弈问题,第一个想到的想必是用SG函数做的博弈题,就比如Nim游戏
Nim游戏: 有N堆石子,每次选一堆石子,拿走若干石子(不能不取),先不能取的人输
定义个SG函数
对于SG函数,大致就记录两个东西吧
定义SG函数g(x)=mex{ g(y) | y是x的后继 }
游戏的和的SG函数值是它的所有子游戏的SG函数值的异或
SG函数能解决很多问题,但是它并不是万能的。他只适用于两个玩家家能进行的操作完全相同的情况(平等博弈)
今天上午做清华集训2017day3T2,一开始以为是SG就可以做,后来因为T1、T3比较好打,所以就没打T2,下午讲题的时候听讲题的时候才知道这是不平等博弈题,所以不能使用SG函数
那么怎么做呢,听高三同学讲完了一遍,我仿佛还是在云里雾里,于是去找了2009的集训队论文方展鹏《浅谈如何解决不平等博弈问题》 感觉这篇论文还是讲的挺好的,但是呢,为了让我更好的记忆,我就开始写这一系列的学习记录了
正文
不平等博弈问题(Partizan Games)有一个很好的解决方法是用 超实数(Surreal Number,高届的同学戏称其为super real number),具体的用处会在后面写到
话不多说,对于不平等博弈问题,先定义状态
一个及以下后继状态(从有理数上定义)
首先考虑每个状态都只有一个及以下的后继状态的情况
- 如果没有人能操作,那么状态为0
- 如果当前状态只有第一个玩家能进行操作,那么状态为 x x x( x x x为第一个玩家连续能走的步数-[后继状态中第二个玩家是否能走])
- 如果当前状态只有第二个玩家能进行操作,那么状态为 − x -x −x( x x x为第二个玩家连续能走的步数-[后继状态中第一个玩家是否能走])
我们发现,这种定义的状态对单局而言非常无脑
我们发现当状态为
0
0
0时,一定是先手必败态
当状态不等于
0
0
0时,我们不能直接的根据状态值判断谁必胜(证明略)
多个后继状态(引入超实数辅助定义)
如果状态的后继不止一个怎么办?
这是大部分题目里的情况,也是文章的重点
我们用超实数来概括所有的情况
定义超实数
{
X
∣
Y
}
\{X|Y\}
{X∣Y}(本质上它是超实数,但是好理解一点可以将其当成运算),
X
X
X是第一个玩家能执行操作的后继状态的集合,
Y
Y
Y是第二个玩家能执行操作的后继状态的集合(可以是空集,这个之后会讨论),结果为当前的状态
若
X
,
Y
X,Y
X,Y都是有限集,那么
{
L
∣
R
}
=
{
m
a
x
(
L
)
∣
m
i
n
(
R
)
}
\{L|R\}=\{max(L)|min(R)\}
{L∣R}={max(L)∣min(R)}
对于一个状态
l
∣
r
{l|r}
l∣r,如果
l
<
r
l<r
l<r那么
{
l
∣
r
}
\{l|r\}
{l∣r}的结果:
若
l
、
r
l、r
l、r之间有整数,
{
l
∣
r
}
=
x
\{l|r\}=x
{l∣r}=x(
l
<
x
<
r
l < x < r
l<x<r且
x
x
x是所有满足的数中离
0
0
0最近的整数)
若
l
、
r
l、r
l、r之间无整数,
{
l
∣
r
}
=
x
/
y
\{l|r\}=x/y
{l∣r}=x/y(
l
<
x
/
y
<
r
l < x/y < r
l<x/y<r且
y
=
2
k
(
k
∈
Z
∗
)
y=2^k(k\in\Z^*)
y=2k(k∈Z∗)且y是所有满足条件的数中最小的数,x是在满足前面的条件下的可取值中离
0
0
0最近的整数
前面说到在
{
L
∣
R
}
\{L|R\}
{L∣R}的运算中,
L
L
L或
R
R
R会有为空集的情况
空集可以用
Φ
\Phi
Φ表示,不过一般也用"不写任何东西"来表示,比如说
{
∣
}
=
0
\{|\}=0
{∣}=0
事实上,空集可以当做无穷(如果是左边是空集,那么可以视为是无穷小,如果右边是空集,那么可以视为是无穷大)
总结
这里的内容已经是真·简化版了
根据定义,
L
∣
R
{L|R}
L∣R才是超实数,而定义这个结果,建立了博弈的实数定义与超实数的部分联系
下图为达利函数(即一个实数与超实数的对应关系)
这个东西本身就是超实数,为什么这样你可以去论文里看超实数的定义
当然如果懒的看论文,那记住这些就好了,到后面的灵活运用才是最重要的
在下一篇文章中我会讲述
{
l
∣
r
}
\{l|r\}
{l∣r}中的特殊情况的结果,记录(一)到这里就结束了
update by 2019.1.9:对文章进行了结构调整(开头一段我进行了保留,算是对我一开始写这篇博客时的感受的纪念吧)