眉毛粗的书签 · 【程序4】题目:输入某年某月某日,判断这一天 ...· 1 年前 · |
茫然的黑框眼镜 · logrus使用进阶_logrus.entr ...· 1 年前 · |
安静的牛肉面 · Git常用命令记录 - 金色旭光 - 博客园· 1 年前 · |
气势凌人的莴苣 · ListVIew点击事件失效 - ...· 1 年前 · |
完美的消炎药 · 【Python】爬虫篇 ...· 1 年前 · |
摘要: 上一节的压缩映射在实际迭代时可以分成两种方法,分别称作值迭代和策略迭代。本文用走迷宫的例子(将1维迷宫扩展到2维)讲这两种迭代。对应第一节参考链接[2]的前4章。
上一节的压缩映射
\begin{aligned} v(s) =& \max_\pi\sum_a\pi(a|s)q(s,a) \\ =& \max_a q(s,a) \\ =& \max_a[r(s,a)+\gamma v(s')] \\ =& \max[r(s,L)+\gamma v(s_L), r(s,R)+\gamma v(s_R)] \end{aligned}
v
(
s
)
=
=
=
=
π
max
a
∑
π
(
a
∣
s
)
q
(
s
,
a
)
a
max
q
(
s
,
a
)
a
max
[
r
(
s
,
a
)
+
γ
v
(
s
′
)]
max
[
r
(
s
,
L
)
+
γ
v
(
s
L
)
,
r
(
s
,
R
)
+
γ
v
(
s
R
)]
中实际上每次迭代都隐含了两步,这两步按执行的先后顺序分为值迭代和策略迭代,之前例子是值迭代,因为过于简单看不出区别(一步迭代就找到了最优策略),这次换个复杂的例子。这个式子中的
strategy
=
np
.
zeros
(
[
5
,
5
]
,
dtype
=
int
)
gamma
=
0.8
MAZE_TRAP
=
[
(
1
,
1
)
,
(
1
,
2
)
,
(
2
,
2
)
,
(
3
,
1
)
,
(
3
,
3
)
,
(
4
,
1
)
]
# 陷阱
MAZE_TERM
=
(
3
,
2
)
# 终点
# 找出一个数组中的最大值索引,如果有多个最大值,就从中随机取一个
def
Argmax_Rand
(
x
:
list
)
-
>
int
:
bestv
=
-
1e12
samevaluei
=
np
.
zeros
(
len
(
x
)
,
dtype
=
int
)
samecnt
=
0
for
n
in
range
(
len
(
x
)
)
:
if
x
[
n
]
<
bestv
:
continue
elif
x
[
n
]
>
bestv
:
bestv
=
x
[
n
]
samecnt
=
0
samevaluei
[
samecnt
]
=
n
samecnt
+=
1
return
samevaluei
[
np
.
random
.
randint
(
samecnt
)
]
# 返回与一个网格`grid`相邻的第`adjacent`处方位的网格
def
Find_Adjacent
(
grid
:
tuple
,
adjacent
:
int
)
-
>
tuple
:
ans
=
list
(
grid
)
if
adjacent
==
1
:
ans
[
1
]
+=
1
elif
adjacent
==
2
:
ans
[
0
]
-=
1
elif
adjacent
==
3
:
ans
[
1
]
-=
1
elif
adjacent
==
4
:
ans
[
0
]
+=
1
ans
[
0
]
=
0
if
ans
[
0
]
<
0
else
ans
[
0
]
ans
[
0
]
=
4
if
ans
[
0
]
>
4
else
ans
[
0
]
ans
[
1
]
=
0
if
ans
[
1
]
<
0
else
ans
[
1
]
ans
[
1
]
=
4
if
ans
[
1
]
>
4
else
ans
[
1
]
return
tuple
(
ans
)
# 迭代函数
def
fx
(
x
)
:
y
=
np
.
zeros
(
[
5
,
5
]
)
for
m
in
range
(
5
)
:
# 行
for
n
in
range
(
5
)
:
# 列
adjacent
=
Find_Adjacent
(
(
m
,
n
)
,
strategy
[
m
,
n
]
)
actionValue
=
gamma
*
x
[
adjacent
]
if
adjacent
in
MAZE_TRAP
:
actionValue
+=
-
10
elif
adjacent
==
MAZE_TERM
:
actionValue
+=
1
y
[
m
,
n
]
=
actionValue
return
y
# 对每个格子进行策略改善
# grid: 当前格子
# value: 当前策略下的价值函数矩阵
# return: 当前格子的新策略
def
Policy_Imporvement
(
grid
:
tuple
,
value
)
:
actionValues
=
[
]
for
m
in
range
(
5
)
:
# 5个策略
adjacent
=
Find_Adjacent
(
grid
,
m
)
actionValue
=
gamma
*
value
[
adjacent
]
if
adjacent
in
MAZE_TRAP
:
actionValue
+=
-
10
elif
adjacent
==
MAZE_TERM
:
actionValue
+=
1
actionValues
.
append
(
actionValue
)
return
Argmax_Rand
(
actionValues
)
# 主函数
vold
=
np
.
zeros
(
[
5
,
5
]
)
cntPolicyIter
=
0
cntValueIters
=
[
]
while
1
:
# 策略评估(policy evaluation, PE)
cntValueIter
=
0
while
1
:
vnew
=
fx
(
vold
)
err
=
sum
(
sum
(
vnew
-
vold
)
)
**
2
if
err
<
1e-6
:
# 状态价值函数收敛时退出
break
vold
=
vnew
cntValueIter
+=
1
# 策略评估的迭代步数
# 策略改善(policy improvement, PI)
strategyOld
=
strategy
.
copy
(
)
for
m
in
range
(
5
)
:
# 行
for
n
in
range
(
5
)
:
# 列
strategy
[
m
,
n
]
=
Policy_Imporvement
(
(
m
,
n
)
,
vnew
)
# 更新策略
err
=
sum
(
sum
(
strategyOld
-
strategy
)
)
**
2
if
err
<
1e-6
:
# 策略收敛时退出
break
cntPolicyIter
+=
1
cntValueIters
.
append
(
cntValueIter
)
print
(
cntPolicyIter
)
print
(
cntValueIters
)
安静的牛肉面 · Git常用命令记录 - 金色旭光 - 博客园 1 年前 |