相关:

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个下一步的状态哪个更好,而对于下一状态的评价是极为困难的,我们也不能简单的根据一步动作后得分来简单判定,也正是这个原因导致强化学习算法还是启发式算法在解决俄罗斯方块问题都有一点难度。

分析了俄罗斯方块问题的难度后我们可以有以下几种解决方法:

  1. 构建为强化学习问题,使用强化学习算法求解;
  2. 使用遗传算法这样的进化算法求解;
  3. 直接使用规划算法求解;
  4. 遗传算法+强化学习算法/规划算法

第一种方法,使用强化学习算法,我们可以设置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算法更好的表现的更多相关文章

  1. 游戏人工智能 读书笔记 (四) AI算法简介——Ad-Hoc 行为编程

    本文内容包含以下章节: Chapter 2 AI Methods Chapter 2.1 General Notes 本书英文版: Artificial Intelligence and Games ...

  2. H5版俄罗斯方块(3)---游戏的AI算法

    前言: 算是"long long ago"的事了, 某著名互联网公司在我校举行了一次"lengend code"的比赛, 其中有一题就是"智能俄罗斯方 ...

  3. Java五子棋小游戏(控制台纯Ai算法)

    Java五子棋小游戏(控制台纯Ai算法) 继续之前的那个五子棋程序 修复了一些已知的小Bug 这里是之前的五子棋程序 原文链接 修复了一些算法缺陷 本次增加了AI算法 可以人机对战 也可以Ai对Ai看 ...

  4. 【2048小游戏】——原生js爬坑之遍历算法显示二维数组内容

    引言:做2048小游戏会将横纵方向的数字内容,存储在一个二维数组中,要将这个二维数组中的内容显示在页面上,就一定要用遍历算法来实现了. 一.二维数组存储    首先考虑用二维数组存储所有行数,列数   ...

  5. swift语言实战晋级-第9章 游戏实战-跑酷熊猫-7-8 移动平台的算法

    在上个小节,我们完成了平台的产生.那么我们来实现一下让平台移动.平台的移动,我们只需要在平台工厂类中写好移动的方法,然后在GameScene类中统一控制就行了. 在GameScene类中,有个upda ...

  6. 矩阵游戏|ZJOI2007|BZOJ1059|codevs1433|luoguP1129|二分图匹配|匈牙利算法|Elena

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MB Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩 ...

  7. 根据之前的博文,我把给同学做的三子棋小游戏的代码发出来,只是界面很丑很丑,AI算法很笨很笨,过几天我传到网盘上,提供大家下载娱乐

    background_image_filename = 'blackground.png' black_mouse_image_filename = 'black.png' white_mouse_i ...

  8. 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)

    http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...

  9. 基于御安全APK加固的游戏反外挂方案

    一. 前言 随着移动互联网的兴起,移动游戏市场近几年突然爆发,收入规模快速增长.根据第三方数据统计,国内移动游戏2015年市场规模已达514.6亿.由于手游市场强势兴起,而且后续增长势头会愈加猛烈.火 ...

  10. 总结使用Unity 3D优化游戏运行性能的经验

    原地址:http://www.gameres.com/msg_221889.html 作者:Amir Fasshihi 流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow ...

随机推荐

  1. spring同时集成mybatis和ibatis

    最近来了一个新项目,说是新的项目,但是需要用到以前旧的模块代码,旧的模块使用架构为ssi 而新项目使用spring mvc +mybatis,考虑到工作量的问题,所以决定使用spring mvc +m ...

  2. 汇编跳转指令B、BL、BX、BLX 和 BXJ的区别

    跳转指令用于实现程序流程的跳转,在 ARM 程序中有两种方法可以实现程序流程的跳转: (1) 使用专门的跳转指令. (2) 直接向程序计数器 PC 写入跳转地址值. 通过向程序计数器 PC 写入跳转地 ...

  3. 最短路之Dijkstra

    Dijkstra算法: Dijkstra是一种求解 非负权图 上单源最短路径的算法. 思路:将所有结点分为两个集合:已经确定最短路径的点(S)和未确定最短路长度的点集(T),开始时所有点都属于T 初始 ...

  4. JavaScript设计模式样例十一 —— 外观模式

    外观模式(Facade Pattern) 定义:隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口. 目的:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得 ...

  5. 蓝松SDK版本更新至【4.8.0】

    [Android更新] 1. android增加低精度模型,一些低端机也可以流畅抠图. 2. android针对直播机硬件做了特定API,并C语言开源. 3. 视频编辑引出帧解码图层, 允许外界异步形 ...

  6. js_问题记录2022年6月24日19:35:12

    小问题中的大问题 新建子js脚本一定记得创建函数,不然写什么都无法实现 比如 新建了new1.js脚本,首先需要创建function后才能在里面进行参数操作和调用 js实现的功能: 获取到对应的id= ...

  7. 【YashanDB知识库】YashanDB 开机自启

    [问题分类] YashanDB 开机自启 [关键字] 开机自启,依赖包 [问题描述] 数据库所在服务器重启后只拉起monit.yasom.yasom进程,缺少yasdb进程: [问题原因分析] 数据库 ...

  8. JS实现树形结构数据的模糊搜索查询

    简单示例: 需求:输入 "题2" 字,希望树形结构中带有 "题2" 字的项显示,即使父节点没有,但子节点含有,父节点仍要返回. let arr = [ { ti ...

  9. RxJS 系列 – Join Creation Operators

    前言 我们一样从简单和常用的入手. 第一篇介绍了 Creation Operators 上一篇介绍了 Filter Operators 这一篇来到 Join Creation Operators. 参 ...

  10. SQL Server 备份方案

    参考 SQL Server三种常见备份 SQL Server备份策略 以前写的笔记 目的 在发生意外 (人为删除, 磁盘坏掉) 之后, 让数据可还原到指定时间点上. Backup 的种类 备份分 3 ...