强化学习之价值迭代算法动态规划求解悬崖漫步环境(CliffWalking)最优策略及最优状态价值函数
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 ValueIteration:""" 价值迭代算法 """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=[None for i in range(self.env.ncol*self.env.nrow)]def value_iteration(self):count=0while 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(Qsa)new_v[s]=max(Qsa_list)max_diff=max(max_diff,abs(new_v[s]-self.v[s]))self.v=new_vif max_diff<self.theta:breakcount+=1print("价值迭代进行%d轮后完成"%count)self.getpolicy()def getpolicy(self):#价值迭代完成后,根据价值函数导出一个贪婪策略for s in range(self.env.ncol*self.env.nrow):Qsa_list=[]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(Qsa)max_Qsa=max(Qsa_list)count_max_Qsa=Qsa_list.count(max_Qsa)self.pi[s]=[1/count_max_Qsa if p==max_Qsa else 0 for p in Qsa_list]
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()
theta=0.001
gamma=0.9
action_meaning=['↑','↓','←','→']
agent=ValueIteration(env,theta,gamma)
agent.value_iteration()
print_agent(agent,action_meaning,list(range(37,47)),[47])
""" 解决同样的训练问题,价值迭代总共进行了数十轮,而策略迭代中策略评估总共进行了数百轮,价值迭代中的循环次数远少于策略迭代。 """
相关文章:
强化学习之价值迭代算法动态规划求解悬崖漫步环境(CliffWalking)最优策略及最优状态价值函数
class CliffWalkingEnv:def __init__(self,ncol12,nrow4):self.ncolncol#定义网格世界的列self.nrownrow#定义网格世界的行self.Pself.createP()#转移矩阵P[state][action][(p,next_state,reward,done)]包含下一个状态和奖励def createP(self):P[[[]for i in range(4)]for j in…...
javascript deriveKey和deriveBits()由主密钥派生出新的密钥进行加密
deriveKey 方法的完整示例,演示如何使用 HMAC 作为密钥派生函数(KDF)来从一个给定的秘密(如密码)派生出一个新的 AES 加密密钥。 //创建一个函数来生成随机盐function getRandomSalt(length){let arraynew Uint8Array…...

基于微信小程序的自习室选座系统/基于Java的自习室选座系统/自习室管理系统的设计与实现
获取源码联系方式请查看文章结尾🍅 摘要 自习室选座是学校针对用户必不可少的一个部分。在学校的整个过程中,学生担负着最重要的角色。为满足如今日益复杂的管理需求,各类微信小程序自习室选座也在不断改进。本课题所设计的小程序自习室选座系…...

echarts所遇到的问题,个人记录
TreeMap 矩形树图,label设置富文本之后,无法垂直居中 font-size 支持rem,其余不支持 font-size 支持 rem,但是其余的属性如height,width等不支持 echarts-for-react 绑定事件,会覆盖实例上绑定的 当给cha…...

Skyeye云智能制造企业版源代码全部开放
智能制造一体化管理系统 [SpringBoot2 - 快速开发平台],适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…...

Springboot 整合Elasticsearch
1 java操作ES方式 1.1 操作ES 9300端口(TCP) 但开发中不在9300进行操作 ES集群节点通信使用的也是9300端口如果通过9300操作ES,需要与ES建立长连接 可通过引入spring-data-elasticsearch:transport-api.jar不在9300操作原因:1.springboot版本不同&…...

WeNet环境配置与aishell模型训练
WeNet环境配置与aishell模型训练 1环境配置 踩坑记录: 系统使用win11,我根据wenet官方文档,使用conda虚拟环境安装了cuda12.1,安装wenet依赖库,其中deepspeed报错,根据报错信息查询github,发现…...

【C++的剃刀】我不允许你还不会AVL树
学习编程就得循环渐进,扎实基础,勿在浮沙筑高台 循环渐进Forward-CSDN博客 Hello,这里是kiki,今天继续更新C部分,我们继续来扩充我们的知识面,我希望能努力把抽象繁多的知识讲的生动又通俗易懂,今天要…...

React搭建Vite项目及各种项目配置
1. 创建Vite项目 在操作系统的命令终端,输入以下命令: yarn create vite 输入完成以后输入项目名称、选择开发框架,选择开发语言,如下图所示,即可完成项目创建。 注意事项: 1. Node版本必须符合要求&…...
Linux Vim教程:多文件编辑与窗口管理
目录 1. 多文件编辑基础 1.1 缓冲区管理 1.2 标签页管理 1.3 分屏管理 2. 多文件编辑的高级技巧 2.1 同时编辑多个文件 2.2 使用会话 2.3 使用寄存器 3. 窗口管理的实用技巧 3.1 窗口调整 3.2 窗口排列 3.3 快速切换 4. 使用插件增强多文件编辑与窗口管理 4.1 NE…...

C语言进阶 11.结构体
C语言进阶 11.结构体 文章目录 C语言进阶 11.结构体11.1. 枚举11.2. 结构类型11.3. 结构与函数11.4. 结构中的结构11.5. 类型定义11.6. 联合11.7. PAT11-0. 平面向量加法(10)11-1. 通讯录的录入与显示(10) 11.1. 枚举 常量符号化: 用符号而不是具体的数字表示程序中的数字 cons…...

Vue--解决error:0308010C:digital envelope routines::unsupported
原文网址:Vue--解决error:0308010C:digital envelope routines::unsupported_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决node.js在运行Vue项目时的报错:error:0308010C:digital envelope routines::unsupported。 问题描述 使用node.js运行Vu…...

go-kratos 学习笔记(6) 数据库gorm使用
数据库是项目的核心,数据库的链接数据是data层的操作,选择了比较简单好用的gorm作为数据库的工具;之前是PHP开发,各种框架都是orm的操作;gorm还是很相似的,使用起来比较顺手 go-kratos官网的实例是ent&…...

记录:vite打包报错 error during build: Error: Parse error @:1:1
vant从3升级到4后,本地运行没问题, 但是打包就会报如下错误:error during build: Error: Parse error :1:1 一直以为是vant的问题,各种升级,替换插件,发现没什么用, 网上搜索了下,…...
Python 消费Kafka手动提交 批量存入Elasticsearch
一、第三方包选择 pip install kafka,对比了kafka和pykafka,还是选择kafka,消费速度更快pip install elasticsearch7.12.0(ES版本) 二、创建es连接对象 from elasticsearch import Elasticsearch from elasticsearch.helpers import bulkc…...
oracle 基础知识表的主键
一、表的约束条件 •约束条件是施加在表的字段上的一组限制条件,它使得只有符合限制条件要求的数据才能输入表。 •保证了表中的数据的正确性 i.约束条件包括了:非空和唯一和核对,即not null 和unique 和check null的含义:不确定 3个人去捡苹…...

opencascade AIS_MouseGesture AIS_MultipleConnectedInteractive源码学习
AIS_MouseGesture //! 鼠标手势 - 同一时刻只能激活一个。 enum AIS_MouseGesture { AIS_MouseGesture_NONE, //!< 无激活手势 // AIS_MouseGesture_SelectRectangle, //!< 矩形选择; //! 按下按钮开始,移动鼠标定义矩形&…...

Unity Apple Vision Pro 开发:如何把 PolySpatial 和 Play To Device 的版本从 1.2.3 升级为 1.3.1
XR 开发社区: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 📕教程说明 本教程将介绍如何把 Unity 的 PolySpatial 和 Play To Device 版本从 1.2.3 升级为 1.3.1。 📕Play To Device 软件升级 ht…...

大数据时代,区块链是如何助力数据开放共享的?
在大数据时代,区块链技术以其独特的优势,为数据开放共享提供了强有力的支持。以下是区块链助力数据开放共享的几个主要方面: 1. 增强数据安全性与隐私保护 加密安全:区块链技术采用先进的加密算法,如国密非对称加密技…...
睿抗2024省赛----RC-u4 章鱼图的判断
题目 对于无向图 G(V,E),我们将有且只有一个环的、大于 2 个顶点的无向连通图称之为章鱼图,因为其形状像是一个环(身体)带着若干个树(触手),故得名。 给定一个无向图,请你判断是不…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...