当前位置: 首页 > news >正文

【强化学习】SARAS代码实现

前言

SARAS,假设环境状态和动作状态都是离散的。利用动作价值矩阵来进行行为的预测。其主要就是利用时序差分的思想,对动作价值矩阵进行更新。

代码实现

import gymnasium as gym
import numpy as npclass sarsa():def __init__(self, states_n, action_n, greedy_e=0.1):self.Q = np.zeros((states_n, action_n)) #动作价值矩阵self.greedy_e = greedy_e #随机探索的概率self.states_n = states_n #环境状态个数self.action_n = action_n #行动状态个数self.gamma=0.9 #价值衰减值self.lr=0.1 #学习率def predict(self, states):action_list=self.Q[states]#先拿出对应的行#再取出对应价值最大的行为,如果有重复则在重复项中随机选取,返回索引action=np.random.choice(np.flatnonzero(action_list==action_list.max()))return actiondef act(self, states):'''由对应环境产生对应的行动@param states: 当前环境@return: 行动动作'''if np.random.uniform() < self.greedy_e:#是否采取随即探索action = np.random.choice(np.arange(self.action_n))#随机探索else:action = self.predict(states) # 根据行动价值矩阵进行预测return actiondef learning(self,state,action,reward,next_state,next_action,does):'''学习更新参数@param state: 环境状态@param action: 采取的行动@param reward: 回报@param next_state: 采取行动后的下一个环境状态@param next_action: 下一个环境状态对应的行为@param does: 游戏是否结束@return:'''current_q=self.Q[state,action] #取出对应的行动价值if does: #查看是否已经完成游戏,完成则直接将当前回报作为下一个行动价值next_q=rewardelse:# 计算当前回报和下一个环境状态和下一个行动对应的价值,加和next_q=reward+self.gamma*self.Q[next_state,next_action]self.Q[state,action]+=self.lr*(next_q-current_q) #时序差分,更新行动价值矩阵def train():env = gym.make("FrozenLake-v1", render_mode="human")#初始化游戏环境obs,info=env.reset()#重置位置agent=sarsa(env.observation_space.n,env.action_space.n)#初始化模型action = agent.act(obs)#预测行为num=0while True:num+=1# 由行为产生回报和下一个环境状态next_obs, reward, done, truncated, info = env.step(action)#预测下一个动作next_action=agent.act(obs)# 更新参数agent.learning(obs,action,reward,next_obs,next_action,done)obs=next_obsaction=next_action# 判断游戏是否结束或者中断,是则重置游戏if done or truncated:obs, info = env.reset()if num % 100 == 0 :env.close()if __name__ == '__main__':train()
http://www.lryc.cn/news/270533.html

相关文章:

  • P1019 [NOIP2000 提高组] 单词接龙 刷题笔记
  • 如何实现WinApp的UI自动化测试?
  • chrome扩展程序开发之在目标页面运行自己的JS
  • NLP项目之语种识别
  • Linux lpr命令教程:如何使用lpr命令打印文件(附案例详解和注意事项)
  • 浅谈C语言inline关键字
  • Flink1.17实战教程(第六篇:容错机制)
  • OpenCV实战 -- 维生素药片的检测记数
  • 【AI】注意力机制与深度学习模型
  • HTML5和JS实现新年礼花效果
  • 【owt-server】一些构建项目梳理
  • Linux shell编程学习笔记38:history命令
  • elasticsearch安装教程(超详细)
  • arkts中@Watch监听的使用
  • 【Jmeter】Jmeter基础9-BeanShell介绍
  • 详解数组的轮转
  • html 表格 笔记
  • 计算机网络【HTTP 面试题】
  • linux基于用户身份对资源访问进行控制的解析及过程
  • 手动创建idea SpringBoot 项目
  • 【Go语言入门:Go语言的数据结构】
  • QT designer的ui文件转py文件之后,实现pycharm中运行以方便修改逻辑,即添加实时模板框架
  • 什么是负载均衡?
  • Python和Java的优缺点
  • AES - 在tiny-AES-c基础上封装了2个应用函数(加密/解密)
  • 51和32单片机读取FSR薄膜压力传感器压力变化
  • 【maven】pom.xml 文件详解
  • SpringMVC源码解析——DispatcherServlet初始化
  • 搞定Apache Superset
  • 【每日试题】java面试之ssm框架