Q
π
(
s
t
,
a
t
)
=
n
次增量
Q
π
(
s
t
,
a
t
)
+
α
(
R
t
−
Q
π
(
s
t
,
a
t
)
)
=
n
次增量
Q
π
(
s
t
,
a
t
)
+
α
(
r
t
+
1
+
γ
R
t
+
1
−
Q
π
(
s
t
,
a
t
)
)
=
n
次增量
Q
π
(
s
t
,
a
t
)
+
α
(
r
t
+
1
+
γ
Q
π
(
s
t
+
1
,
a
t
+
1
)
−
Q
π
(
s
t
,
a
t
)
)
⏟
采样
\begin{aligned}Q^{\pi}\left( s_t,a_t \right) &\xlongequal{n\text{次增量}}Q^{\pi}\left( s_t,a_t \right) +\alpha \left( R_t-Q^{\pi}\left( s_t,a_t \right) \right) \\\,\, &\xlongequal{n\text{次增量}}Q^{\pi}\left( s_t,a_t \right) +\alpha \left( r_{t+1}+\gamma R_{t+1}-Q^{\pi}\left( s_t,a_t \right) \right) \\\,\, &\xlongequal{n\text{次增量}}{ \underset{\text{采样}}{\underbrace{Q^{\pi}\left( s_t,a_t \right) +\alpha \left( r_{t+1}+{ \gamma Q^{\pi}\left( s_{t+1},a_{t+1} \right) }-Q^{\pi}\left( s_t,a_t \right) \right) }}}\end{aligned}
Q
π
(
s
t
,
a
t
)
n
次增量
Q
π
(
s
t
,
a
t
)
+
α
(
R
t
−
Q
π
(
s
t
,
a
t
)
)
n
次增量
Q
π
(
s
t
,
a
t
)
+
α
(
r
t
+
1
+
γ
R
t
+
1
−
Q
π
(
s
t
,
a
t
)
)
n
次增量
采样
Q
π
(
s
t
,
a
t
)
+
α
(
r
t
+
1
+
γ
Q
π
(
s
t
+
1
,
a
t
+
1
)
−
Q
π
(
s
t
,
a
t
)
)
其中
r
t
+
1
+
γ
Q
π
(
s
t
+
1
,
a
t
+
1
)
−
Q
π
(
s
t
,
a
t
)
r_{t+1}+\gamma Q^{\pi}\left( s_{t+1},a_{t+1} \right) -Q^{\pi}\left( s_t,a_t \right)
r
t
+
1
+
γ
Q
π
(
s
t
+
1
,
a
t
+
1
)
−
Q
π
(
s
t
,
a
t
)
称为
时序差分误差
。基于离轨策略的时序差分强化学习的代表性算法是
Q-learning算法
,其算法流程如下所示。具体的策略改进算法推导请见之前的文章,本文重点在于应用Q-learning算法解决实际问题
强化学习的基本过程是:智能体对环境采取某种行动
a
a
a
,观察到环境状态发生转移
s
0
→
s
s_0\rightarrow s
s
0
→
s
,反馈给智能体转移后的状态
s
s
s
和对这种转移的奖赏
r
r
r
。综上所述,一个强化学习任务可以用四元组
E
=
<
S
,
A
,
P
,
R
>
E=\left< S,A,P,R \right>
E
=
⟨
S
,
A
,
P
,
R
⟩
表征
状态空间
S
S
S
:每个状态
s
∈
S
s \in S
s
∈
S
是智能体对感知环境的描述;
动作空间
A
A
A
:每个动作
a
∈
A
a \in A
a
∈
A
是智能体能够采取的行动;
状态转移概率
P
P
P
:某个动作
a
∈
A
a \in A
a
∈
A
作用于处在某个状态
s
∈
S
s \in S
s
∈
S
的环境中,使环境按某种概率分布
P
P
P
转换到另一个状态;
奖赏函数
R
R
R
:表示智能体对状态
s
∈
S
s \in S
s
∈
S
下采取动作
a
∈
A
a \in A
a
∈
A
导致状态转移的期望度,通常
r
>
0
r>0
r
>
0
为期望行动,
r
<
0
r<0
r
<
0
为非期望行动。
所以,程序上也需要依次实现四元组
E
=
<
S
,
A
,
P
,
R
>
E=\left< S,A,P,R \right>
E
=
⟨
S
,
A
,
P
,
R
⟩
3 机器人走迷宫算法
3.1 迷宫环境
我们创建的迷宫包含障碍物、起点和终点
classMaze(tk.Tk,object):'''
* @breif: 迷宫环境类
* @param[in]: None
'''def__init__(self):super(Maze, self).__init__()
self.action_space =['u','d','l','r']
self.n_actions =len(self.action_space)
self.title('maze game')
self.geometry('{0}x{1}'.format(MAZE_H * UNIT, MAZE_H * UNIT))
self.buildMaze()'''
* @breif: 创建迷宫
'''defbuildMaze(self):
self.canvas = tk.Canvas(self, bg='white', height=MAZE_H * UNIT, width=MAZE_W * UNIT)# 网格地图for c inrange(0, MAZE_W * UNIT, UNIT):
x0, y0, x1, y1 = c,0, c, MAZE_H * UNIT
self.canvas.create_line(x0, y0, x1, y1)for r inrange(0, MAZE_H * UNIT, UNIT):
x0, y0, x1, y1 =0, r, MAZE_W * UNIT, r
self.canvas.create_line(x0, y0, x1, y1)# 创建原点坐标
origin = np.array([20,20])# 创建障碍
barrier_list =[(0,0),(1,0),(2,0),(3,0),(4,0),(5,0),(6,0),(0,6),(1,6),(2,6),(3,6),(4,6),(5,6),(6,6),(0,1),(0,2),(0,3),(0,4),(0,5),(6,1),(6,2),(6,3),(6,4),(6,5),(1,2),(2,2),(4,1),(5,4),(1,4),(3,3)]
self.barriers =[self.creatObject(origin,*index)for index in barrier_list]# 创建终点
self.terminus = self.creatObject(origin,5,5,'blue')
3.2 状态、动作和奖励
机器人的状态可以设置为当前的位置坐标
s = self.canvas.coords(self.agent)
机器人的动作可以设为上、下左、右
if action ==0:# upif s[1]> UNIT:
base_action[1]-= UNIT
elif action ==1:# downif s[1]<(MAZE_H -1)* UNIT:
base_action[1]+= UNIT
elif action ==2:# rightif s[0]<(MAZE_W -1)* UNIT:
base_action[0]+= UNIT
elif action ==3:# leftif s[0]> UNIT:
base_action[0]-= UNIT
Q
π
(
s
t
,
a
t
)
=
Q
π
(
s
t
,
a
t
)
+
α
(
r
t
+
1
+
γ
Q
π
(
s
t
+
1
,
a
t
+
1
)
−
Q
π
(
s
t
,
a
t
)
)
Q^{\pi}\left( s_t,a_t \right) ={ {Q^{\pi}\left( s_t,a_t \right) +\alpha \left( r_{t+1}+{ \gamma Q^{\pi}\left( s_{t+1},a_{t+1} \right) }-Q^{\pi}\left( s_t,a_t \right) \right) }}
Q
π
(
s
t
,
a
t
)
=
Q
π
(
s
t
,
a
t
)
+
α
(
r
t
+
1
+
γ
Q
π
(
s
t
+
1
,
a
t
+
1
)
−
Q
π
(
s
t
,
a
t
)
)