强化学习实践(一):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

相关文章

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Pydantic中model_validator的实现

《Pydantic中model_validator的实现》本文主要介绍了Pydantic中model_validator的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录引言基础知识创建 Pydantic 模型使用 model_validator 装饰器高级用法mo

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的