强化学习gym的使用之Pendulum的训练
地址
该任务是杆起始位置随机,让它荡到顶头并保持。
首先测试环境
def run_test():env = gym.make('Pendulum-v0') action = [0]observation = env.reset() #状态 print(env.action_space)print(observation)actions = np.linspace(-2, 2, 10)for t in range(100): ## action[0] = random.uniform(-2,2) #力矩 -2到2 action[0] = 2observation, reward, done, info = env.step(action) print(action,reward,done)# print('observation:',observation)# print('theta:',env.state)env.render() time.sleep(1)env.close()
一些属性:
observation :cos(theta), sin(theta) , thetadot角速度
action_space: -2到2的连续值
reward:为-10到0的一个数 目标就是让reward尽量小
该任务与小车不同的地方在于它的action也是连续的,需要进行离散化
整体代码:
import numpy as np
import pandas as pd
import time
import gym
import csv
import os
import pickle
from queue import Queue
import pickle
import random
class QLearning:def __init__(self, learning_rate=0.1, reward_decay=0.99, e_greedy=0.8):#self.target # 目标状态(终点)self.lr = learning_rate # 学习率self.gamma = reward_decay # 回报衰减率self.epsilon = e_greedy # 探索/利用 贪婪系数self.num_cos = 10 #分为多少份self.num_sin = 10 self.num_dot = 10 self.num_actions = 10 self.actions = self.toBins(-2.0, 2.0, self.num_actions) # 可以选择的动作空间 离散化# q_table是一个二维数组 # 离散化后的状态共有num_pos*num_vel中可能的取值,每种状态会对应一个行动# q_table[s][a]就是当状态为s时作出行动a的有利程度评价值self.q_table = np.random.uniform(low=-1, high=1, size=(self.num_cos*self.num_sin*self.num_dot, self.num_actions)) # Q值表self.cos_bins = self.toBins(-1.0, 1.0, self.num_cos)self.sin_bins = self.toBins(-1.0, 1.0, self.num_sin)self.dot_bins = self.toBins(-8.0, 8.0, self.num_dot)# 根据本次的行动及其反馈(下一个时间步的状态),返回下一次的最佳行动def choose_action(self,state):# 假设epsilon=0.9,下面的操作就是有0.9的概率按Q值表选择最优的,有0.1的概率随机选择动作# 随机选动作的意义就是去探索那些可能存在的之前没有发现但是更好的方案/动作/路径if np.random.uniform() < self.epsilon:# 选择最佳动作(Q值最大的动作)action = np.argmax(self.q_table[state])else:# 随机选择一个动作action = np.random.choice(self.actions)action = -2 + 4/(self.num_actions-1) * action #从离散整数变为范围内值return action# 分箱处理函数,把[clip_min,clip_max]区间平均分为num段, 如[1,10]分为5.5 def toBins(self,clip_min, clip_max, num):return np.linspace(clip_min, clip_max, num + 1)[1:-1] #第一项到倒数第一项# 分别对各个连续特征值进行离散化 如[1,10]分为5.5 小于5.5取0 大于取5.5取1def digit(self,x, bin): n = np.digitize(x,bins = bin)return n# 将观测值observation离散化处理def digitize_state(self,observation):# 将矢量打散回4个连续特征值cart_sin, cart_cos , cart_dot = observation# 分别对各个连续特征值进行离散化(分箱处理)digitized = [self.digit(cart_sin,self.cos_bins),self.digit(cart_cos,self.sin_bins),self.digit(cart_dot,self.dot_bins),]# 将离散值再组合为一个离散值,作为最终结果return (digitized[1]*self.num_cos + digitized[0]) * self.num_dot + digitized[2]# 学习,主要是更新Q值def learn(self, state, action, r, next_state):action = self.digit(action,self.actions)next_action = np.argmax(self.q_table[next_state]) q_predict = self.q_table[state, action]q_target = r + self.gamma * self.q_table[next_state, next_action] # Q值的迭代更新公式self.q_table[state, action] += self.lr * (q_target - q_predict) # updatedef train():env = gym.make('Pendulum-v0') print(env.action_space)agent = QLearning()# with open(os.getcwd()+'/tmp/Pendulum.model', 'rb') as f:# agent = pickle.load(f)action = [0] #输入格式要求 要是数组for i in range(20000): #训练次数observation = env.reset() #状态 cos(theta), sin(theta) , thetadot角速度state = agent.digitize_state(observation) #状态标准化for t in range(100): #一次训练最大运行次数action[0] = agent.choose_action(state) #动作 -2到2observation, reward, done, info = env.step(action) next_state = agent.digitize_state(observation)if done:reward-=200 #对于一些直接导致最终失败的错误行动,其报酬值要减200if reward >= -1: #竖直时时reward接近0 -10到0reward+=40 #给大一点print('arrive')# print(action,reward,done,state,next_state)agent.learn(state,action[0],reward,next_state)state = next_stateif done: #done 重新加载环境 print("Episode finished after {} timesteps".format(t+1))break# env.render() # 更新并渲染画面print(agent.q_table)env.close()#保存 with open(os.getcwd()+'/tmp/Pendulum.model', 'wb') as f:pickle.dump(agent, f)def test():env = gym.make('Pendulum-v0') print(env.action_space)with open(os.getcwd()+'/tmp/Pendulum.model', 'rb') as f:agent = pickle.load(f)agent.epsilon = 1 #测试时取1 每次选最优结果observation = env.reset() #state = agent.digitize_state(observation) #状态标准化action = [0] #输入格式要求 要是数组for t in range(200): #一次训练最大运行次数action[0] = agent.choose_action(state) #observation, reward, done, info = env.step(action) next_state = agent.digitize_state(observation)print(action,reward,done,state,next_state)print(observation)if reward >= -1: #竖直时时reward接近0 -10到0print('arrive')agent.learn(state,action[0],reward,next_state)state = next_stateenv.render() # 更新并渲染画面time.sleep(0.02)env.close()def run_test():env = gym.make('Pendulum-v0') action = [0]observation = env.reset() #状态 print(env.action_space)print(observation)actions = np.linspace(-2, 2, 10)for t in range(100): ## action[0] = random.uniform(-2,2) #力矩 -2到2 action[0] = 2observation, reward, done, info = env.step(action) print(action,reward,done)# print('observation:',observation)# print('theta:',env.state)env.render() time.sleep(1)env.close()if __name__ == '__main__':train()test()# run_test()
训练完成测试结果,成功的如上所示。
但是其实几乎有一半的可能性无法保持竖直状态,感觉与起始状态有关,训练的可能还不够充分 。
强化学习gym的使用之Pendulum的训练相关推荐
- 强化学习gym的使用之mountaincar的训练
gym地址 该任务是让小车跑到右侧的山顶,但是小车力不够它直接冲上去,需要让它左右荡到山顶. 在它的源文件中可以找到相关信息: Observation:Type: Box(2)Num Observat ...
- Ubuntu16.04 搭建mujoco环境+强化学习gym
(2022)Ubuntu16.04 搭建mujoco环境+强化学习gym 前言 一.Ubuntu16.04系统安装 二.mujoco安装 1.安装教程 2.程序验证 三.mujoco-py 安装 1. ...
- 强化学习Gym Atari报错缺少ale_c.dll
强化学习Gym Atari报错缺少ale_c.dll 问题: 一般在Windows10(及以上)系统中使用Anaconda配置强化学习的Gym环境时,如使用Breakout训练场,需要安装以下工具包 ...
- RL之Q Learning:利用强化学习之Q Learning实现走迷宫—训练智能体走到迷宫(复杂迷宫)的宝藏位置
RL之Q Learning:利用强化学习之Q Learning实现走迷宫-训练智能体走到迷宫(复杂迷宫)的宝藏位置 目录 输出结果 设计思路 实现代码 测试记录全过程 输出结果 设计思路 实现代码 f ...
- RL之Q Learning:利用强化学习之Q Learning实现走迷宫—训练智能体走到迷宫(简单迷宫)的宝藏位置
RL之Q Learning:利用强化学习之Q Learning实现走迷宫-训练智能体走到迷宫(简单迷宫)的宝藏位置 目录 输出结果 设计思路 实现代码 测试记录全过程 输出结果 设计思路 实现代码 f ...
- 安装gym库_强化学习Gym库学习实践(一)
最近看了一篇研究方向相关的文章,介绍了一种DQN的应用,感觉还挺新鲜的.想着把这篇文章复现出来,就开始学习强化学习的相关知识,作为一名小白,这一路走的可是真的十分艰难(我太菜了啊!) 看了莫烦Pyth ...
- 天下苦深度强化学习久矣,这有一份训练与调参技巧手册
©作者 | 申岳 单位 | 北京邮电大学 研究方向 | 机器人学习 天下苦 RL 久矣,其中最苦的地方莫过于训练和调参了,人人欲"调"之而后快. 在此为 RL 社区贡献一点绵薄之力 ...
- 强化学习gym库中的Pendulum-v1/CartPole-v1游戏介绍
文章目录 前言 CartPole-v1 游戏结束 state action和reward Pendulum-v1 通用操作 前言 gym官网:http://gym.openai.com/envs/#c ...
- 强化学习 —— gym
0. gym 下的数据结构 Discrete: gym.spaces.discrete.Discrete env.action_sample 的返回值就是 Discrete 类型 Discrete(n ...
最新文章
- 安卓手机也能跑YOLOv5了!
- Visual Studio 2005 SP1安装 关键点
- 【cs229-Lecture19】微分动态规划
- excel 两组数据交点_30秒即可完成Excel数据对比,超高效率,快学起来不要犹豫!...
- 红黑树效率为甚恶魔是log_一文带你彻底读懂红黑树(附详细图解)
- 富文本NSMutableAttributedString用法大全
- 洽洽三只松鼠良品铺子,到底谁能笑傲“后坚果时代”?
- SQL Server 2008 性能测试和调优
- Spring Boot笔记-对dto数据传输对象及物联网公司主创建主键的认识
- 32岁妈妈适合转行做软件测试吗,32+大龄妈妈,AMH偏低,可丽蓝助力好孕一次就中...
- 快速提取PPT文件里面的视频、音频素材
- python求100被3he7整除_PYTHON练习题测验
- linux安装rz sz命令不能用,Linux下如何安装rz和sz命令
- python 爬取taptap热门榜
- minecraft崩溃java,je1.7.10,进入世界就崩溃,解决一下
- 毕业一年来我的前端之路总结和谈谈大厂外包工作体验
- GYM 100827 A.Runes(水~)
- B-样条基函数:定义 (B-spline Basis Functions: Definition)
- 微信小程序实现酒店入住时间区间选择日历
- php办公网聊天室,使用phpFreeChat在您的网站上运行聊天室 | MOS86
热门文章
- mysql根据分隔符将一行数据拆分成多行数据
- Spark的shuffle机制
- Spark学习笔记1——第一个Spark程序:单词数统计
- 【黄啊码】MySQL入门—14、细说数据库的MVCC机制
- ISP-长短曝光融合生成HDR图像
- java 山寨qq源代码_求一个山寨qq的源代码,要java语言的~谢谢
- 博途PLC的模糊PID(Matlab “fuzzy“工具箱使用介绍)
- CString源代码
- pyautogui使用经验
- z-index细解:一个z-index的值很大为何却在一个很小的值下面?