gym地址
该任务是让小车跑到右侧的山顶,但是小车力不够它直接冲上去,需要让它左右荡到山顶。

在它的源文件中可以找到相关信息:

Observation:Type: Box(2)Num    Observation               Min            Max0      Car Position              -1.2           0.61      Car Velocity              -0.07          0.07Actions:Type: Discrete(3)Num    Action0      Accelerate to the Left1      Don't accelerate2      Accelerate to the Right
Reward:Reward of 0 is awarded if the agent reached the flag (position = 0.5)on top of the mountain.Reward of -1 is awarded if the position of the agent is less than 0.5.

代码测试环境,随机运动

import numpy as np
import pandas as pd
import time
import gym
import csv
import os
import pickle
from queue import Queue
import pickledef run_test():env = gym.make('MountainCar-v0')   observation = env.reset()  #状态for t in range(500):   #action =  np.random.choice([0, 1, 2]) #动作 0向左加速  1不动   2 向右加速#action = 2observation, reward, done, info = env.step(action)   print(action,reward,done)print(observation)time.sleep(0.02)env.close()if __name__ == '__main__':run_test()


接下来使用Q-learning进行训练

import numpy as np
import pandas as pd
import time
import gym
import csv
import os
import pickle
from queue import Queue
import pickleclass QLearning:def __init__(self, actions_space, learning_rate=0.01, reward_decay=0.99, e_greedy=0.6):self.actions = actions_space    # 可以选择的动作空间#self.target                     # 目标状态(终点)self.lr = learning_rate         # 学习率   决定这次的误差有多少是要被学习的self.gamma = reward_decay       # 回报衰减率  对未来reward的衰减值。gamma越接近1,机器对未来的reward越敏感self.epsilon = e_greedy         # 探索/利用 贪婪系数self.num_pos = 20               #将位置分为num_pos份self.num_vel = 14                #将速度分为num_vel份# 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_pos*self.num_vel, self.actions.n)) # Q值表self.pos_bins = self.toBins(-1.2, 0.6, self.num_pos)self.vel_bins = self.toBins(-0.07, 0.07, self.num_vel)# 根据本次的行动及其反馈(下一个时间步的状态),返回下一次的最佳行动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 = self.actions.sample()return action# 分箱处理函数,把[clip_min,clip_max]区间平均分为num段,def toBins(self,clip_min, clip_max, num):return np.linspace(clip_min, clip_max, num + 1)# 分别对各个连续特征值进行离散化  末端值-1  如[1 5 10]时 取2 为1 取5或6为2  取10为3 此时-1让其为2def digit(self,x, bin):n = np.digitize(x,bins = bin)if x== bin[-1]:n=n-1return n# 将观测值observation离散化处理def digitize_state(self,observation):# 将矢量打散回连续特征值cart_pos, cart_v = observation# 分别对各个连续特征值进行离散化(分箱处理)digitized = [self.digit(cart_pos,self.pos_bins),self.digit(cart_v,self.vel_bins),]# 将4个离散值再组合为一个离散值,作为最终结果return (digitized[1]-1)*self.num_pos + digitized[0]-1# 学习,主要是更新Q值def learn(self, state, action, r, next_state):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('MountainCar-v0')   print(env.action_space)agent = QLearning(env.action_space)# with open(os.getcwd()+'/tmp/carmountain.model', 'rb') as f:#     agent = pickle.load(f)# agent.actions = env.action_space    #初始化for i in range(10000):  #训练次数observation = env.reset()  #状态state = agent.digitize_state(observation)  #状态标准化for t in range(300):   #一次训练最大运行次数action = agent.choose_action(state)  #动作 0向左加速  1不动   2 向右加速observation, reward, done, info = env.step(action)   next_state = agent.digitize_state(observation)# if done:#     reward-=200  #对于一些直接导致最终失败的错误行动,其报酬值要减200if reward == 0:  #到达山顶时reward为0reward+=1000   #给大一点print(action,reward,done,state,next_state)agent.learn(state,action,reward,next_state)state = next_stateif done:    #重新加载环境 print("Episode finished after {} timesteps".format(t+1))break# env.render()    # 更新并渲染画面print(agent.q_table)env.close()#保存 with open(os.getcwd()+'/tmp/carmountain.model', 'wb') as f:pickle.dump(agent, f)def test():env = gym.make('MountainCar-v0')   print(env.action_space)with open(os.getcwd()+'/tmp/carmountain.model', 'rb') as f:agent = pickle.load(f)agent.actions = env.action_space    #初始化agent.epsilon = 1observation = env.reset()  #state = agent.digitize_state(observation)  #状态标准化for t in range(500):   #一次训练最大运行次数action = agent.choose_action(state)  #observation, reward, done, info = env.step(action)   next_state = agent.digitize_state(observation)print(action,reward,done,state,next_state)agent.learn(state,action,reward,next_state)state = next_stateenv.render()    # 更新并渲染画面env.close()def run_test():env = gym.make('MountainCar-v0')   observation = env.reset()  #状态包括以下4个因素  小车的位置、速度  木棒的角度、速度for t in range(500):   #action =  np.random.choice([0, 1, 2]) #动作 0向左加速  1不动   2 向右加速#action = 2observation, reward, done, info = env.step(action)   print(action,reward,done)print(observation)env.render() time.sleep(0.02)env.close()if __name__ == '__main__':train() #训练test()    #训练结束后测试# run_test()

为了训练的快一些,训练时不加载画面
训练完成后 进行测试
可以看到小车很快啊,就冲上了山顶

强化学习gym的使用之mountaincar的训练相关推荐

  1. 强化学习gym的使用之Pendulum的训练

    地址 该任务是杆起始位置随机,让它荡到顶头并保持. 首先测试环境 def run_test():env = gym.make('Pendulum-v0') action = [0]observatio ...

  2. Ubuntu16.04 搭建mujoco环境+强化学习gym

    (2022)Ubuntu16.04 搭建mujoco环境+强化学习gym 前言 一.Ubuntu16.04系统安装 二.mujoco安装 1.安装教程 2.程序验证 三.mujoco-py 安装 1. ...

  3. 强化学习Gym Atari报错缺少ale_c.dll

    强化学习Gym Atari报错缺少ale_c.dll 问题: 一般在Windows10(及以上)系统中使用Anaconda配置强化学习的Gym环境时,如使用Breakout训练场,需要安装以下工具包 ...

  4. RL之Q Learning:利用强化学习之Q Learning实现走迷宫—训练智能体走到迷宫(复杂迷宫)的宝藏位置

    RL之Q Learning:利用强化学习之Q Learning实现走迷宫-训练智能体走到迷宫(复杂迷宫)的宝藏位置 目录 输出结果 设计思路 实现代码 测试记录全过程 输出结果 设计思路 实现代码 f ...

  5. RL之Q Learning:利用强化学习之Q Learning实现走迷宫—训练智能体走到迷宫(简单迷宫)的宝藏位置

    RL之Q Learning:利用强化学习之Q Learning实现走迷宫-训练智能体走到迷宫(简单迷宫)的宝藏位置 目录 输出结果 设计思路 实现代码 测试记录全过程 输出结果 设计思路 实现代码 f ...

  6. 安装gym库_强化学习Gym库学习实践(一)

    最近看了一篇研究方向相关的文章,介绍了一种DQN的应用,感觉还挺新鲜的.想着把这篇文章复现出来,就开始学习强化学习的相关知识,作为一名小白,这一路走的可是真的十分艰难(我太菜了啊!) 看了莫烦Pyth ...

  7. 天下苦深度强化学习久矣,这有一份训练与调参技巧手册

    ©作者 | 申岳 单位 | 北京邮电大学 研究方向 | 机器人学习 天下苦 RL 久矣,其中最苦的地方莫过于训练和调参了,人人欲"调"之而后快. 在此为 RL 社区贡献一点绵薄之力 ...

  8. 强化学习gym库中的Pendulum-v1/CartPole-v1游戏介绍

    文章目录 前言 CartPole-v1 游戏结束 state action和reward Pendulum-v1 通用操作 前言 gym官网:http://gym.openai.com/envs/#c ...

  9. 强化学习 —— gym

    0. gym 下的数据结构 Discrete: gym.spaces.discrete.Discrete env.action_sample 的返回值就是 Discrete 类型 Discrete(n ...

最新文章

  1. python 怎么将数组转为列表_图片转换成pdf格式怎么操作?什么软件能将图片转为pdf?...
  2. style=background-image: url(__HOMEPAGE__/views/IMJ2V2/images/banner2.jpg)
  3. 辨析Java与Javascript
  4. boost::hana::deque用法的测试程序
  5. 五、性能监视(2)Windows性能日志
  6. VHDL基本门电路和数值比较器的设计
  7. Python 下载文件并保存文件到本地
  8. 2020-02-06 asm内联汇编
  9. [模拟][字符串]计算器的改良
  10. java基础(十四)-----详解匿名内部类——Java高级开发必须懂的
  11. 下载地图制作成GST格式(谷歌、百度、高德)导入到Mapinfo中使用
  12. 常用组合数计算公式及推算
  13. 88e1111的1000base-x to copper(GBIC)配置及使用
  14. 考研复习时间安排初试篇
  15. 离散数学中谓词逻辑推理规则总结,附各规则英文
  16. 远程桌面 CredSSP加密Oracle修正 解决方法
  17. 计算机的两种启动引导方式,硬盘的两种分区和对应启动引导方式
  18. mysql 事件报错1314_mysql 1314
  19. FAFU OJ 依旧水水的dp3
  20. django基于python的图书馆管理系统--python-计算机毕业设计

热门文章

  1. cf_global_round7
  2. HDU 4114 Disney's FastPass(状压dp)
  3. Thinkpad E470重装WIN7系统后,重启进入boot menu的问题
  4. audio实现歌词同步
  5. UBUNTU 20.4 WIFI 驱动安装 ---TP-LINK WDN5200H
  6. SpringBoot中@Value读取不到值的解决方案
  7. 计算二维紧束缚模型费米面和nesting程序新思路
  8. Vue3中使用Ant Design Vue图标
  9. 小米5s+刷+android+8.0,小米MIUI10技术难点已突破,小米5S系列升级安卓8.0看来稳了...
  10. 2015美国计算机研究生就业,2015年美国计算机专业研究生排名