对于特定的游戏问题使用启发式算法可以取得比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 ...
随机推荐
- ArgoWorkflow教程(二)---快速构建流水线:Workflow & Template 概念
上一篇我们部署了 ArgoWorkflow,并创建了一个简单的流水线做了个 Demo.本篇主要分析 ArgoWorkflow 中流水线相关的概念,了解概念后才能更好使用 ArgoWorkflow. 本 ...
- MessageBox弹出后无响应
这几天学习了自定义模板对话框类,就是说不用系统定义的模板对话框类来创建对话框 消息处理就不用返回0了,可直接返回DefWindowProc HINSTANCE hInstance = ::GetMod ...
- esphome esp8266刷写遇到的问题
问题描述: 在尝试打开串口时出现以下错误信息: Failed to execute 'open' on 'SerialPort': Failed to open serial port. 起因: 莫名 ...
- java_基本类型
1. 所有的基本类型都是小写 例如 int 2. 所有的类 类型首字母大写 例如String
- 二. Spring Boot 中的 “依赖管理和自动配置” 详解透彻到底(附+详细代码流程)
二. Spring Boot 中的 "依赖管理和自动配置" 详解透彻到底(附+详细代码流程) @ 目录 二. Spring Boot 中的 "依赖管理和自动配置" ...
- 鸿蒙系统(HarmonyOS)全局弹窗实现
全局弹窗相对于自定义弹窗有以下优点: 封装更彻底,一行代码就能调用 跟组件耦合度低,只需要传入组件的UIContext对象,不需要跟自定义弹窗一样需要在组件内部实例化CustomDialogContr ...
- 【题目全解】ACGO排位赛#12
ACGO 排位赛#12 - 题目解析 别问为什么没有挑战赛#11,因为挑战赛#11被贪心的 Yuilice 吃掉了(不是). 本次挑战赛难度相比较前面几次有所提升. 爆料:小鱼现在已经入职了研发部门, ...
- 全网最适合入门的面向对象编程教程:47 Python函数方法与接口-回调函数Callback
全网最适合入门的面向对象编程教程:47 Python 函数方法与接口-回调函数 Callback 摘要: 回调函数是编程中一种非常常见的模式,用于将函数作为参数传递给其他函数或方法.这种模式在 Pyt ...
- RxJS 系列 – Error Handling Operators
前言 前几篇介绍过了 Creation Operators Filter Operators Join Creation Operators 这篇继续介绍 Error Handling Operato ...
- 图解连接阿里云(二)使用Paho-MQTT(支持FreeRTOS版本、Linux版本)连接1MQTT测试服务器 2阿里云物联网平台
前沿提要: MQTT是什么不知道? 看这一篇:https://www.cnblogs.com/happybirthdaytoyou/p/10362336.html 阿里云官网玩不转? 看这一篇: ht ...