第一次结对作业

问题定义及难点

定义:黄金点游戏是一个多人博弈游戏,N为玩家利用强化学习设计自己的参赛Bot,根据历史数据预测每一轮的黄金点值,预测值最接近黄金点的Bot获得N分奖励,最远离黄金点的Bot得到-2分的惩罚,所有Bot的最终目的是在10000轮比赛中得到尽可能多的奖励。

难点:

  1. 选用哪一种强化学习方法?Q-Learning?Deep Q-Learning?LSTM?傻瓜式Bot?
  2. 强化学习中的状态概念如何定义?选用历史10个黄金点作为当前时刻状态还是100个黄金点?或者其他人工设计的状态?
  3. 预测什么?直接预测黄金点数值还是预测一种行动策略然后根据策略生成黄金点数值?
  4. 如何定义反馈(reward)?直接使用得分作为reward还是做一些人工设计?

方法建模

选用的方法:Q-Learning。如果状态定义为前十轮的黄金点,由于黄金点为小数,状态空间无限大,适用Deep Q-Learning的方法。我们对状态的定义沿用了RLBotDemo.py里的,定义为前十轮黄金点上升和下降的次数。有限的状态空间适合使用Q-Learning的方法。所以我们最终选用了Q-Learning作为我们的强化学习方法。

方法介绍:Q-Learning中的Q指的是在某一时刻的s状态下,采取动作a所能获得的期望收益。算法的主要思想是将环境状态和动作构建成一张Q表存储Q值,然后根据当前状态和Q值,采取能够获得最大期望收益的动作,之后根据环境的反馈更新Q表。

实现细节:

状态定义:前十轮黄金点上升和下降次数,以及前十轮过后黄金点是变大了还是变小了

例:假设前十一轮黄金点为5、10、4、6、8、2、1、4、16、6、2,那么状态为:上升5次、下降5次、变小

为什么这么定义?

观察已有的比赛数据,我们发现黄金点曲线有一个明显的特点就是,经常会出现类似正弦曲线的上升下降的片段。获取room1的历史数据,发现黄金点几乎不会连续变大或者变小4次以上。这说明黄金点是一直处在上下波动的状态,所以我们不打算拟合黄金点的值预测方程,而是去预测黄金点下一步是要上升还是要下降。此外,这样的状态定义下,状态空间是有限且有足够表达力的,有利于Q表的快速收敛。

动作定义:

动作一:number1为前6个黄金点均值,number2为上一个黄金点加上前6轮之后黄金点的变化值。这个动作用于预测黄金点上下波动的情况。

动作二:number1预测等比数列(number1=gArray[-1]/gArray[-2] * gArray[-1]),number2预测等差数列(number1=gArray[-1] - (gArray[-2]-gArray[-1]))。

动作三:number1预测50,number2为上一个黄金点加上前6轮之后黄金点的变化值。

动作四:number1为上一个黄金点,number2为上一个黄金点乘以0.618。

动作五:number1为上一个黄金点,number2为前5个黄金点的平均值。

Reward定义:

如果把每一轮的得分作为reward去更新Q表的话,由于大部分时候得分为0,所以Q表更新很慢。为了能够快速收敛,根据上一轮预测值里黄金点距离的排名,使用线性插值的方法得到一个相对得分作为reward。

其他细节:

在每一轮预测时,以概率p随机行动,以概率1-p选择期望回报最大的行动。游戏刚开始为了更够遍历Q表各个表项,p初始值为0.9,按照指数衰减,在1000轮后衰减到0.05,之后保持不变。

结果分析

最终的结果并不理想。在正式比赛之前,我们和涂涵越组的Bot以及demo里的bot做过10000轮的比赛,最终我们的bot以压倒性优势取胜,所以后来也没有改变策略。现在看来应该是demo里面采取的action过于简单。

我的队友有很强的编程能力,结对编程时我从他那里学会了很多,比如单元测试、规范编码等。

posted @ 2019-09-22 17:47  _最冷一天  阅读(152)  评论(1编辑  收藏  举报