资源下载地址:https://download.csdn.net/download/sheziqiong/85656972
资源下载地址:https://download.csdn.net/download/sheziqiong/85656972

监督学习在Aliens游戏中的探究尝试

一、基于现有特征提取方法的实验

1.1 现有特征提取的理解

Recorder.java提供了特征提取的入口。其中invoke为记录函数,它调用featureExtract函数来生成当前状态的观测,并在末尾追加当前做出的动作,以此形成一条完整记录,用filewriter写入文件。FeatureExtract函数是特征提取的重点,目前我们提取的特征有:32*14=448个格子中的物体,4个游戏相关属性,1个动作,总共453个值。其中448个格子记录物体的编号,是一个int类型,4个游戏相关属性直接调用obsversation的4个get个方法得到(需要注意的是源代码里给448赋值了4次,实际上只存了AvatarType,其他的都被取代了)。

在invoke函数中对于4个动作的整数化表示如下:

1.2 不同模型的介绍与训练结果分析

为了充分比较不同监督学习模型的游戏性能,这里直接选择了最高难度的游戏,并且控制变量,使用相同的训练数据与训练轮数,只改变训练模型。

1.2.1 朴素贝叶斯

简介

朴素贝叶斯算法是一种基于概率的分类方法,它的主要依据是如下图的 条件概率公式,即假定给定目标值时属性之间相互条件独立,在X=Xi的情况下将输入样本分类到某一类的概率可以由这一类出现的概率乘此类中输入为Xi出现的条件概率再除以X=Xi的概率得出。以此种方法计算不同分类的概率,并返回最大值所指向的分类,就完成了朴素贝叶斯分类。需要注意的是,P(X=Xi)可以通过全概率公式得出,也可以直接统计计算。

朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响。[4]

朴素贝叶斯算法的优点是,对小规模的数据表现很好,适合多分类任务,适合增量式训练。同时它的缺点在于,对输入数据的表达形式很敏感(离散、连续,值极大极小之类的)。[3]

训练结果

训练数据显示总的分类准确率为40%左右,相对较低。

分析详细准确性数据,可以发现NIL的精确率很高,但是召回率非常低,可以预见agent将比人类进行更少的停滞动作。USE两项均很低,可以想见agent将不太倾向于发射子弹,且正确发射的概率也相应较低。而left和right两项虽然虽然精确率不高但是召回率较高,因而agent将进行比人类更多的左右移动动作。

再看混淆矩阵,各项被分到正确类的概率还是最高的,同时错误分类到其他3项的概率大致相当且较高。因而agent的行为没有特别明显的偏好特征,但总的来说错误的比例是较高的,预计结果不会特别好。


游戏结果来看,在test的一开始,表现十分正常,命中率较高,很快就把外星人的数量减少到减少到5个以下,但在仅剩一个外星人的时候开始一动不动,最终失败。

小结

个人认为,在我们的特征数据提取所提供的X向量其维数相当大,而相对来说总的记录数量相对较小,这导致了统计X=Xi的概率始终处在一个非常小的值附近,而难以产生有价值的判断依据,甚至常常需要进行拉普拉斯平滑。因而朴素贝叶斯算法在这里不太容易产生良好的测试效果。

二、特征提取方法的改进

2.1 总的思路

旧版的特征提取中直接使用了448个方格内的物体属性作为特征来进行学习。这样做虽然最大化了特征的完整性,但是过于具体,缺乏抽象性,可能不具备良好的学习性质。同时游戏状态是不会重复的,因而收集到的特征参数也不尽相同,这样的朴素知识获取方法,近一步降低了训练模型的抽象性与泛化能力,非常容易出现过拟合情况。

因而我们特征提取方法的改进就是,通过人为方法提取一些更加“抽象”同时自认为“有用”的特征,让机器根据这些我们人类组织出来的经验进行学习,以期望获得更好的学习成果。

2.2 特征改进

首先解决开头的疑惑,将4个属性分别写入4个不同的位置。进行几次train后,通过直接阅读artf文件,发现除了gametick会变之外,其他三个始终是一个定值,对他们每次分别记录是毫无意义的!

所以我们为了增加空间利用率,直接移除原449,450,451属性值,并在原位存放后续的三个我们自定义的特征。



经过测试 itype: 0-empty 2-wall 5-bomb 6-alien,同时惊讶的发现,原来竟然完全没有记录Avatar的位置,真是荒唐啊荒唐。

首先,联想到自己玩塔防游戏的经验,防御塔可以设置属性“第一个”“最强的”“最近的”“最后一个”等等攻击优先度,我们的Avatar也可以发射子弹所以应当有类似的想法—攻击优先级。因为我们知道当第一个外星人下到最后一行的时候我们就已经输了,所以优先解决第一个外星人是理所应当的,于是有了第一个特征:第一个外星人与Avatar的相对位置(左负右正)。修改双重循环的顺序,使其从后向前检索,在遍历的同时直接就把最后一个alien的位置给找出来,不浪费时间。

其次,我们的Avatar不可以碰到炸弹,而“碰到”的含义在于Avatar先离炸弹很近,接着或是主动接近,或是被动接近,导致炸弹离我们越来越近,最后碰到一起,然后你就gg了。而这中间,尤以本来就最靠近Avatar的炸弹最为凶险,所以我们专门记录它和Avatar之间的距离,因而有了第二个特征值:最近炸弹与Avatar的相对位置(左负右正)。

第三,我在train的时候发现,由于Avatar的射击有攻击间隔,因而一旦在某一位置停下来射击,只要空了一发,往往后面的连续射击也“恰好”都会空枪。这时候就需要我们进行移动,或者稍作停顿后再次射击。这给了我们一个启发,即Avatar的行动前后是有关联的,并不是简单地单纯依据游戏状态(有点类似于时序逻辑电路的感觉),所以很自然地想到,可以把先前的动作作为下一次动作的判别依据,于是有了第三个特征:上一个动作的值。

2.3 性能评估

Nave-bayse:

一开始直接走到最右边开始站桩输出,但是在一段时间之后,忽然开始返回屏幕中间位置,并不断走A,行动模式与人类玩家非常相似。不过遗憾的是在外星人数量又一次降到较低值时,不再能准确击中外星人,最终被碰撞而亡。

Logistic:

起初的表现十分良好,可以正确移动与发射子弹,同时移动速度非常迅速异于人类,可以看到明显的规避炸弹动作。但是在仅剩一个外星人的时候,不会发射子弹,而是频繁的左右平移,最终失败。

Random-forest:

起初不断走A,在外形人数量少于5个时忽然开始站撸,在外星人循环两行之后获胜。

Simple-Cast:

始终在屏幕最左侧站桩输出,但是射击精准,直接获胜。

总体来看,4中算法在改进特征提取后均获得了不同程度的提升。尤其是其模仿人类的能力大大增强了。仍然存在较多问题,可能的原因是数据收集过少(只有一轮游戏),以及特征提取太杂且不够优化。

资源下载地址:https://download.csdn.net/download/sheziqiong/85656972
资源下载地址:https://download.csdn.net/download/sheziqiong/85656972

Java实现监督学习在Aliens游戏中的探究尝试相关推荐

  1. 编写Java程序,创建Dota游戏中的兵营类,兵营类有一个类成员变量count、一个实例变量name和另一个实例变量selfCount。

    返回本章节 返回作业目录 需求说明: 创建Dota游戏中的兵营类 兵营类有一个类成员变量count.一个实例变量name和另一个实例变量selfCount. count表示的是兵营已经创建士兵的总数: ...

  2. Java实现搜索在Bait游戏中的应用研究

    资源下载地址:https://download.csdn.net/download/sheziqiong/85656999 资源下载地址:https://download.csdn.net/downl ...

  3. 编写Java程序,创建Dota游戏中的防御塔类,通过两个坐属性显示防御塔所在的位置

    返回本章节 返回作业目录 需求说明: 创建Dota游戏中的防御塔类 通过两个坐属性显示防御塔所在的位置 实现思路: 创建防御塔(TowerDefense)类 在该类中定义了两个属性,分别是int类型横 ...

  4. java 清空jframe_java – 在新游戏中清除我的JFrame和JPanel

    我有一个简单的JPAnel用于tic-tac-toe,绘制线条-- 因此TTT类扩展了JPanel,并在其中包含一个GameLogic对象. 一切都很好,应用程序是主要添加TTT的JFrame,一切都 ...

  5. 如何使用java编程算概率_游戏中概率的编程实现(转之别人)最简单的

    概率 听起来很玄 比如洗法宝 太一石 有一段说明 有一定概率 能改变法宝的技能阶数 那么 概率在编程中如何实现的呢 个人在大学里有学c++ java 以及vb 现以vb实现概率来说明 首先,要先说清楚 ...

  6. 如何提升游戏中机器人的表现?

    一.前言 FPS(第一人称射击游戏)中的 AI 实现多年来一直沿用着状态机和行为树.策划和程序员充分利用这两个工具,做出了大量玩法,创造了许多新颖而有趣的模式.但绝大多数的 FPS 类游戏都是偏竞技的 ...

  7. 一行Java代码实现游戏中交换装备

    摘要:JDK 1.5 开始 JUC 包下提供的 Exchanger 类可用于两个线程之间交换信息. 本文分享自华为云社区<一行Java代码实现两玩家交换装备[并发编程]>,作者:陈皮的Ja ...

  8. mc是用java写的吗_都说MC的代码特别差劲,你觉得它在所有游戏中,能排第几?...

    原标题:都说MC的代码特别差劲,你觉得它在所有游戏中,能排第几? 虽然说我的世界这款游戏非常的好玩,销量世界第一,无论国内国外都非常的火热,但是大家都知道,一款游戏他的最原本的面貌是由一个又一个的代码 ...

  9. java 变声_“秒变萝莉音”,游戏中的变声是如何实现的?

    原标题:"秒变萝莉音",游戏中的变声是如何实现的? 本文作者 作者:soso密斯密斯 1 前言 这边先穿插一下变声相关的知识 ,这一章主要讲音频的处理. 大家应该也接触过这类应用, ...

最新文章

  1. pilt图像处理_Python用Pillow(PIL)进行简单的图像操作
  2. UNREFERENCED_PARAMETER的作用
  3. 媒体查询常用屏幕分辨率参数
  4. Git Branch Mode(分支模式)
  5. 基于zeromq的高性能分布式RPC框架Zerorpc 性能测试
  6. 高考计算机专业最低分数线是多少,2021最低多少分可以稳上二本 高考二本分数线是多少...
  7. 专门针对苹果 M1 芯片的首款恶意软件已现身
  8. HarmonyOS 开发App详细步骤
  9. VM Player虚拟机的固定IP方法
  10. python绘制缓和曲线_cad缓和曲线怎么绘制? cad缓和曲线插件的下载使用方法
  11. 苹果手机怎么设置新的id
  12. 全职专业玩家分享:手动党梦幻五开赚钱心得
  13. 卸载CTEX后再安装LaTex时会遇到的问题
  14. 微信小程序 ---在Vscode上编辑,微信开发者工具上预览,快速上手
  15. 前端知识合集【重中之重】,我只看这一篇!
  16. linux禁止root用户su,Linux 禁止普通用户su到root
  17. 小米红米手机无电池24H开机完美解决方案
  18. Qt实现Linux下的硬盘空间监测和文件清理
  19. AutoCAD.NET学习笔记之绘制、插入图形和块
  20. composer 详解

热门文章

  1. edge插件默认下载位置
  2. python读取多个txt文件数据恢复_多个文件内容
  3. 贾扬清从阿里毕业了!
  4. mysql表空间满_怎么解决数据库表空间不足
  5. Node.js之包管理npm
  6. SAS PROC TABULATE学习笔记01
  7. php excel 公式,Excel函数所有公式汇总
  8. 云服务案例分析 BB平台 Quiz5
  9. 简单实现前端选择上传图片并显示略缩图
  10. Simulink仿真时间、步长、精度和解法器设置