对于特定的游戏问题使用启发式算法可以取得比AI算法更好的表现
相关:
Using A.I. to DOMINATE NERDS in TETRIS
有些问题的求解可以通过建模将其转换为强化学习问题,然后再使用强化学习算法对其进行求解,但是很多问题如果不建模为强化学习问题也是可以通过传统的启发式算法进行求解的,甚至很多情况下在特定问题中传统的启发式算法会比AI领域的强化学习算法效果更好,本文就以俄罗斯方块的游戏问题为切入进行讨论。
首先要知道俄罗斯方块问题是一个AI难度较大的问题,使用RL方法是较为困难对其进行求解的,其中最为困难的一点在于俄罗斯方块问题的状态是难以评价的,因为俄罗斯方块的最终目标就是消除方块积累然后使方块游戏可以一直进行下去,但是这个最终目标是难以细化到每一个step过程的操作评价的,比如一个正在下降的积木块,在很多时候我们是难以给出其最好的落点的,因为这时候往往有多个位置可以落,我们可以选择优先用下降的积木块去填补有漏洞的位置,也可以将其优先和最上层的累积积木块拼接以求消减掉最上层的积木,又比如一个下降的竖线性积木块,我们是将其平放实现最先实现上层积木块的消除还是将其插入有多层空前的位置以实现对下层积木块累积位置中缺失位置的填补,总之,在很多情况下(大多数情况下,几乎所有情况下)我们是难以简单的给出将正在下降的积木块进行如何的放置操作是最优的,或者说我们难以给出在状态\(s\)的情况下执行动作\(\{a_1, a_2, a_3, a_4, a_5, a_6\}\)后得到下一步状态\(s_1, s_2, s_3, s_4, s_5, s_6\)后到底这6个下一步的状态哪个更好,而对于下一状态的评价是极为困难的,我们也不能简单的根据一步动作后得分来简单判定,也正是这个原因导致强化学习算法还是启发式算法在解决俄罗斯方块问题都有一点难度。
分析了俄罗斯方块问题的难度后我们可以有以下几种解决方法:
- 构建为强化学习问题,使用强化学习算法求解;
- 使用遗传算法这样的进化算法求解;
- 直接使用规划算法求解;
- 遗传算法+强化学习算法/规划算法
第一种方法,使用强化学习算法,我们可以设置reward为没存活一步则动作的reward为+1,不过该种方式可能会很难收敛,因为很多无用的无太大意义的操作也会获得reward;我们也可以不为每个step设置reward,而是在episode结束后根据episode的长度给予reward,比如episode长度为100,那么reward为100, episode长度为1000那么reward为1000,由于最终的优化目标是最大化episode长度,那么就会出现算法性能越好则算法训练周期越长,甚至可能导致算法运行时长难以接受的问题;我们也可以根据人为指定reward,即根据reward工程设置具体的每一步reward,这时根据下一步状态的评价给出reward值,此时的reward的设定和启发式方法(规划算法中对游戏状态的评价)中的相同。
第二种,使用遗传算法,也是根据一个episode结束后episode的长度给出适应度的值,episode越长则适应度越高,使用该种方式同第一种方法中完整采集整个episode后进行训练的方式一样会导致训练速度过慢的问题。
第三种,我们可以使用一些人为的判定标准给出对不同游戏状态的评价,(在本文下方给出几张不同评价函数的图片),当我们有了对不同状态的评价后我们自然可以得到下一步状态的最优选择,不过该种方式的求解效果极大程度上取决于人为指定的游戏状态评价函数。
第四种,由于强化学习算法和规划算法求解俄罗斯方块游戏都有对游戏状态进行评价的需要,那么我们可以使用遗传算法去优化这个状态评价函数,具体就为我们可以得到影响游戏状态好坏的几个因素(积木累积的高度、空洞数,等等),而游戏状态的评价函数可以设置为这几个因素的线性和的关系,需要求解的就是这个游戏状态评价函数中各个因素的权重是多少,而这个权重则使用遗传算法求解。该种方式可以看做是遗传算法和强化学习算法/规划算法的结合,因此运行时长也是较长的。
在这里可以给出一个结论,那就是如果游戏状态的评价函数很好的情况下,使用规划算法会取得最优的算法性能表现,会远高于单纯使用遗传算法或以每步得分或每步固定得分或按照episode长度给定reward值的强化学习算法性能要好的,也就是说在游戏状态评价函数较好的情况下,使用启发式算法(规划算法)可以比AI算法(强化学习算法)取得更好表现。
在资料Using A.I. to DOMINATE NERDS in TETRIS中,使用遗传算法来优化游戏状态的评价函数,而在游戏状态评价函数固定的情况下游戏的具体执行动作为规划算法,由此可以看到“遗传算法+规划算法”的这种算法组合会比强化学习算法在俄罗斯方块问题上更有优势。当然,我们也可以使用“遗传算法+强化学习算法”的这种算法组合,同样是使用遗传算法来优化游戏状态的评价函数,不过在游戏状态评价函数指定的情况下是没有必要使用强化学习算法的,因为训练强化学习算法来执行具体的操作步骤是极为耗费时间的,该训练过程时间花费明显,但是规划算法可以较为容易的得到一个游戏状态到下一个游戏状态所需要的一系列的执行动作的,这其中的动作探索和规划的时间花销会明显优于使用强化学习算法进行具体执行动作训练的。





强化学习算法library库:(集成库)
https://github.com/Denys88/rl_games
https://github.com/Domattee/gymTouch
个人github博客地址:
https://devilmaycry812839668.github.io/
对于特定的游戏问题使用启发式算法可以取得比AI算法更好的表现的更多相关文章
- 游戏人工智能 读书笔记 (四) AI算法简介——Ad-Hoc 行为编程
本文内容包含以下章节: Chapter 2 AI Methods Chapter 2.1 General Notes 本书英文版: Artificial Intelligence and Games ...
- H5版俄罗斯方块(3)---游戏的AI算法
前言: 算是"long long ago"的事了, 某著名互联网公司在我校举行了一次"lengend code"的比赛, 其中有一题就是"智能俄罗斯方 ...
- Java五子棋小游戏(控制台纯Ai算法)
Java五子棋小游戏(控制台纯Ai算法) 继续之前的那个五子棋程序 修复了一些已知的小Bug 这里是之前的五子棋程序 原文链接 修复了一些算法缺陷 本次增加了AI算法 可以人机对战 也可以Ai对Ai看 ...
- 【2048小游戏】——原生js爬坑之遍历算法显示二维数组内容
引言:做2048小游戏会将横纵方向的数字内容,存储在一个二维数组中,要将这个二维数组中的内容显示在页面上,就一定要用遍历算法来实现了. 一.二维数组存储 首先考虑用二维数组存储所有行数,列数 ...
- swift语言实战晋级-第9章 游戏实战-跑酷熊猫-7-8 移动平台的算法
在上个小节,我们完成了平台的产生.那么我们来实现一下让平台移动.平台的移动,我们只需要在平台工厂类中写好移动的方法,然后在GameScene类中统一控制就行了. 在GameScene类中,有个upda ...
- 矩阵游戏|ZJOI2007|BZOJ1059|codevs1433|luoguP1129|二分图匹配|匈牙利算法|Elena
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MB Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩 ...
- 根据之前的博文,我把给同学做的三子棋小游戏的代码发出来,只是界面很丑很丑,AI算法很笨很笨,过几天我传到网盘上,提供大家下载娱乐
background_image_filename = 'blackground.png' black_mouse_image_filename = 'black.png' white_mouse_i ...
- 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)
http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...
- 基于御安全APK加固的游戏反外挂方案
一. 前言 随着移动互联网的兴起,移动游戏市场近几年突然爆发,收入规模快速增长.根据第三方数据统计,国内移动游戏2015年市场规模已达514.6亿.由于手游市场强势兴起,而且后续增长势头会愈加猛烈.火 ...
- 总结使用Unity 3D优化游戏运行性能的经验
原地址:http://www.gameres.com/msg_221889.html 作者:Amir Fasshihi 流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow ...
随机推荐
- Java中如何以文本方式输出"\"
1. 转义符使用 "\"在 java中是一个转义符,只要有它的出现往往有他独特的意义,如下图: 那么,在输出文本时,需要输出"\"怎么办呢,其实很简单,只要多加 ...
- redis集群之哨兵模式
redis集群之哨兵模式 1.集群部署 安装配置可参考一下地址: https://www.cnblogs.com/zhoujinyi/p/5569462.html 2.与springboot集成 这里 ...
- 最详细STL(二)deque
deque其实也是数组,也可以动态的添加和减少元素,但是和vector不同的是,deque可以快速的在头部和尾部添加减少元素(vector只能快速的在尾部添加),然而在插入元素的时候因为头部和尾部都可 ...
- JWT单点登录
单点登录 概念:登录某集团的某一产品之后,访问其他产品的网站时就会是登录状态,比如登录QQ之后,进入QQ游戏的时候就是登录过的状态,具体实现方法有以下: Redis+token实现单点登录: 生成一个 ...
- Azure – Azure Active Directory
前言 虽然它好像是快过时了, 但目前还得用到. 先不研究新的先. Azure 的 service 如果要通过 API 调用的话, 就需要 Azure Active Directory (Azure A ...
- duxapp:基于Taro使用模块化开发,提升开发效率
duxapp是基于Taro二次开发的模块化框架 使用这个框架,结合框架提供的UI库和工具库,能帮助你快速且高质量的完成项目,且能实现同时开发小程序.H5.APP(React Native),并且保证各 ...
- [OI] Kruskal 重构树
算法介绍 Kruskal 重构树用于快速判断节点的连通性. 考虑到,假如两个节点是联通的,则他们之间总会有一条边被选入最小生成树内,因此他们在最小生成树内也是联通的. 也就是说,我们可以通过求最小生成 ...
- Nacos 开启鉴权设置
Nacos 开启鉴权设置 # 开启鉴权 nacos.core.auth.enabled=true nacos.core.auth.system.type=nacos # 开启鉴权之后,你可以自定义用于 ...
- SpringBoot创建微服务项目
下载安装并配置git 为自己的git设置名字 git config --global user.name "XXX" 配置自己注册码云的邮箱 git config --global ...
- 阿里云Centos7修改MariaDB数据库连接时间,解决连接mysql报Too many connection的问题
在测项目的时候突然发现数据库连接不上了,提示Too many connection. 产生问题的原因是MySQL的Sleep进程占用了大量的连接,当时是重启mysql解决的这个问题!后来又配置了连接池 ...