强化学习实践(一):Model Based 环境准备

2024-09-02 23:44

本文主要是介绍强化学习实践(一):Model Based 环境准备,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

强化学习实践(一):Model Based 环境准备

  • 代码
  • 项目地址

代码

这里是Model Based的环境构建,原型是赵老师课上的Grid World

import numpy as npfrom typing import Tuple
from environment.utils import Utils
from environment.enums import RewardType
from environment.enums import TrajItemsclass Env:# 动作: 不动, 上, 下, 左, 右actions = [[0, 0], [-1, 0], [1, 0], [0, -1], [0, 1]]action_mapper = np.array([np.array(action) for action in actions])def __init__(self, size: int = 5, forbid: list = None, target_state: list = None, start_state: list = None):"""环境动作,状态,奖励,环境模型:param size: 地图大小"""self.size = size# 初始状态与目标状态self.start_state = start_stateself.target_state = target_state# 禁止区域self.forbid = forbid# 动作空间self.action_space_size = len(self.actions)self.action_space = np.arange(self.action_space_size)# 状态空间: 每个格子, 左到右, 上到下拉成一维的self.state_space_size = self.size * self.sizeself.state_space = np.arange(self.state_space_size)# 奖励设定: 禁止区域扣10分,到达终点0分, 走路-1但因为gamma的存在, 路径越长, 奖励越低self.reward_space = np.array([-1, 0, -10, -10])self.reward_space_size = 4# 环境模型: 任意的s跟a对应的p(r|s,a)与p(s'|s,a)self.rewards_model = Noneself.states_model = Noneself.init_model()# 轨迹空间大小self.trajectory_space_size = len(TrajItems.__members__)# 交互相关self.state = Noneself.done = Falseself.info = Nonedef init_model(self) -> None:"""初始化环境模型p(r|s,a) p(s''|s,a):return: None"""states_model_shape = (self.state_space_size, self.action_space_size, self.state_space_size)rewards_model_shape = (self.state_space_size, self.action_space_size, self.reward_space_size)self.states_model = np.zeros(shape=states_model_shape, dtype=float)self.rewards_model = np.zeros(shape=rewards_model_shape, dtype=float)for state in self.state_space:for action in self.action_space:next_state_pos, inside = self.next_state_pos(state, action)if not inside:reward_type = RewardType.OUTSIDEelse:if Utils.arr_equal(next_state_pos, self.target_state):reward_type = RewardType.TARGETelif Utils.arr_contains(self.forbid, next_state_pos):reward_type = RewardType.FORBIDelse:reward_type = RewardType.NORMAL# 前状态state采取当前动作action转移到next_state的概率为1self.states_model[state, action, Utils.pos2index(*next_state_pos, self.size)] = 1# 当前状态state采取当前动作action获得该种奖励类型reward_type的概率为1self.rewards_model[state, action, reward_type.value] = 1def next_state_pos(self, state: int, action: int) -> Tuple[list, bool]:"""在当前状态根据动作获取下一个状态:param state: 当前状态:param action: 当前动作:return: 下一个状态(越界返回当前状态)的坐标; 执行当前动作后是否还在地图内"""pos = np.array(Utils.index2pos(state, self.size))next_pos = pos + self.action_mapper[action]inside = bool((0 <= next_pos[0] <= self.size - 1) and (0 <= next_pos[1] <= self.size - 1))next_state_pos = [*next_pos] if inside else [*pos]return next_state_pos, insidedef episode(self, policy: np.ndarray, state: int, action: int, steps: int) -> np.ndarray:"""根据当前策略从当前状态以及当前动作出发, 生成一个trajectory:param policy: 当前策略:param state: 当前状态:param action: 当前动作:param steps: 轨迹长度:return: 轨迹"""# 存的是state, action, reward, next_state, next_action --> sarsatrajectory = np.zeros(shape=(steps, self.trajectory_space_size), dtype=float)next_state, next_action = state, actionfor step in range(steps):state, action = next_state, next_action# 获取概率为1的奖励的具体值reward_type = np.where(self.rewards_model[state, action] == 1)reward = self.reward_space[reward_type].item()next_state_pos, _ = self.next_state_pos(state, action)next_state = Utils.pos2index(*next_state_pos, self.size)next_action = np.random.choice(self.action_space, p=policy[next_state])trajectory[step] = np.array([state, action, reward, next_state, next_action])return trajectorydef reset(self) -> int:self.done = Falseself.state = Utils.pos2index(*self.start_state, self.size)return self.statedef step(self, action: int) -> Tuple[int, float, bool]:"""这里的环境根据动作直接从环境模型中获取对应的奖励, 然后再计算下一个状态, 再判断是否结束:param action: 当前执行的动作:return: 下一个状态, 当前状态执行当前动作的即时奖励, 是否到达目标格子(是否终止)"""reward_type = np.where(self.rewards_model[self.state, action] == 1)reward = self.reward_space[reward_type].item()next_state_pos, _ = self.next_state_pos(self.state, action)next_state = Utils.pos2index(*next_state_pos, self.size)self.state = next_stateif self.state == Utils.pos2index(*self.target_state, self.size):self.done = Truereturn self.state, reward, self.done

项目地址

RL_Algorithms(正在逐步更新多智能体的算法,STAR HOPE(^ - ^)

这篇关于强化学习实践(一):Model Based 环境准备的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131415

相关文章

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

springboot依靠security实现digest认证的实践

《springboot依靠security实现digest认证的实践》HTTP摘要认证通过加密参数(如nonce、response)验证身份,避免明文传输,但存在密码存储风险,相比基本认证更安全,却因... 目录概述参数Demopom.XML依赖Digest1Application.JavaMyPasswo

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

Java 结构化并发Structured Concurrency实践举例

《Java结构化并发StructuredConcurrency实践举例》Java21结构化并发通过作用域和任务句柄统一管理并发生命周期,解决线程泄漏与任务追踪问题,提升代码安全性和可观测性,其核心... 目录一、结构化并发的核心概念与设计目标二、结构化并发的核心组件(一)作用域(Scopes)(二)任务句柄

Java中的Schema校验技术与实践示例详解

《Java中的Schema校验技术与实践示例详解》本主题详细介绍了在Java环境下进行XMLSchema和JSONSchema校验的方法,包括使用JAXP、JAXB以及专门的JSON校验库等技术,本文... 目录1. XML和jsON的Schema校验概念1.1 XML和JSON校验的必要性1.2 Sche

SpringBoot集成WebService(wsdl)实践

《SpringBoot集成WebService(wsdl)实践》文章介绍了SpringBoot项目中通过缓存IWebService接口实现类的泛型入参类型,减少反射调用提升性能的实现方案,包含依赖配置... 目录pom.XML创建入口ApplicationContextUtils.JavaJacksonUt

MyCat分库分表的项目实践

《MyCat分库分表的项目实践》分库分表解决大数据量和高并发性能瓶颈,MyCat作为中间件支持分片、读写分离与事务处理,本文就来介绍一下MyCat分库分表的实践,感兴趣的可以了解一下... 目录一、为什么要分库分表?二、分库分表的常见方案三、MyCat简介四、MyCat分库分表深度解析1. 架构原理2. 分