强化学习7——价值迭代算法在强化学习中的应用

news2024/11/13 16:18:19

价值迭代算法

价值迭代算法相对于策略迭代更加直接,它直接根据以下公式来迭代更新。
    V ∗ ( s ) = max ⁡ a ∈ A { r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V ∗ ( s ′ ) }    V^*(s)=\max_{a\in\mathcal{A}}\{r(s,a)+\gamma\sum_{s'\in\mathcal{S}}P(s'|s,a)V^*(s')\}    V(s)=aAmax{r(s,a)+γsSP(ss,a)V(s)} 
之后使用下面的公式找到最优策略即可。
π ( s ) = arg ⁡ max ⁡ a { r ( s , a ) + γ ∑ s ′ p ( s ′ ∣ s , a ) V k + 1 ( s ′ ) } \pi(s)=\arg\max_{a}\{r(s,a)+\gamma\sum_{s^{\prime}}p(s^{\prime}|s,a)V^{k+1}(s^{\prime})\} π(s)=argamax{r(s,a)+γsp(ss,a)Vk+1(s)}
image.png

策略迭代是更新完状态价值函数后,更新策略,之后再更新状态价值函数;而价值迭代,先不断迭代状态价值函数,一次性得到贪心最优策略。但是策略迭代过程中,是由V1直接到了V2,会跳过过程中的一些点,但是在价值迭代时候,需要从 V 1 → V 12 ′ → V 12 ′ ′ V_1 \to V_{12}' \to V_{12}'' V1V12V12′′ 这些点,比较费时间。

流程如下所示:

  • 随机初始化 V ( s ) V(s) V(s)
  • w h i l e Δ > θ d o : while \Delta > \theta do: whileΔ>θdo
    • Δ ← 0 \Delta \gets 0 Δ0
    • 对于每一个状态 s ∈ S s\in S sS:
      • v ← V ( s ) v\gets V(s) vV(s)
      • V ( s ) ← max ⁡ a r ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V ( s ′ ) V(s)\leftarrow\max_ar(s,a)+\gamma\sum_{s^{\prime}}P(s^{\prime}|s,a)V(s^{\prime}) V(s)maxar(s,a)+γsP(ss,a)V(s)
      • Δ ← m a x ( Δ , ∣ v − V ( s ) ∣ ) \Delta \gets max(\Delta , |v-V(s)|) Δmax(Δ,vV(s))
  • end while
  • 返回一个确定的策略 π ( s ) = arg ⁡ max ⁡ a { r ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V ( s ′ ) } \pi(s)=\arg\max_a\{r(s,a)+\gamma\sum_{s^{\prime}}P(s^{\prime}|s,a)V(s^{\prime})\} π(s)=argmaxa{r(s,a)+γsP(ss,a)V(s)}

价值迭代的代码如下所示:

class ValueIteration():
    def __init__(self,env,theta,gamma):
        self.env=env
        self.v=[0]*env.ncol*env.nrow # 初始化价值为0
        self.theta=theta
        self.gamma=gamma
        # 价值迭代结束后得到的策略
        self.pi=[None for i in range(self.env.ncol*self.env.nrow)]
        
    def valueIteration(self):
        cnt =0
        while 1:
            maxDiff=0
            newV=[0]*self.env.ncol*self.env.nrow
            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))
                    qsaList.append(qsa)
                newV[s]=max(qsaList)
                maxDiff=max(maxDiff,abs(newV[s]-self.v[s]))
            self.v=newV
            if maxDiff<self.theta: break
            cnt+=1
        print("价值迭代一共进行%d轮" % cnt)
        self.getPolicy()
        
    def getPolicy(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))
                qsaList.append(qsa)
            maxq=max(qsaList)
            cntq=qsaList.count(maxq)
            self.pi[s]=[1/cntq if q==maxq else 0 for q in qsaList]
            
env = CliffWalkingEnv()
action_meaning = ['^', 'v', '<', '>']
theta = 0.001
gamma = 0.9
agent = ValueIteration(env, theta, gamma)
agent.valueIteration()
价值迭代一共进行14轮
状态价值:
-7.712 -7.458 -7.176 -6.862 -6.513 -6.126 -5.695 -5.217 -4.686 -4.095 -3.439 -2.710
-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
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 **** **** **** **** **** **** **** **** **** **** EEEE

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树的深度和高度问题(算法村第八关白银挑战)

二叉树的最大深度 104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null…

爱奇艺的cmd5x签名校验算法及视频下载

点击上方↑↑↑蓝字[协议分析与还原]关注我们 “ js分析&#xff0c;分析爱奇艺的cmd5x校验值。” 最近来了个从web网页自动下载爱奇艺的视频内容的需求&#xff0c;本以为很简单&#xff0c;却发现里面还是有些门道的&#xff0c;需要解决里面的校验的问题&#xff0c;特记录。…

Unity C# 枚举多选

枚举多选 &#x1f96a;例子&#x1f354;判断 &#x1f96a;例子 [System.Flags]public enum TestEnum{ None 0,Rooms 1 << 1,Walls1<<2,Objects1<<3,Slabs 1 << 4,All Rooms|Walls|Objects|Slabs}&#x1f354;判断 TestEnum test TestEnum.R…

(一)看参考手册学stm32基于hal库,点灯时钟配置

&#xff08;一&#xff09;看参考手册学stm32基于hal库&#xff0c;点灯时钟配置 这篇文章主要是个人的学习经验&#xff0c;想分享出来供大家提供思路&#xff0c;如果其中有不足之处请批评指正哈。 废话不多说直接开始主题&#xff0c;本人是基于STM32F407VET6芯片&#xf…

解析电商直播发展现状:成都天府锋巢直播基地能做什么?

近日&#xff0c;电商巨浪席卷过后&#xff0c;千舟如何“再”过万重山&#xff0c;已成为无数电商从业者的一轮新课题。成都新兴直播基地——天府锋巢直播产业基地&#xff0c;正在致力于打造一个包含电商直播、娱乐直播、跨境直播等多种直播业态的全域直播基地。新一轮直播业…

80/20法则-扫盲和复习篇

80/20法则-扫盲和复习篇 一、80/20法则二、对于目标三、时间管理应用四、“二八定律”基本内容总结 一、80/20法则 “80/20法则”是20世纪初意大利统计学家、经济学家维尔弗雷多帕累托提出的&#xff0c;他指出&#xff1a;在任何特定群体中&#xff0c;重要的因子通常只占少数…

基于spark的个性化招聘推荐系统

介绍 本就业推荐系统是一个基于Spark框架的个性化推荐平台&#xff0c;使用Python Django框架、Vue和Element-Plus UI组件库构建而成。该系统通过Scrapy爬虫框架抓取招聘网站的职位数据&#xff0c;用户可以根据关键词查询符合条件的职位信息&#xff0c;同时还提供了基于协同…

线性渐变linear-gradient——线性渐变实现虚线斜线条纹

1.效果图 2.html <div class"box"><div class"address-edit"></div></div> 3.css <style>*{margin: 0;padding: 0;}.box{position: relative;width: 100vw;height: 300px;background-color: #fff;}.address-edit::before…

结构体(structure)的认识

前言——————希望现在在努力的各位都能感动以后享受成功的自己&#xff01; 今天我们来了解了解一下结构体&#xff0c;结构体又有什么奥妙呢&#xff0c;废话不多说&#xff0c;何为结构体呢&#xff1f;------->结构是⼀些值的集合&#xff0c;这些值称为成员变量。结…

leetcode:滑动窗口

目录 1.定长滑动窗口 1.1 几乎唯一子数组的最大和(使用map来计数) 1.2 长度为k子数组中的最大和 2.不定长滑动窗口 2.1 最多k个重复元素的最长子数组 2.2 绝对差不超过限制的最长连续子数组(multiset&#xff09; 2.3 将x减到0的最小操作数(正难则反 逆向思维) 2.4 统计…

分布式架构那些事儿

今天给大家搬运一波福利&#xff0c;那就是分布式架构那些事&#xff01;说到分布式架构&#xff0c;你是不是觉得高大上、遥不可及&#xff1f;别慌&#xff0c;我会讲得通俗易懂&#xff0c;让你秒变架构大神&#xff01;听完之后直接带回家装逼&#xff01;一起来Get新知识&…

< Linux >缓冲区

在上一篇文件的重定向&#xff0c;通常会涉及文件描述符的操控。文件描述符1&#xff08;fd 1&#xff09;通常代表着标准输出&#xff08;stdout&#xff09;&#xff0c;它默认是指向用户的终端或控制台。当执行文件重定向操作时&#xff0c;如果我们关闭文件描述符1&#xf…

SurfaceFlinger的commit/handleTransaction分析

整体背景介绍 hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01;本节我们来讲解一下SurfaceFlinger主要合成工作的第一个阶段任务commit 一般SurfaceFlinger端的合成工作主要有两个 1.commit 主要就是处理app端发起的一系列transaction的事务请求&#xff0c;需要对这…

Python笔记03-判断和循环

文章目录 比较运算符if-else语句while语句for循环循环中断 比较运算符 字面量True表示真&#xff0c;字面量False表示假 if-else语句 if语句判断条件的结果一定要是布尔类型 不要忘记判断条件后的&#xff1a; 归属于if语句的代码块&#xff0c;需在前方填充4个空格缩进 age…

Python武器库开发-武器库篇之C段扫描器开发(四十三)

Python武器库开发-武器库篇之C段扫描器开发(四十三) 在我们进行渗透过程中的信息收集的步骤时&#xff0c;收集资产目标的C段也是非常重要的一部分。 C段是指互联网中的一类IP地址。IP地址是互联网上每台设备的唯一标识符。IP地址由一系列数字组成&#xff0c;通常以点分十进…

性能分析与调优: Linux 实现 CPU剖析与火焰图

目录 一、实验 1.环境 2.CPU 剖析 3.CPU火焰图 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测GUIgrafana192.168.204.19agent 监测 主机 node_exporter192…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -全局异常统一处理实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

基于ssm的孩童收养信息管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本孩童收养信息管理就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

Python库中关于时间的常见操作

目录 导入所需的库 获取当前时间 格式化日期和时间 解析日期和时间字符串 时间戳操作 获取当前时间戳&#xff1a; 将时间戳转换为日期和时间&#xff1a; 时间差操作 时间日期的时区处理 时间日期的随机生成 注意事项 总结 在Python中&#xff0c;时间处理是一个重…

ppTinyPose的C++部署(jetson)

文章目录 环境准备硬件软件修改代码编译和运行运行结果参考环境准备 硬件 Jetson AGX Orin 64GB 软件 gcc/g++ >= 5.4(推荐8.2)cmake >= 3.10.0jetpack >= 4.6.1如果需要集成Paddle Inference后端,在Paddle Inference预编译库页面根据开发环境选择对应的Jetpack C…