Q Q Q- L e a r n i n g \mathrm{Learning} Learning是强化学习的算法之一, Q \mathrm{Q} Q- L e a r n i n g \mathrm{Learning} Learning的主要目的就是学习状态动作价值函数的 Q ( s , a ) Q(s,a) Q(s,a),其中 Q ( s , a ) Q(s,a) Q(s,a)表示的是在给定当前状态 s s s和采取动作 a a a之后能够获得的收益期望。 Q Q Q- L e a r n i n g \mathrm{Learning} Learning利用状态 s s s和动作 a a a张成一个 Q Q Q表来储存 Q Q Q值,然后根据 Q Q Q值来选取能够获得最大收益的动作。 Q Q Q- L e a r n i n g \mathrm{Learning} Learning采用是值迭代的方法进行求解,其核心的迭代公式为 Q k + 1 ( s , a ) = ∑ s ^ ∈ S p ( s ^ ∣ s , a ) [ R ( s , a ) + γ ⋅ max a ^ ∈ A { Q k ( s ^ , a ^ ) } ] Q_{k+1}(s,a)=\sum\limits_{\hat{s}\in\mathcal{S}}p(\hat{s}|s,a)\left[R(s,a)+\gamma \cdot \max\limits_{\hat{a}\in \mathcal{A}}\{Q_k(\hat{s},\hat{a})\}\right] Qk+1(s,a)=s^∈S∑p(s^∣s,a)[R(s,a)+γ⋅a^∈Amax{ Qk(s^,a^)}]其中 Q k + 1 ( s , a ) Q_{k+1}(s,a) Qk+1(s,a)第 k + 1 k+1 k+1次迭代函数, s s s和 a a a分别表示的是当前的状态和执行的动作并且它们分别属于状态空间 S \mathcal{S} S和动作空间 A \mathcal{A} A, R ( s , a ) R(s,a) R(s,a)表示的是在状态 s s s执行动作 a a a后的即时奖励, s ^ \hat{s} s^和 a ^ \hat{a} a^表示的是下一个的状态和行为, p ( s ^ ∣ s , a ) p(\hat{s}|s,a) p(s^∣s,a)表示的是状态转移概率, γ \gamma γ表示的是折扣系数。
当动作空间 A \mathcal{A} A中的动作 a a a划分的足够细时候,给定当前状态 s s s和执行的动作 a a a,就能够明确确定下一个状态 s ^ \hat{s} s^,进而则有 p ( s ^ ∣ s , a ) = 1 p(\hat{s}|s,a)=1 p(s^∣s,a)=1,对上迭代公式进一步化简则有 Q k + 1 ( s , a ) = R ( s , a ) + γ ⋅ max a ^ ∈ A { Q k ( s ^ , a ^ ) } Q_{k+1}(s,a)=R(s,a)+\gamma \cdot \max\limits_{\hat{a}\in \mathcal{A}}\{Q_k(\hat{s},\hat{a})\} Qk+1(s,a)=R(s,a)+γ⋅a^∈Amax{ Qk(s^,a^)}一般情况下 Q Q Q- L e a r n i n g \mathrm{Learning} Learning算法用到的都是以上的迭代公式。
如下左半图显示,该图共有六个状态,五个房间分别是状态 0 0 0, 1 1 1, 2 2 2, 3 3 3和 4 4 4,以及房间外状态 5 5 5,右半图为左半图的状态转移过程的抽象示意图。现在的问题是如果有一个人在任意的一个房间里,给他支个招让他走出房间外。我们就可以通过强化学习中的 Q Q Q- L e a r n i n g \mathrm{Learning} Learning方法来解决这个问题。
在解决这个问题之前需要先确定奖励矩阵 R R R,其元素表示的是当一个给定一个状态 s s s,当执行某个动作 a a a后,它的即时奖励 R ( s , a ) R(s,a) R(s,a)的取值。规定当走出房间外到达状态 5 5 5的动作奖励为 100 100 100,如果没有走出房间外但在房间内可以走通的是奖励为 0 0 0,如果房间内也不能走通的动作奖励为 − 1 -1 −1。奖励矩阵 R R R具体取值如下所示。
R = [ − 1 − 1 − 1 − 1 0 − 1 − 1 − 1 − 1 0 − 1 100 − 1 − 1 − 1 0 − 1 − 1 − 1 0 0 − 1 0 − 1 0 − 1 − 1 0 − 1 100 − 1 0 − 1 − 1 0 100 ] R=\left[\begin{array}{rrrrrr}-1&-1&-1&-1&0&-1\\-1&-1&-1&0&-1&100\\-1&-1&-1&0&-1&-1\\-1&0&0&-1&0&-1\\0&-1&-1&0&-1&100\\-1&0&-1&-1&0&100\end{array}\right] R=⎣⎢⎢⎢⎢⎢⎢⎡−1−1−1−10−1−1−1−10−10−1−1−10−1−1−100−10−10−1−10−10−1100−1−1100100⎦⎥⎥⎥⎥⎥⎥⎤
下图表示的是经过 Q Q Q- L e a r n i n g \mathrm{Learning} Learning算法学习之后得到的最终的状态转移示意图,其中每个带有箭头的线上标明这个动作对应的即时收益。所以不管在哪个状态下,只要利用贪心策略找即时收益最大的行为就可以走出房间。
以上实例中 Q Q Q- L e a r n i n g \mathrm{Learning} Learning算法的完整代码如下所示,代码比较简单大约50行就可以完整实现该功能
import numpy as np
import os
import random
def random_action(V):
index_list = []
for index, s in enumerate(list(V)):
if s >= 0:
index_list.append(index)
return random.choice(index_list)
def reward_setting(state_num, action_num):
R = -1 * np.ones((state_num , action_num))
R[0,4] = 0
R[1,3] = 0
R[1,5] = 100
R[2,3] = 0
R[3,1] = 0
R[3,2] = 0
R[3,4] = 0
R[4,0] = 0
R[4,3] = 0
R[4,5] = 100
R[5,1] = 0
R[5,4] = 0
R[5,5] = 100
return R
if __name__ == '__main__':
action_num = 6
state_num = 6
gamma = 0.8
epoch_number = 200
condition_stop = 5
Q = np.zeros((state_num , action_num))
R = reward_setting(state_num , action_num)
for epoch in range(epoch_number):
for s in range(state_num):
loop = True
while loop:
# Obtain random action a
a = random_action(R[s,:])
# Calculate maximum Q value
q_max = np.max(Q[a,:])
# Bellman optimal iteration equation
Q[s,a] = R[s,a] + gamma * q_max
s = a
if s == condition_stop:
loop = False
Q = (Q / 5).astype(int)
print(Q)