[待更新]浅谈博弈论

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z591826160/article/details/83477166

博弈论

博弈论适用

一般为博弈论的题目有以下标志

  1. 两个选手交替进行游戏
  2. 每个选手当前可进行的操作只与局面有关
  3. 游戏有至少一个终止情况

如果不满足上述条件而题目很像博弈的话,可以往dp(状压)或者其他东西上考虑
例如:
Gems Fight! [HDU - 4778]

思路

博弈论类题目就目前做过的题来看,一般有两种情况,要么考虑必胜局面推公式或者刷SG表找规律,要么直接码出SG函数

考虑必胜局面的做法一般先推出能一眼看出的必胜局面(最好其他局面都可以向下转化为类似这个必胜局面),然后推出其他局面和这些必胜局面的关系。有些时候需要大胆一点猜结论

码SG函数的题目一般数据范围很小,因为刷SG表复杂度是记忆化dfs的复杂度,从数据范围上也能看出一点出题人的小心思

SG函数

考虑一个博弈游戏的所有局面,将其分为两种,先手必胜和先手必败。
每一个局面经过一次合法操作所能到达的局面连一条单向边,就可构成一个类似解空间的有向树

现给出SG函数的定义
S G ( x ) = m i n { y y K ( x ) , y N } , K ( x ) = { S G ( y ) x > y } SG(x) = min\{y|y \notin K(x),y \in N\},K(x) = \{ SG(y)|x->y \}
(看起来很繁琐,其实SG(x)就是与x相连点的SG值中没有出现的最小自然数)

乍一看这个函数的定义很突兀,怎么就和最小自然数联系上了?

现在假设只看 S G ( x ) = 0 SG(x)=0 以及 S G ( x ) > 0 SG(x) > 0 两类
博弈终止局面的 S G SG 值为0,代表先手必败。

现有比较浅显的定理

  • 如果一个点A所连的点有一个是先手必败的点,那么点A就是先手必胜
  • 如果一个点A所连的点都是先手必胜的点,那么点A就是先手必败点

现在再来考虑刚才简化的 S G SG 函数
一个点A所连点存在一个 S G ( x ) = 0 SG(x)=0 的点,那么这个点就是先手必胜( S G ( A ) > 0 SG(A)>0 ),如果一个点A所连点都是 S G ( x ) > 0 SG(x)>0 ,那么这个点就是先手必败( S G ( A ) = 0 SG(A)=0 )

大多数的题目这类简化版的 S G SG 函数就够用了

而取最小未出现自然数在取石子一类题目中比较常见,类似Nim游戏或者其变种。(如果没有了解过Nim游戏的可以去了解一下,这个结论的推导也是根据 S G SG 函数来的)

利用完整版的 S G SG 函数,可以将n堆石子的类Nim游戏分成n个1堆石子的子游戏,然后将n个子游戏的 S G SG 值异或起来就是整个游戏的 S G SG

推公式

推公式方面就是要多大胆假设,把问题往简单的数学模型上靠。
一般检测一个公式是不是正确的可以用一下3步

  1. 游戏的终态是不是先手必败态
  2. 先手必胜的局面能否移动到一个先手必败的局面
  3. 先手必败的局面无法移动到一个先手必败的局面

其实就是推出的式子满足最基本的胜负转换

(就先写这么多吧,也是做了一些题想总结一下,之后有时间的话再带着具体的例子来仔细讲讲)

猜你喜欢

转载自blog.csdn.net/z591826160/article/details/83477166