强化学习1--policy iteration

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

本人小白,做学习笔记用,不是教学,有不对的希望各位大佬指出。


提示:以下是本篇文章正文内容,下面案例可供参考

一、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rookiexxj01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值