强化学习6——动态规划置策略迭代算法,以悬崖漫步环境为例

策略迭代算法

通过策略评估与策略提升不断循环交替,得到最优策略。

策略评估

固定策略 π \pi π 不变,估计状态价值函数V

一个策略的状态价值函数,在马尔可夫决策过程中提到过:
V π ( s ) = ∑ a ∈ A π ( a ∣ s ) ( r ( s , a ) + γ ∑ s ′ ∈ S p ( s ′ ∣ s , a ) V π ( s ′ ) ) V^{\pi}(s)=\sum_{a\in A}\pi(a|s)\left(r(s,a)+\gamma\sum_{s'\in S}p(s'|s,a)V^{\pi}(s')\right) Vπ(s)=aAπ(as)(r(s,a)+γsSp(ss,a)Vπ(s))
π ( a ∣ s ) \pi(a|s) π(as) 是在状态 s s s 下采取动作 a a a 的概率。在知道奖励函数和状态转移函数后,可以用下一个状态的价值来计算当前状态的价值,更一般的,考虑所有的状态,就变成了用上一轮的状态价值函数来计算当前这一轮的状态价值函数。
V k + 1 ( s ) = ∑ a ∈ A π ( a ∣ s ) ( r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V k ( s ′ ) ) V^{k+1}(s)=\sum_{a\in A}\pi(a|s)\left(r(s,a)+\gamma\sum_{s'\in S}P(s'|s,a)V^k(s')\right) Vk+1(s)=aAπ(as)(r(s,a)+γsSP(ss,a)Vk(s))
可以选取初始值 V 0 V^0 V0 ,当 V k = V π V^k=V^\pi Vk=Vπ 时,停止更新,若 k → ∞ k\to \infty k V k V^k Vk 会收敛到 V π V^{\pi} Vπ ,若 max ⁡ s ∈ S ∣ V k + 1 ( s ) − V k ( s ) ∣ \max_{s\in\mathcal{S}}|V^{k+1}(s)-V^{k}(s)| maxsSVk+1(s)Vk(s) 非常小,则也可以认为完成收敛。

策略提升

根据估计好的状态价值函数V结合策略推算出动作价值函数Q,并对 Q 函数优化然后进一步改进策略

假设确定存在一个确定性策略 π ′ \pi ' π ,在任意一个状态下,都满足:
Q π ( s , π ′ ( s ) ) ≥ V π ( s ) Q^{\pi}(s,\pi'(s))\geq V^{\pi}(s) Qπ(s,π(s))Vπ(s)
V π ( s ) ≤ Q π ( s , π ′ ( s ) ) = E π ′ [ R t + γ V π ( S t + 1 ) ∣ S t = s ] ≤ E π ′ [ R t + γ Q π ( S t + 1 , π ′ ( S t + 1 ) ) ∣ S t = s ] = E π ′ [ R t + γ R t + 1 + γ 2 V π ( S t + 2 ) ∣ S t = s ] ≤ E π ′ [ R t + γ R t + 1 + γ 2 R t + 2 + γ 3 V π ( S t + 3 ) ∣ S t = s ] ≤ E π ′ [ R t + γ R t + 1 + γ 2 R t + 2 + γ 3 R t + 3 + ⋯ ∣ S t = s ] = V π ′ ( s ) \begin{aligned} V^{\pi}(s)& \leq Q^{\pi}(s,\pi^{\prime}(s)) \\ &=\mathbb{E}_{\pi^{\prime}}[R_t+\gamma V^{\pi}(S_{t+1})|S_t=s] \\ &\leq\mathbb{E}_{\pi^{\prime}}[R_t+\gamma Q^{\pi}(S_{t+1},\pi^{\prime}(S_{t+1}))|S_t=s] \\ &=\mathbb{E}_{\pi^{\prime}}[R_t+\gamma R_{t+1}+\gamma^2V^\pi(S_{t+2})|S_t=s] \\ &\leq\mathbb{E}_{\pi^{\prime}}[R_t+\gamma R_{t+1}+\gamma^2R_{t+2}+\gamma^3V^\pi(S_{t+3})|S_t=s] \\ &\leq\mathbb{E}_{\pi^{\prime}}[R_t+\gamma R_{t+1}+\gamma^2R_{t+2}+\gamma^3R_{t+3}+\cdots|S_t=s] \\ &=V^{\pi^{\prime}}(s) \end{aligned} Vπ(s)Qπ(s,π(s))=Eπ[Rt+γVπ(St+1)St=s]Eπ[Rt+γQπ(St+1,π(St+1))St=s]=Eπ[Rt+γRt+1+γ2Vπ(St+2)St=s]Eπ[Rt+γRt+1+γ2Rt+2+γ3Vπ(St+3)St=s]Eπ[Rt+γRt+1+γ2Rt+2+γ3Rt+3+St=s]=Vπ(s)
通过选取动作从而得到新的策略的过程称为策略提升,当 π ′ \pi ' π π \pi π 一样好时,可以证明策略迭代达到了收敛:
π ′ ( s ) = arg ⁡ max ⁡ a Q π ( s , a ) = arg ⁡ max ⁡ a { r ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V π ( s ′ ) } \pi'(s)=\arg\max_aQ^\pi(s,a)=\arg\max_a\{r(s,a)+\gamma\sum_{s'}P(s'|s,a)V^\pi(s')\} π(s)=argamaxQπ(s,a)=argamax{r(s,a)+γsP(ss,a)Vπ(s)}
image.png

策略迭代算法的实现

  • 随机初始化策略 π ( s ) \pi(s) π(s)与价值函数 V ( s ) V(s) V(s)
  • while Δ > θ \Delta >\theta Δ>θ do:(状态评估)
    • Δ ← 0 \Delta \gets 0 Δ0
    • 对于每个状态 s ∈ S s \in S sS :
      • v ← V ( S ) v \gets V(S) vV(S)
      • V ( s ) ← r ( s , π ( s ) ) + γ ∑ s ′ P ( s ′ ∣ s , π ( s ) ) V ( s ′ ) V(s)\leftarrow r(s,\pi(s))+\gamma\sum_{s'}P(s'|s,\pi(s))V(s') V(s)r(s,π(s))+γsP(ss,π(s))V(s)
      • Δ ← m a x ( Δ , ∣ v ∗ V ( s ) ∣ ) \Delta \gets max(\Delta,|v*V(s)|) Δmax(Δ,vV(s))
  • end while
  • π o l d ← π \pi_{old} \gets \pi πoldπ
  • 对于每个状态 s ∈ S s \in S sS:
    • π ( s ) ← arg ⁡ max ⁡ a r ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V ( s ′ ) \pi(s)\leftarrow\arg\max_ar(s,a)+\gamma\sum_{s^{\prime}}P(s^{\prime}|s,a)V(s^{\prime}) π(s)argmaxar(s,a)+γsP(ss,a)V(s)
  • 如果 π o l d = π \pi_{old}=\pi πold=π,则停止算法并返回V和 π \pi π ,否则转到策略评估循环
class PolicyIteration:
    def __init__(self,env,theta,gamma):
        self.env=env
        # 初始化价值为0
        self.v=[0]*self.env.ncol*self.env.nrow
        # 初始化为均匀随机策略
        self.pi=[[0.25,0.25,0.25,0.25] for i in range(self.env.ncol*self.env.nrow)]
        self.theta=theta # 策略评估收敛阈值
        self.gamma=gamma # 折扣因子
    
    # 策略评估
    def policyEvaluation(self):
        cnt =1 #计数
        while 1:
            maxDiff=0
            newV=[0] * self.env.ncol * self.env.nrow
            for s in range(self.env.ncol*self.env.nrow):
                #计算每一个状态s下所有Q(s,a)之和的价值
                qsaList=[]
                # 有四个动作
                for a in range(4):
                    qsa=0
                    for transition in self.env.P[s][a]:
                        p,nextState,r,done=transition
                        qsa+=p*(r+self.gamma*self.v[nextState]*(1-done))
                    # 策略*Q(s,a)=对应的价值
                    # 本章环境比较特殊,奖励和下一个状态有关,所以需要和状态转移概率相乘
                    qsaList.append(self.pi[s][a]*qsa)
                # 求和后得到状态s的状态价值
                newV[s]=sum(qsaList)
                maxDiff=max(maxDiff,abs(newV[s]-self.v[s]))
            self.v=newV
            #满足收敛条件,退出评估迭代
            if maxDiff<self.theta:
                break
            cnt +=1
        print(f'policyEvaluation 次数为{cnt}')

    def policyImprovement(self):
        # 策略提升
        for s in range(self.env.ncol*self.env.nrow):
            qsaList=[]
            for a in range(4):
                qsa=0
                for transition in self.env.P[s][a]:
                    p,nextState,r,done=transition
                    qsa+=p*(r+self.gamma*self.v[nextState]*(1-done))
                # 策略*Q(s,a)=对应的价值
                qsaList.append(qsa)
            maxq=max(qsaList)
            cntq=qsaList.count(maxq)# 计算有几个动作得到了最大的Q值
            self.pi[s]=[1/cntq if q==maxq else 0 for q in qsaList]
        print('policyImprovement')
        return self.pi
    
    def policyIteration(self):   
        # 策略迭代
        while 1:
            self.policyEvaluation()
            oldPi=copy.deepcopy(self.pi)
            newPi=self.policyImprovement()
            if oldPi==newPi:
                break   

为了更好地展现最终的策略,接下来增加一个打印策略的函数,用于打印当前策略在每个状态下的价值以及智能体会采取的动作。对于打印出来的动作,我们用^o<o表示等概率采取向左和向上两种动作,ooo>表示在当前状态只采取向右动作。

def print_agent(agent, action_meaning, disaster=[], end=[]):
    print("状态价值:")
    for i in range(agent.env.nrow):
        for j in range(agent.env.ncol):
            # 为了输出美观,保持输出6个字符
            print('%6.6s' % ('%.3f' % agent.v[i * agent.env.ncol + j]), end=' ')
        print()

    print("策略:")
    for i in range(agent.env.nrow):
        for j in range(agent.env.ncol):
            # 一些特殊的状态,例如悬崖漫步中的悬崖
            if (i * agent.env.ncol + j) in disaster:
                print('****', end=' ')
            elif (i * agent.env.ncol + j) in end:  # 目标状态
                print('EEEE', end=' ')
            else:
                a = agent.pi[i * agent.env.ncol + j]
                pi_str = ''
                for k in range(len(action_meaning)):
                    pi_str += action_meaning[k] if a[k] > 0 else 'o'
                print(pi_str, end=' ')
        print()


env = CliffWalkingEnv()
action_meaning = ['^', 'v', '<', '>']
theta = 0.001
gamma = 0.9
agent = PolicyIteration(env, theta, gamma)
agent.policy_iteration()
print_agent(agent, action_meaning, list(range(37, 47)), [47])
策略评估进行51轮后完成
policyImprovement
策略评估进行78轮后完成
policyImprovement
策略评估进行39轮后完成
policyImprovement
策略评估进行11轮后完成
policyImprovement
策略评估进行1轮后完成
policyImprovement
状态价值:
-7.458 -7.176 -6.862 -6.513 -6.126 -5.695 -5.217 -4.686 -4.095 -3.439 -2.710 -1.900
-7.176 -6.862 -6.513 -6.126 -5.695 -5.217 -4.686 -4.095 -3.439 -2.710 -1.900 -1.000
-7.458  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
策略:
ovo> ovo> ovo> ovo> ovo> ovo> ovo> ovo> ovo> ovo> ovo> ovoo
ooo> ooo> ooo> ooo> ooo> ooo> ooo> ooo> ooo> ooo> ooo> ovoo
^ooo ^v<> ^v<> ^v<> ^v<> ^v<> ^v<> ^v<> ^v<> ^v<> ^v<> ^v<>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/302822.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三种解密 HTTPS 流量的方法介绍

Web 安全是一项系统工程&#xff0c;任何细微疏忽都可能导致整个安全堡垒土崩瓦解。拿 HTTPS 来说&#xff0c;它的「内容加密、数据完整性、身份认证」三大安全保证&#xff0c;也会受到非法根证书、服务端配置错误、SSL 库漏洞、私钥被盗等等风险的影响。很多同学认为只要访问…

2024最新腾讯云CVM服务器和轻量应用服务器有什么区别?

腾讯云轻量服务器和云服务器CVM该怎么选&#xff1f;不差钱选云服务器CVM&#xff0c;追求性价比选择轻量应用服务器&#xff0c;轻量真优惠呀&#xff0c;腾讯云服务器网txyfwq.com活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元…

游戏、设计选什么内存条?光威龙武系列DDR5量大管饱

如果你是一位PC玩家或者创作者&#xff0c;日常工作娱乐中&#xff0c;确实少不了大容量高频内存的支持&#xff0c;这样可以获得更高的工作效率&#xff0c;光威龙武系列DDR5内存条无疑是理想之选。它可以为计算机提供强劲的性能表现和稳定的运行体验&#xff0c;让我们畅玩游…

wblogic中间件配置数据源

配置数据源 1.服务-数据源-配置-新建 2.单机选一般数据源 3.选择源名称、jndi名称、数据库类型 4.选择驱动 5.下一步 6.输入连接串信息 参考&#xff1a; 格式二&#xff1a;jdbc:oracle:thin:<host>:<port>:<SID> 数据库名称配置的sid 7.测试配置&#xff…

4.5 A TILED MATRIX MULTIPLICATION KERNEL

我们现在准备展示一个tiled矩阵乘法内核&#xff0c;该内核使用共享内存来减少对全局内存的流量。图中4.16显示的内核。实施图4.15.中所示的阶段。在图4.16中&#xff0c;第1行和第2行声明Mds和Nds为共享内存变量。回想一下&#xff0c;共享内存变量的范围是一个块。因此&#…

Kubernetes (七) service(微服务)及Ingress-nginx

官网地址&#xff1a; 服务&#xff08;Service&#xff09; | Kuberneteshttps://v1-24.docs.kubernetes.io/zh-cn/docs/concepts/services-networking/service/ 一 . 网络通信原理 …

【Flet教程】使用Flet以Python创建TODO应用程序

Flet是基于Python实现的Flutter图形界面GUI。除了使用Python&#xff0c;具备美观、简洁、易用&#xff0c;还有Flutter本身的跨平台&#xff08;安卓、iOS、Win、Mac、Web&#xff09;、高性能、有后盾的特点。下面是0.18版官方TODO APP教程&#xff0c;为了准确&#xff0c;保…

java智慧医院互联网智慧3D导诊系统源码,经由智慧导诊系统多维度计算,准确推荐科室

什么是智慧导诊系统? 简单地说&#xff0c;智慧导诊系统是一种利用人工智能技术&#xff0c;为医生提供帮助的系统。它可以通过分析患者的症状和病史为医生提供疾病诊断和治疗方案的建议。 系统介绍&#xff1a; 医院智慧导诊系统是在医院中使用的引导患者自助就诊挂号&…

git ssh key 配置

一、Profile Settings-->SSH Keys 我们点击这里会有详情的文档介绍生成sshkey。 ssh-keygen -t rsa -b 2048 -C "邮箱" --回车... 将生成的id_rsa.pub粘贴到如下保存 git config --global user.name "用户名" git config --global user.email "邮…

数据分析基础之《pandas(1)—pandas介绍》

一、pandas介绍 1、2008年Wes McKinney&#xff08;韦斯麦金尼&#xff09;开发出的库 2、专门用于数据分析的开源python库 3、以numpy为基础&#xff0c;借力numpy模块在计算方面性能高的优势 4、基于matplotlib能够简便的画图 5、独特的数据结构 6、也是三个单词组合而…

基于Kettle开发的web版数据集成开源工具(data-integration)-应用篇

目录 &#x1f4da;第一章 基本流程梳理&#x1f4d7;页面基本操作&#x1f4d7;对应后台服务流程 &#x1f4da;第二章 二开思路&#x1f4d7;前端&#x1f4d7;后端&#x1f4d7;后续补充&#xff1a;[Kettle Local引擎源码使用记录](https://renxiaozhao.blog.csdn.net/arti…

【Spring】Spring的事务管理

前言&#xff1a; package com.aqiuo.service.impl;import com.aqiuo.dao.AccountMapper; import com.aqiuo.pojo.Account; import com.aqiuo.service.AccountService; import org.springframework.jdbc.core.JdbcTemplate;import java.sql.Connection; import java.sql.SQLEx…

【QML COOK】- 000-创建Project

1. 文件->New Project... 2. Application(Qt)->Qt Quick Application(compat) 3. 填好【名称】和【创建路径】 4. 选择CMake 5. 选择QT6.2 6. 直接【下一步】 7. 直接下一步 8. 直接下一步 9. 出现工程文件 10. 点击运行 11. 出现窗口

leetcode算法题之递归--深度优先搜索总结

文章目录 1.全排列2.子集 1.全排列 全排列 class Solution {vector<vector<int>> ret;vector<int> path;bool check[7];//标记nums数组某个下标是否已访问&#xff0c;剪枝使用 public:vector<vector<int>> permute(vector<int>& n…

输入输出流、字符字节流、NIO

1、对输入输出流、字符字节流的学习&#xff0c;以之前做的批量下载功能为例 批量下载指的是&#xff0c;将多个文件打包到zip文件中&#xff0c;然后下载该zip文件。 1.1下载网络上的文件 代码参考如下&#xff1a; import java.io.*; import java.net.URL; import java.n…

2023三星齐发,博客之星、华为OD、Java学习星球

大家好&#xff0c;我是哪吒。 一、回顾2023 2023年&#xff0c;华为OD成了我的主旋律&#xff0c;一共发布了561篇文章&#xff0c;其中包含 368篇华为OD机试的文章&#xff1b;100篇Java基础的文章40多篇MongoDB、Redis的文章&#xff1b;30多篇数据库的文章&#xff1b;2…

创建第一个SpringMVC项目,入手必看!

文章目录 创建第一个SpringMVC项目&#xff0c;入手必看&#xff01;1、新建一个maven空项目&#xff0c;在pom.xml中设置打包为war之前&#xff0c;右击项目添加web框架2、如果点击右键没有添加框架或者右击进去后没有web框架&#xff0c;点击左上角file然后进入项目结构在模块…

MES系统精准把控生产全过程,按期交货不再难

当订单交期较短时且物料异常较大时物料会存在供应商交期困难&#xff0c;PMC在下PR单时需注明原因&#xff0c;同时要求采购紧急回复&#xff0c;PMC将最终交期知会相关部门。若为PMC漏单&#xff0c;则需注明情况并且作紧急物料处理确保订单正常出货。PMC每周需将紧急物料列出…

New!2024最新ChatGPT提示词开源项目:GPT Prompts Hub - 专注于深化对话质量和探索更复杂的对话结构

&#x1f31f; GPT Prompts Hub &#x1f31f; 欢迎来到 “GPT Prompts Hub” 存储库&#xff01;探索并分享高质量的 ChatGPT 提示词。培养创新性内容&#xff0c;提升对话体验&#xff0c;激发创造力。我们极力鼓励贡献独特的提示词。 在 “GPT Prompts Hub” 项目中&#…

LeetCode-58/709

1.最后一个单词的长度&#xff08;58&#xff09; 题目描述&#xff1a; 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 思路&…