强化学习之 Q-learning

强化学习的作用在于通过当前的环境做出相应的action,得到最大的value
如TensorFlow实战中的例子:


强化学习之 Q-learning_第1张图片

在5x5的游戏棋盘中,蓝色的代表人物。绿色的代表奖励。红色的代表惩罚。人物可以选择向上,下,左,右,四个方向行走,每走到绿色位置加10,红色位置-10,其余位置不加也不减。我们针对这个原则来制定最佳的行走方案来使奖励最多。
我们可以把整个Q-learning的学习工程写成下面的这个式子:


即当前环境下某位置的价值Q可以通过原来的Q和下一步能走的位置的最大值之间进行计算后训练获得。
通俗来讲,我们知道某一个位置是绿色,它的价值就会比较大,相同地,它的上,下,左,右,方向的四个位置,由于靠近绿色位置,所以价值也会比普通位置大。
红色附近的位置,由于靠近红色位置,价值也会比一般位置小。
而相同的,都是绿色,如图中第一行的绿色位置由于靠近两个红色,所以比较起来第三行的绿色位置,由于附近还有绿色位置。前者的价值将会小得多。
为了求出价值Q,我们首先根据每个位置的价值初始化矩阵 ,将初始矩阵都设置为0,reward矩阵设为:

[[-10,10,-10,0,0],
[0,0,0,0,10],
[0,0,0,0 ,0],
[10,0,0,0,0],
[0,10,0,0,0]]

α为0.01,γ为0.8,进行训练。

import numpy as np
GAMMA = 0.8
ALPHA = 0.01
num_steps = 10000
SIZE = 5
R = np.asarray([[-10, 10, -10, 0, 0],
                [0, 0, 0, 0, 10],
                [0, 0, 0, 0, 0],
                [10, 0, 0, 0, 0],
                [0, 10, 0, 0, 0]])
Q = np.zeros([SIZE, SIZE], np.float32)


def getMaxQ(statex, statey):
    state = []
    if statex > 0:
        state.append(Q[statex-1, statey])
    if statey > 0:
        state.append(Q[statex, statey-1])
    if statex < SIZE-1:
        state.append(Q[statex+1, statey])
    if statey < SIZE-1:
        state.append(Q[statex, statey+1])
    return max(state[:])


def QLearning():
    for statex in range(SIZE):
        for statey in range(SIZE):
            Q[statex, statey] = (1-ALPHA)*Q[statex, statey] + ALPHA* (R[statex, statey]+GAMMA * getMaxQ(statex, statey))

count = 0
while count < num_steps:
    QLearning()
    count += 1

print(Q)

得到Q值矩阵:

[[ 12.22179413  27.77730179  12.22179413  17.77730179  22.22174644]
 [ 17.77730179  22.22174644  17.77730179  22.22174644  27.77730179]
 [ 22.22174644  17.77730179  14.22179413  17.77730179  22.22174644]
 [ 27.77730179  22.22174644  17.77730179  14.22179413  17.77730179]
 [ 22.22174644  27.77730179  22.22174644  17.77730179  14.22179413]]

有了期望获取的最大价值Q,我们的最佳策略就是站在每一个state下,选择Q值最高的action来执行。

你可能感兴趣的:(强化学习之 Q-learning)