强化学习算法之策略迭代动态规划算法——以悬崖漫步环境(CliffWalking)为例

import copy
class CliffWalkingEnv:def __init__(self,ncol=12,nrow=4):self.ncol=ncol#定义网格世界的列self.nrow=nrow#定义网格世界的行self.P=self.createP()#转移矩阵P[state][action]=[(p,next_state,reward,done)]包含下一个状态和奖励def createP(self):P=[[[]for i in range(4)]for j in range(self.ncol*self.nrow)]#初始化change=[[0,-1],[0,1],[-1,0],[1,0]]#4种动作,change[0]:上;change[0]:上;change[0]:上;change[0]:上。[列变化,行变化];坐标系原点(0,0)for i in range(self.nrow):for j in range(self.ncol):for a in range(len(change)):if i==self.nrow-1 and j>0:#如果在悬崖或者目标状态,任何动作奖励都为0P[i*self.ncol+j][a]=[(1,i*self.ncol+j,0,True)]continuenext_x=min(self.ncol-1,max(0,j+change[a][0]))next_y=min(self.nrow-1,max(0,i+change[a][1]))next_state=next_y*self.ncol+next_xreward=-1done=Falseif next_y==self.ncol-1 and next_x>0:#如果下一个位置在悬崖或者终点,done=Truedone=Trueif next_x==self.ncol:#如果在悬崖,奖励为-100reward=-100P[i*self.ncol+j][a]=[(1,next_state,reward,done)]return P
class PolicyIteration:""" 策略迭代算法 """def __init__(self,env,theta,gamma):self.env=envself.theta=theta#策略评估收敛阈值self.gamma=gamma#折扣因子self.v=[0]*(self.env.ncol*self.env.nrow)#初始化价值为0self.pi=[[0.25,0.25,0.25,0.25]for i in range(self.env.ncol*self.env.nrow)]def policy_evaluation(self):count=1while 1:max_diff=0new_v=[0]*self.env.ncol*self.env.nrowfor s in range(self.env.ncol*self.env.nrow):Qsa_list=[]#开始计算状态s下面的所有Q(s,a)价值for a in range(4):Qsa=0for res in self.env.P[s][a]:p,next_state,reward,done=resQsa+=p*(reward+self.gamma*self.v[next_state]*(1-done))#本环境特殊,奖励和下一个状态有关,所以需要和状态转移概率相乘Qsa_list.append(self.pi[s][a]*Qsa)new_v[s]=sum(Qsa_list)#状态价值函数与动作价值函数之间的关系max_diff=max(max_diff,abs(new_v[s]-self.v[s]))self.v=new_vif max_diff<self.theta:break#满足收敛条件,退出评估迭代count+=1print("策略评估进行%d轮后完成"%count)def policy_improvement(self):#策略提升for s in range(self.env.ncol*self.env.nrow):Qsa_list=[]for a in range(4):Qsa=0 for res in self.env.P[s][a]:p,next_state,reward,done=resQsa+=p*(reward+self.gamma*self.v[next_state]*(1-done))Qsa_list.append(Qsa)max_Qsa=max(Qsa_list)count_max_Qsa=Qsa_list.count(max_Qsa)#计算有几个动作得到最大的Q值self.pi[s]=[1/count_max_Qsa if p==max_Qsa else 0 for p in Qsa_list]#让这些动作均分概率print("策略提升完成")return self.pidef policy_iteration(self):#策略迭代while 1:self.policy_evaluation()old_pi=self.pi.copy()#将列表进行深拷贝,方便接下来进行比较new_pi=self.policy_improvement()if new_pi==old_pi:break
#打印策略函数,打印当前策略在每一个状态下的价值以及智能体会采取的动作。对于打印出来的动作,用o↓o→表示等概率采取向上和向右两种动作,ooo→表示在当前状态下仅仅采取向右动作。
def print_agent(agent,action_meaning,disater=[],end=[]):print("状态价值:")for i in range(agent.env.nrow):for j in range(agent.env.ncol):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 disater: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=['↑','↓','←','→']
theta=0.001
gamma=0.9
agent=PolicyIteration(env,theta,gamma)
agent.policy_iteration()
print_agent(agent,action_meaning,list(range(37,47)),[47])
""" 经过5次策略评估和策略提升后,策略收敛了,用贝尔曼最优方程检验每一个状态价值,发现最终输出策略确为最优策略。"""

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

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

相关文章

[C#面对对象] 之抽象方法 虚方法 接口

1.虚方法 我的理解 "法国的“巴黎公社”&#xff0c;俄国的“十月革命”&#xff0c;都是把主要战略方向首先夺取中心城市 " 设计为 一个父类中的虚方法(virtual),这个虚方法已经有实现了(就是通过暴力革命夺取的方法 最终返回 城市)然而秋收暴动(子类)失败…

linux安装hive

linux安装hive 安装Java&#xff1a;下载Hive&#xff1a;解压Hive&#xff1a;配置环境变量&#xff1a;初始化Hive&#xff1a;启动Hive&#xff1a; 在Linux上安装Hive需要几个步骤&#xff0c;包括安装Java、下载并解压Hive、配置环境变量等。以下是基于最常用的Hive版本&a…

什么是职场?如何在职场中提升自己的情商?

职场这一概念&#xff0c;实质上是指在工作场所中&#xff0c;员工与员工之间、员工与组织之间相互发生作用和影响的一个特定环境。它不仅仅局限于办公室&#xff0c;还延展到会议室、休息室、餐厅等场所&#xff0c;这些场所交织成了一个错综复杂的职场生态系统。在这个系统中…

哪里可以查找短视频素材?6个素材查找下载渠道分享!

在短视频的风靡浪潮中&#xff0c;不少创作者纷纷投身于这一领域&#xff0c;无论是分享生活点滴还是进行商业宣传&#xff0c;高质量的短视频内容总能吸引众多观众的目光。然而&#xff0c;精良的短视频制作离不开优质的素材支持。本文将为大家介绍6个优秀的高质量短视频素材下…

POJ2739.Sum of Consecutive Prime Numbers

欧拉筛处理2-1e4的质数&#xff0c;再用尺取法即可 // Problem: Sum of Consecutive Prime Numbers // Contest: POJ - Japan 2005 // URL: http://poj.org/problem?id2739 // Memory Limit: 65 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://cpeditor.or…

2024 Linux 运维面试题分享-2

1、shell编程常用哪些脚本   自动备份&#xff0c;lnmp一键安装&#xff0c;for循环&#xff0c;case语句&#xff0c;if判断&#xff0c;数据库自动备份脚本&#xff0c;日常日志切割&#xff0c;自动化安装lnmp,安装nginx&#xff0c;redis&#xff0c;tomcat&#xff0c;自…

docker查询容器与镜像,删除容器与镜像

sudo docker ps -a sudo docker stop id 停止容器 sudo docker-compose up -d 进入容器&#xff0c;启动容器 docker ps -a 查询所有容器 docker images 查询所有镜像 sudo docker rm 容器id 删除容器 sudo docke rmi 镜像id 删除镜像

[240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布

目录 Qt Creator 14 发布Qt Creator 14 版本发布&#xff0c;带来一系列新功能和改进终端用户可通过命令行方式查看此新闻终端用户可通过命令行方式安装软件&#xff1a; AMD 推迟 Ryzen 9000芯片发布 Qt Creator 14 发布 Qt Creator 14 版本发布&#xff0c;带来一系列新功能…

高速板开源项目学习(二)

一定要找一个高速板写的详细的等长规范&#xff1a; 看的出来&#xff0c;这位小哥也是卡着嘉立创最小免费钻孔大小来打孔的&#xff1a; 这里的天线&#xff0c;他做了禁止铺铜和走线处理&#xff0c;模拟信号在这里容易遇到干扰&#xff0c;这样是正确的&#xff0c;值得去学…

tensorflow数据相关总结----学习笔记(四)

标量 标量由只有一个元素的张量表示。 下面的代码将实例化两个标量&#xff0c;并执行一些熟悉的算术运算&#xff0c;即加法、乘法、除法和指数。 import tensorflow as tfx tf.constant(3.0) y tf.constant(2.0)print(x y) print(x * y) print(x / y) print(x ** y) &qu…

人事面试:

1&#xff1a;工资构成。 2&#xff1a;绩效考核标准 3&#xff1a;具体的福利待遇 十部贴 4&#xff1a;工资是前还是税后 5&#xff1a;一年 几 薪水 6&#xff1a;试用期的时间 和待遇 7&#xff1a;扣钱的标准 8&#xff1a;发工资的时间

《知识点扫盲 · 线程池基础篇》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

【Java】缓存与数据库:双写一致性、缓存问题

这里我讲的是缓存和数据库&#xff0c;以redis和mysql举例&#xff0c;实际上缓存包括不限于浏览器缓存、redis、memcache、本地缓存guava等等&#xff0c;数据库也有很多种&#xff0c;这里我们仅仅以较常见的redis和mysql举例。 一&#xff0c;缓存与数据库的查询、写入 1&…

【node】Linux下安装node和npm

Linux下安装node和npm 下面的版本虽然安装失败了&#xff0c;第一次尝试不容易&#xff0c;只需要更换一下node的版本为v16.20.2即可安装成功&#xff0c;20这样的高版本对大部分linux服务器来讲还是版本太高了&#xff0c;GLIBC动态库不支持&#xff0c;升级颇为麻烦&#xff…

她是军统美女特工,色诱汉奸一把好手!一件事之后竟......

一.前言 我们在上一篇里简单了解了什么是树&#xff0c;以及树的一种特殊结构——二叉树。而我们对二叉树息息相关的堆进行了简单的介绍。我们知道了堆是借助二叉树中完全二叉树来实现的。它实现了二叉树的顺序存储。但对于普通的二叉树来说&#xff0c;顺序存储会造成空间浪费…

贪心+背包

这道题比较坑的就是我们的对于相同截止时间的需要排个序&#xff0c;因为我们这个工作是有时间前后顺序的&#xff0c;我们如果不排序的话我们一些截止时间晚的工作就无法得到最优报酬 #include<bits/stdc.h> using namespace std;#define int long long int t; int n; c…

看板项目之vue代码分析

目录&#xff1a; Q1、vue项目怎么实现的输入localhost&#xff1a;8080就能自动跳到index页面Q2、组合饼状图如何实现Q3、vue项目如何实现环境的切换Q4、vue怎么实现vue里面去调用js文件里面的函数 Q1、vue项目怎么实现的输入localhost&#xff1a;8080就能自动跳到index页面 …

内部 API 与外部 API - 这重要吗?

内部和外部 API 的受众和用途有所不同。公司的内部利益相关者使用内部 API 作为其工作角色的一部分。目标是提高内部生产力和效率。外部 API 可以产生收入&#xff0c;将公司品牌打造为开源产品&#xff0c;或者改进 API。 本文讨论内部 API 和外部 API 之间的差异。 公共 AP…

数据结构——串

语言&#xff1a;C语言软件&#xff1a;Visual Studio 2022笔记书籍&#xff1a;数据结构——用C语言描述如有错误&#xff0c;感谢指正。若有侵权请联系博主 一、串的基本概念 子串&#xff1a;串中任意连续的字符组成的子序列称为该串的子串。 主串&#xff1a;包含子串的串称…

做一个能和你互动玩耍的智能机器人之三

内容节选自英特尔的开源项目openbot的body目录下diy下的readme&#xff0c;这是一个组装和连线方式的说明文档&#xff0c;接线需要配合firmware固件使用&#xff0c;固件代码的接线柱是对应的。 body目录内部十分丰富&#xff0c;主要介绍了这个项目的背景和硬件以及如何让他…