说蒙特卡罗规划方法的思想挺简洁的,但我在理解它的实现过程时我还是费了些功夫。这里主要以简单的四子棋为例描述一下蒙特卡罗方法是如何解决人机博弈这一类问题的。

UCT算法是蒙特卡罗规划方法的改进,是将UCB1算法(信心上限算法)思想用于蒙特卡罗规划的特定算法,它比单纯的蒙特卡罗规划更容易获得最优解。首先贴一段伪代码:

这段伪代码来自于一本我也不知道名字的书的第八章——蒙特卡罗博弈方法。首先说明这段伪代码是完全正确的,虽然在我当初理解它的时候几次三番对它的正确性产生过怀疑。接下来大概解释一下这个算法。

它的基本结构和单纯的蒙特卡罗规划是完全相同的,只不过在评价一个节点的优劣时标准并不是胜率而是所谓UCB1算法给出的信心上限的估计值(即函数BestChild中的那个算式),无论是在扩展节点还是在最终选择时都以这一标准来评价节点的优劣。

解释一下伪代码中出现的符号:s表示状态(state),在四子棋问题中对应某一时刻的棋局信息即双方的棋子是如何排布的,s(v)为状态函数即节点v所对应的状态,s0为初始状态即某一轮到我方落子的状态;v表示节点与状态s一一对应;Δ(delta)表示单次的收益或者说报酬,表征从当前状态按某一策略进行到棋局结束时的胜负情况,而Q(v)表示节点v的综合受益,是经过多次模拟后得到的收益,即很多个不同的Δ的和;N(v)表示节点v被访问的次数,与Q(v)被用于计算胜率及信心上限的估计值;A(s)表示状态s的行动集,即状态s下所有合法的落子方式或者说落子位置的集合,a(v)则表示某一行动方式。

再解释一下估计信心上限值的算式:c为比例系数(coefficient),控制后一项在整体估计中的重要程度;前一项收益Q比上访问次数N即表示胜率;后一项用于保证,在博弈树规模尚小时,某一节点v不会因为在当前经过模拟累积的收益值较小而不被选择,事实上,适当地选择单次收益Δ的计算方式以及系数c的值,可以使得在博弈树规模尚小时被访问次数越少的节点信心上限值越大,越容易被选择(可以简单手动模拟一下这种情况加深理解),随着节点深度的加深,这一项的影响会越来与小,最终的信心上限值将主要依赖于前一项,胜率。

这段伪代码还是比较清晰和详细的,尽管这样最初的时候我还是有不少地方理解错了,所以还是要简单说明一下:

1.搜索树策略(Tree Policy):所谓终止节点即为棋局结束所对应的状态节点,也就是胜负已分的情况;可扩展节点指的并不完全是胜负未分的节点,而是针对当前已经构建的这棵博弈树而言的,首先它不是终止节点,其次它有未被访问过的子状态或者说未被扩展的子节点,这两者还是比较好理解的。这个函数最初我理解错的原因是,我产生了v被赋值为自身的最优子节点后函数就返回了的错觉,而显然事实上函数的目的是按照信心上限的估计策略由根节点逐层向下选择当前最为紧迫需要被扩展的节点。尽管这是一个小错误,但它的确困扰了我很久,所以还是要提醒一下。

2.默认策略(或称模拟策略)(Default Policy):这一过程就是随机模拟,相当于在博弈树上当前节点向下随意选择一条路径走到头,看看是谁获胜。被模拟的节点或者是终止节点,或者是新扩展的节点。

3.回溯(Backup):从新扩展的节点或者终止节点,逐层向上更新收益和访问次数至根节点。由于奇偶性不同的层分别对应两方持有棋权的状态,所以单次收益Δ向紧邻的上层传递的时候要取负。(为避免在实际实现时产生混乱,可以用收益的正负值分别固定代表两方地胜负情况,然后在Δ向上传递的过程中始终不变号,而在计算信心上限估计值的时候进行判断,获得等价的效果。)

UCT(信心上限树算法)解四子棋问题——蒙特卡罗法模拟人机博弈相关推荐

  1. 四子棋游戏--bingo game

    最近自己编了一个四子棋的游戏.说明如下: 游戏简介: 一种常见的四子棋游戏,可以是人机对战,两人对战,或者网上对战. 游戏的双方轮流落子,每人持有21颗子.棋子共有6*7个位置,玩家的棋子总是落到 当 ...

  2. 人机对战初体验:Python基于Pygame实现四子棋游戏

    人机对战初体验-四子棋游戏 继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩 ...

  3. java四子棋实验报告_Python 实现劳拉游戏的实例代码(四连环、重力四子棋)

    游戏规则:双方轮流选择棋盘的列号放进自己的棋子, 若棋盘上有四颗相同型号的棋子在一行.一列或一条斜线上连接起来, 则使用该型号棋子的玩家就赢了! 程序实现游戏,并将每局的数据保存到本地的文件中 首先我 ...

  4. python人机对战的实验步骤_人机对战初体验:Python实现四子棋游戏

    继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩,展现出的围棋技艺已经到了人 ...

  5. 四子棋 freepython

    四子棋,是黑白棋的一种.是一种益智的棋类游戏.黑白两方(也有其它颜色的棋子)在8*8的格子内依次落子.黑方为先手,白方为后手.落子规则为,每一列必须从最底下的一格开始.依此可向上一格落子.一方落子后另 ...

  6. 深圳大学计系汇编语言实验--四子棋游戏

    题面 四子棋是个双人游戏,两人轮流下棋,棋盘由行和列组成的网格,每个选手每次下一个子直到两人中有一人的棋子连成一条水平线.垂直线或者是对角线. 本实验需要在LC-3中实现简易版四子棋的游戏,两位选手通 ...

  7. 基于LC3模拟器的简单游戏设计:简易四子棋

    一.实验目的 分析和理解指定的需解决问题. 利用LC-3的汇编代码设计实现相关程序. 通过LC-3仿真器调试和运行相关程序并得到正确的结果. 二.实验内容 四子棋是一款普遍流行的简易型桌面游戏,据说, ...

  8. vb四环棋的实现,平面四子棋,四连环游戏

    vb四环棋的实现,平面四子棋 首先我们百度一下,什么是平面四子棋 相信很多小伙伴见到这幅图片都不陌生. 那么在代码中怎么实现呢?我们用vb代码为例子. 先看效果图 我们设计o和x是需要下的棋子,如果没 ...

  9. 深圳大学 计系1实验四—四子棋实验

    实验要求 本实验需要在LC-3中实现简易版四子棋的游戏,两位选手通过键盘和输出窗口轮流交互操作,棋盘由6 X 6的网格组成. 游戏规则如下: 两位选手依次轮流落子: 选手不能悔棋: 有子的地方不能继续 ...

  10. 全国大学生软件创新大赛一等奖作品 —— HyllCube 三维四子棋

    2011 年 9 月,那时刚升大三.和另外三位童鞋组队参加了第四届英特尔杯全国大学生软件创新大赛.最终,在北京的总决赛中,成功获得一等奖~ 时间过得真快,没想到,到现在已经有 8 年了~ 整个比赛过程 ...

最新文章

  1. Linux-LNMP(静态元素不记录日志和过期时间,防盗链,解析php,代理,支持ssl)
  2. 常用的css3的新属性
  3. 一月17日新生冬季练习赛解题报告B.函数问题
  4. 2019计算机科学与技术全日制调济,华侨大学2019计算机科学与技术学院非全日制考研调剂信息(第二批)...
  5. python 命令-python执行cmd命令
  6. mysql 表查询注意
  7. Linux:程序员必备的21条Linux 命令
  8. java c语言 实现des算法_C语言实现DES算法
  9. oracle增量脚本(记录)创建触发器监控对一张表的增删改
  10. 微信小程序地图组件利用腾讯地图生成热力图
  11. 湖南工大计算机学院大一分班,大一新生入学计算机分级教学考试会影响分班吗?...
  12. 【东华初中编程试题2206】病毒复制 N 分数 快递哥
  13. python实现pearson相关性检验
  14. LogAnomaly: Unsupervised Detection of Sequential and Quantitative Anomalies in Unstructured Logs
  15. 人生法则:蝴蝶效应、青蛙现象、鳄鱼法则、鲇鱼效应、羊群效应、刺猬法则...
  16. 心流体验:专注的快乐--读书笔记
  17. Django案例:显示图书的信息books
  18. 新手小白设计干货|使用ps制作一张简单海报
  19. 行逻辑连接的顺序表实现稀疏矩阵乘法
  20. 有关于微信公众号网页开发的流程(自己的看法)

热门文章

  1. 怎么更新计算机显卡,电脑显卡怎么升级?电脑显卡升级的教程
  2. 误删 Win10 应用商店应该如何恢复?
  3. python三国演义人物出现次数_Python分析《三国演义》人物出场次数,孔明第二,赵云第五...
  4. 如何24小时实时监控网站访问状态?
  5. php 生日提醒,PHP中实现简单的生日提醒功能实例,简单又实用!
  6. InsecureProgramming-master——abo1
  7. D2RQ 的安装和基本使用
  8. Unity 图片字体制作
  9. aspose-word的简单使用以及转pdf线上乱码
  10. 程序员之路:Gmail邮箱客户端配置