机器学习之Robocode – 上篇

有空的时候每天写一点,希望早日写完~

1. 关于Robocode

Robocode是IBM开发的一个简单好上手的AI项目,用户自己可以编辑自己的机器人, 载入程序中并与其它机器人对战。这学期正在上机器学习的课程,正好借此平台练习编写自我学习的机器人,使得对机器学习中的概念有更具体的认识。那么有关Robocode的链接先放一下。

官网: https://robocode.sourceforge.io/

RoboWiki:http://robowiki.net/wiki/Robocode/My_First_Robot

自己的代码:https://github.com/TianqinCai/NN_Robot

好,剩下的部分就主要说代码了。日后方便回忆起来。

2. Look_Up_Table

从项目的第二部分LUT_Table开始说,这里我们用数组table[s][a]来记录状态s和动作a的组合对应的Q值。每当这个state-action pair 触发时做reinforce learning (Q-learning) 并更新Q值。

代码里面,现用的方法是先在LUT类静态生成一个s-dimension的StateTable, 计算state 数目,并给每个state情况分配一个值。举例就是对于前4个state,s1=8,s2=3,s3=8,s4=2,共有384种排列,stateTable[0][0][0][1]里的值为1,stateTable[7][2][7][1]里的值为383这样。另有一个LUT_Table[s][a], 主程序中通过将s1,s2,s3,s4的值传给stateTable得到LUT_Table的s,再结合a得到Q值。

空间消耗主要来自于LUT_Table O(s*a)。仅选取6个state和8个action的时候便需要存储50000左右的双精度浮点数,而Robocode只允许500MB以内的内存占用,所以需要减少state数量做space reduction。之后用NeuralNetwork会极大地缓解这个问题,下篇文章再具体讲。

那么另一种思路是用hashMap来计算state的hash value,然后通过stateHash和action来得到stateActionHash, 用hashMap存储stateActionHash对应的Q-value。空间消耗依然是O(s*a)

LUT_Table中其余的方法的用途是state normalizing, 比如heading的范围是[0,360] degree,那么必须要将其简化,这里将其简化为[0,7]的8个值,每个值代表一个45度区间。其余方法也是类似作用。

3. Reinforcement Learning

这部分的公式和具体操作方法先给一下。

代码上,把ReinforcementLearning抽象出来作为一个对象不一定是更好的做法。我看到很多人是直接在主函数(RoboCode)里写RL的。他们这样做的好处是可以把takeAction()放到Learning过程里面,将Learn方法包装完好。而将RL抽象出来则无法引入上级的takeAction操作,只能在学习过程中交替调用RL.selectionAction(), takeAction()和RL.learn()等函数,后期会使代码变得相当零散。

那内容方面,RL这里的难点在于SARSA和Q-Learning的区别, 在做exploration move的时候,对于Q-Learning (Off-Policy),我们还是当做我们采用了greedy move来做back up, 而对于SARSA(On-Policy), 我们按照exploration move采取的random move来做back up.

Q-Learning:

SARSA:

代码中的区分是onPolicyLearn()需要在外部做selectAction后,记录action并将其作为参数传入函数,作为此步的s’对应的a’。而offPolicyLearn无需传入action参数,直接在函数内部根据state求得bestAction即可

关于SARSA和Q-Learn的区别,这里有一篇比课件上更好的解释:https://studywolf.wordpress.com/2013/07/01/reinforcement-learning-sarsa-vs-q-learning/

其他内容比较简单,就是照公式写代码。未来需要把save win ratio的代码放到RL类或LUT类里。

结果方面exloration rate为0.7时效果最好,采用intermediate reward时效果远好于只用terminal reward的情况(显而易见),对手为crazy时robo在前500轮就已经完成学习并快速收敛到90%以上的胜率,但对阵alien时只能达到50%胜率,原因应该是state种类的限制和动作设计的不好。这里日后有时间还是要多做几组不同enemy的调试一下。

上一组结果图,NeuralNet 部分放在下一篇。

“机器学习之Robocode – 上篇”的一个回复

一位WordPress评论者进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注