强化学习的作用在于通过当前的环境做出相应的action,得到最大的value
如TensorFlow实战中的例子:
在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来执行。