提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
本人小白,做学习笔记用,不是教学,有不对的希望各位大佬指出。
提示:以下是本篇文章正文内容,下面案例可供参考
一、policy iteration是什么?
首先,policy iteration 分为两个步骤:(1).policy evaluation; (2)policy iteration
1.选取一个初始猜测Vπk,通过贝尔曼公式,得到收敛的Vπk
2.遍历每个qπk(s,a),选择最大的qπk,qπk就是动作价值函数
3.选取对应qπk最大的策略πk+1
4.将πk+1带回policy evaluation继续迭代
二、具体例子
上图是选取的例子,目标是将initial policy转变为optimal policy
根据之前的课知道求解贝尔曼公式有两种方法:1.直接矩阵求解(上图例子较为简单,可以直接求解出来:1式解方程,带入2式
2.通过迭代,取初始值双0,不停迭代,直至收敛
3.我对这部分的理解:(1)初始策略是从两个格子都向左出发,s1的策略碰壁,对应贝尔曼公式里的-1;s2的走到s1,对应贝尔曼公式里的0;
(2)这部分并没有进行策略迭代,只是求出了这两个策略的收敛值,所以叫做策略评价
刚才已经求出最优策略vπ0,带入上表1,可以求解出所有可能性的qπk(s,a)
,如表2可知,在s1的时候选取ar,也就是向右走,s2的时候选择原地不动。
原本需要继续带入π1(ar|s1)和π1(a0|s2)继续迭代
代码示例
代码如下(示例):
import numpy as np
from gridWorldGame import standard_grid, negative_grid,print_values, print_policy
SMALL_ENOUGH = 1e-3 # 第一步policy evalution 求出的Vπ要收敛
GAMMA = 0.9 # γ
ALL_POSSIBLE_ACTIONS = ('U', 'D', 'L', 'R')
grid = negative_grid() #negative 实际上就是创建一个standard_grid,然后将grid中所有无关量的初始值变为-1
policy = {}
for s in grid.actions.keys():
policy[s] = np.random.choice(ALL_POSSIBLE_ACTIONS) # 将所有可能的actions对应赋值给每一行
V={} # 值的集合
states = grid.all_states()
for s in states: # 遍历所有states,不包括(1,1)
if s in grid.actions: # 不包括(1,1),(0,3),(1,3)
V[s] = np.random.random() # 随机取值
else:
V[s] = 0
iteration = 0
while True:
iteration += 1
print("values %d: "% iteration)
print_values(V, grid)
print("policy %d: "% iteration)
print_policy(policy, grid)
while True: # policy_evaluation
biggest_change = 0
for s in states: # 不在states中的只有(1,1)
old_v = V[s]
if s in policy: # 有三个是没有policy的
a = policy[s] # 将policy赋值给a
grid.set_state(s) # s是一个(x,y),将x赋给i,将y赋给j
r = grid.move(a) # 按策略a移动
V[s] = r +GAMMA * V[grid.current_state()] # 来了,贝尔曼公式:r+γv
biggest_change = max(biggest_change, np.abs(old_v - V[s]))
if biggest_change < SMALL_ENOUGH: # 如果小于small,说明收敛了
break
is_policy_converged = True
for s in states:
if s in policy:
old_a = policy[s]
new_a = None
best_value = float("-inf") # best_value 是负无穷大
for a in ALL_POSSIBLE_ACTIONS: #就是求每个a的reward
grid.set_state(s) # 将s的横坐标和纵坐标赋值给i和j
r = grid.move(a) # 返回给r的是得到的reward
v = r + GAMMA * V[grid.current_state()] # V经过evaluation已经变化了
if v > best_value:
best_value = v
new_a = a
policy[s] = new_a
if new_a != old_a: # 直到new_a和old_a相同,跳出大循环
is_policy_converged = False
if is_policy_converged:
break
结果展示:
图片不知道为什么没显示全,主要看结果,我们从随机选取的value,policy,不停迭代,得到了一个非常优美的结果。
总结
摘录学习于西湖大学赵世珏教授的课程:https://www.bilibili.com/video/BV1sd4y167NS?p=16&vd_source=35775f5151031f11ee2a799855c8e368
如果赵教授要求删除笔记,我立刻删除。
以及github上的现成代码:https://github.com/omerbsezer/Reinforcement_learning_tutorial_with_demo