flappy bird 为例子来讲
看完这个我好像脑子里有个程序了 :
https://www.zhihu.com/question/26408259
小鸟飞例子-建模关键点:
增强学习有三个要素:状态S,动作A,奖惩R的策略Q
S:
d(x,y)表示小鸟离下一根柱子的距离和高度差
A:
飞一下 或者 不飞,两种可选动作
Q(S+A->R):
为一个策略表,也称之为Q,其实就是我们最终想学到的东西。就是在某状态S下采用不同动作A 可以得到的奖惩R。
如何训练:
Initialize Q arbitrarily //随机初始化Q值 (撞地上或者柱子上初始化为负值)
Repeat (for each episode): //每一次游戏,从小鸟出生到死亡是一个episode
Initialize S //小鸟刚开始飞,S为初始位置的状态
Repeat (for each step of episode):
。。。根据当前Q和位置S,使用一种策略,得到动作A //这个策略可以是ε-greedy等
做了动作A,小鸟到达新的位置S',并获得奖励R //奖励可以是1,50或者-1000
Q(S,A) ← (1-α)*Q(S,A) + α*[R + γ*maxQ(S',a)] //在Q中更新S
S ← S'
until S is terminal //即到 小鸟死亡为止
关键的这一步怎么理解呢?
Q(S,A) ← (1-α)*Q(S,A) + α*[R + γ*maxQ(S',a)]
1 当处于S状态采取A策略后,根据S'我们可以得到R, 那么这个R应该跟新到Q(S,A)中,我们可能会这样做:
Q(S,A) ← (1-α)*Q(S,A) + α*R
其中α是0~1之间的一个数,我们称之为学习率。
2 上面的公式太短视,我们更新Q(S,A) 时是不是要考虑一下,通过步骤A走到下一个状态S'的收益呢?
Q(S,A) ← (1-α)*Q(S,A) + α*[R + γ*Q(S',?)]
其中γ是一个0~1的小数,表示我们关注长期(下一步)收益的程度,代表对历史经验的重视程度。
3 Q(S',?)表示状态S'的收益,Q(S',?)有飞和不飞2个值,我们既然知道奖惩,肯定是采用Q(S',?)中最大的那一种操作于是我们得到
Q(S,A) ← (1-α)*Q(S,A) + α*[R + γ*maxQ(S',a)]
根据以上信息就可以写代码啦!
现在用走房子的例子来写一个程序:
题目参考:http://blog.csdn.net/itplus/article/details/9361915#0-qzone-1-29435-d020d2d2a4e8d1a374a433f596ad1440
我们需要尽快从当前房子走到目的房子:
代码:
#include
#include
#include
#include
#include
#include
#include