不平等博弈问题学习记录(一)
2017-12-30 20:32
246 查看
听到博弈问题,第一个想到的想必是用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-y(x为第一个玩家能再走的步数,y为第二个玩家能再走的步数)(为什么能这么定义呢,我也不会证)
上面定义较为简单,那么,如果某个玩家的后继不止一个怎么办,这个时候就要用一个运算来概括所有的情况了
类似与SG函数,定义一个运算{X|Y},X是第一个玩家能执行操作的后继状态的集合,Y是第二个玩家能执行操作的后继状态的集合(可以是空集,这个之后会讨论),结果为当前的状态
若X,Y都是有限集,那么{L|R}={max(L)|min(R)}
对于一个状态{l|r},如果l < r那么{l,r}的结果:
若l、r之间有整数,{l|r}=x(l < x < r且x是所有满足的数中离0最近的整数)
若l、r之间无整数,{l|r}=x/y(l < x/y < r且y=2^k(k是正整数)且y是所有满足条件的数中最小的数,x是在满足前面的条件下的可取值中离0最近的整数)
这有点麻烦,先不用想为什么这么定义,灵活运用才是最重要的
在下一篇文章中我会讲述{l|r}中的特殊情况的运算结果,记录(一)到这里就结束了
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-y(x为第一个玩家能再走的步数,y为第二个玩家能再走的步数)(为什么能这么定义呢,我也不会证)
上面定义较为简单,那么,如果某个玩家的后继不止一个怎么办,这个时候就要用一个运算来概括所有的情况了
类似与SG函数,定义一个运算{X|Y},X是第一个玩家能执行操作的后继状态的集合,Y是第二个玩家能执行操作的后继状态的集合(可以是空集,这个之后会讨论),结果为当前的状态
若X,Y都是有限集,那么{L|R}={max(L)|min(R)}
对于一个状态{l|r},如果l < r那么{l,r}的结果:
若l、r之间有整数,{l|r}=x(l < x < r且x是所有满足的数中离0最近的整数)
若l、r之间无整数,{l|r}=x/y(l < x/y < r且y=2^k(k是正整数)且y是所有满足条件的数中最小的数,x是在满足前面的条件下的可取值中离0最近的整数)
这有点麻烦,先不用想为什么这么定义,灵活运用才是最重要的
在下一篇文章中我会讲述{l|r}中的特殊情况的运算结果,记录(一)到这里就结束了
相关文章推荐
- 不平等博弈问题学习记录(二)
- 不平等博弈问题学习记录(三)
- 【蓝桥杯学习记录】【8】博弈问题
- 【记录】正则表达式学习第3天(正则学习笔记),又解决了个实际问题。
- django学习记录,动态url,另外发现django的时区问题
- 20100722 学习记录:还是textarea换行问题..... = =+
- 水晶报表学习记录之二(数据库登陆问题)
- ORACLE学习问题记录(不断更新)
- 从今天起,我要记录学习过程中遇到的所有问题
- OpenGL学习问题记录
- Android学习过程中问题记录
- 今天遇到多线程,windowsService的问题---学习记录
- 学习使用solr时遇到的一些问题,记录
- [项目过程中所遇到的各种问题记录]学习篇——对工作以来的学习过的开源项目进行总结—动软代码生成工具
- 今天开始陆续记录学习和工作碰到的问题及解决办法
- python django学习-问题记录及解决方法
- 新手学习之Exchange2007,问题记录
- 大二编写了8皇后问题,大三重新写N皇后问题 ,(特此记录一下学习历程)
- [学习记录] VNC注销问题
- DNN 5.0 学习问题记录集锦