倒立摆参数以及数学模型

首先是写一个倒立摆的AGENT模型

pendulum_env.py

import numpy as np
import matplotlib.pyplot as plt
# import matplotlib
import matplotlib.animation as animation
# import IPythonclass Pendulum:"""构建一个倒立摆环境"""def __init__(self):"""初始化"""# 倒立摆系统参数self._m = 0.055  # 转子重量self._g = 9.81  # 重力加速度self._l = 0.042  # 重心到转子距离self._J = 1.91e-4  # 转动惯量self._b = 3e-6  # 粘滞阻尼self._K = 0.0536  # 转矩常数self._R = 9.5  # 转子电阻# 状态维度 2维 角度angle和角速度angularself.state_dims = 2# 采样时间self.Ts = 0.005# 取值范围self.max_anger = np.pi  # 最大角度self.max_angular = 15 * np.pi  # 最大角速度self.max_voltage = 3  # 最大电压def get_delta_angular(self, x, u):"""获取倒立摆角加速度:param x: 该时刻输入状态 [角度,角速度]:param u: 该时刻输入电压:return: 该时刻角加速度"""temp = self._m * self._g * self._l * np.sin(x[0])_temp = (temp - self._b * x[1] - (self._K ** 2) * x[1] / self._R + self._K * u / self._R)return _temp / self._Jdef get_next_state(self, x, u):"""根据离散时间动力学模型获得下次状态:param x: 该时刻输入状态 [角度,角速度]:param u: 该时刻输入电压:return: 下一时刻的新状态 [角度,角速度]"""alpha = x[0] + self.Ts * x[1]d_alpha = x[1] + self.Ts * self.get_delta_angular(x, u)# 校正角度if alpha < -self.max_anger:alpha += self.max_angerelif alpha >= self.max_anger:alpha -= self.max_anger# 限制角速度if d_alpha < -self.max_angular:d_alpha = -self.max_angularelif d_alpha > self.max_angular:d_alpha = self.max_angularreturn np.array([alpha, d_alpha])def action_sample(self, x, num_alpha=200, num_d_alpha=200):"""状态空间采样函数:param x: 没有离散化的状态空间[角度,角速度]:param num_alpha: 角度空间划分数量:param num_d_alpha: 角速度空间划分数量:return: 离散化的状态空间"""alpha = x[0]d_alpha = x[1]normal_a = (alpha + self.max_anger) % (2 * self.max_anger) - self.max_angerindice_a = int((normal_a + self.max_anger) / (2 * self.max_anger) * num_alpha)indice_da = int((d_alpha + self.max_angular) / (2 * self.max_angular) * num_d_alpha)if indice_da == num_alpha:indice_da -= 1return np.array([indice_a, indice_da])def get_reward(self, x, u):"""计算奖励信号"""Q_rew = np.matrix([[5, 0], [0, 0.1]])R_rew = 1x_ = np.matrix(x)return -x_*Q_rew*x_.T - R_rew*(u**2)

然后是Qlearning算法,继承上面写的Pendulum

Q_learning.py

采用的是Q学习和epsilon贪心算法

import numpy as np
from matplotlib import pyplot as pltfrom pendulum_env import Pendulumclass Q_learning(Pendulum):"""Q学习,继承自己写的环境prndulum"""def __init__(self, iterations=12000, gamma=0.98, lr=0.5):super().__init__()# 超参数# 迭代次数self.N = iterations# 折扣因子self.gamma = gamma# 学习率self.lr = lr# 常量# 动作矩阵self.actions = np.array([-3, 0, 3])# 初始状态self.inite_x = np.array([-np.pi, 0])# 控制误差 角度和角速度self.control = np.array([0.05, 0.01])# 探索步长限制self.step_control = 300def get_greedy_act(self, Q, x, epsilon):"""epsilon贪心搜索策略:param Q: Q函数矩阵:param x: 状态空间:param epsilon: 贪心算法的参数ε:return: 贪心策略动作下标"""opt_act = np.argmax(Q[:, x[0], x[1]])if np.random.random() > epsilon:return opt_actelse:return np.random.choice([0, 1, 2])def train(self, num_alpha=200, num_d_alpha=200, epsilon=1.0, decay=0.9995):"""训练学习:param num_alpha: 角度离散阶数:param num_d_alpha: 角速度离散阶数:param epsilon: 贪心算法的参数ε:param decay: 学习率更新参数:return: history"""# 存储所有状态以及所有动作的Q函数矩阵Q = np.zeros([3, num_alpha, num_d_alpha])epsilon_limit = 0.01  # epsilon的下界lr = self.lrtotal_step = 0# 最优值记录optimal = -1e7      # 最优奖励finalerror = 2 * np.pi  # 最小误差reward_list = []history = {'avg rewards': [],'avg steps': [],'Q': [],'locations': [],'actions': []}# 开始迭代for i in range(self.N):x = self.inite_xcount, total_reward = 0, 0sample_x = self.action_sample(x, num_alpha, num_d_alpha)epsilon = max(decay * epsilon, epsilon_limit)lr = decay * lrlocations, total_acts = [], []locations.append(x[0])error_a = np.abs(x[0])while count < self.step_control:count += 1greedy_act = self.get_greedy_act(Q, sample_x, epsilon)next_act = self.actions[greedy_act]total_acts.append(next_act)# 计算rewardreward = self.get_reward(x, next_act)# 计算下一个转移状态new_x = self.get_next_state(x, next_act)# 计算当前状态与目标状态的误差error_a = np.abs(new_x[0])# 如果满足目标就breakif np.abs(new_x[0]) < self.control[0] and np.abs(new_x[1]) < self.control[1]:locations.append(new_x[0])break# 对新状态采样new_sample_x = self.action_sample(new_x, num_alpha, num_d_alpha)# 计算Q函数max_newQa = np.max(Q[:, new_sample_x[0], new_sample_x[1]])delta = reward + self.gamma * max_newQa - Q[greedy_act][sample_x[0]][sample_x[1]]Q[greedy_act][sample_x[0]][sample_x[1]] += lr * delta# 更新状态x, sample_x = new_x, new_sample_xlocations.append(x[0])  # 记录下一个角度total_reward += reward  # 记录reward值reward_list.append(total_reward)avg_reward = np.mean(reward_list[-100:])total_step += countavg_step = total_step / 100# 历史记录history['avg rewards'].append(avg_reward)history['avg steps'].append(avg_step)history['Q'].append(Q)history['locations'].append(locations)history['actions'].append(total_acts)# 若该次迭代优于上次或奖励更高,则更新最佳值if count < self.step_control:# if error_a < finalerror or (error_a == finalerror and total_reward > optimal):if error_a < finalerror or total_reward > optimal:optimal, finalerror = total_reward, error_a# 每100次打印信息if (i + 1) % 100 == 0:print("* Episode {}/{} ** Avg Step is ==> {} ** Avg Reward is ==> {} *".format(i + 1, self.N,avg_step,avg_reward))total_step = 0print("最终距离稳定状态角度误差为:%f rad" % np.abs(locations[-1]))return historydef plot_reward(self, history, reward=True, step=True):"""绘制历史信息:param history: 历史记录:param reward: 价值函数标志位:param step: 更新步长标志位:return:"""if reward:plt.figure(figsize=(8, 4))plt.title("reward function")plt.plot(np.array(history['avg rewards']).reshape(-1))plt.xlabel("Episode")plt.ylabel("Avg Reward")plt.grid()plt.savefig('rewards.jpg')plt.show()if step:plt.figure(figsize=(8, 4))plt.title("average steps for each episode")plt.plot(np.array(history['avg steps']).reshape(-1))plt.xlabel("Episode")plt.ylabel("Avg Steps")plt.grid()plt.savefig('steps.jpg')plt.show()q = Q_learning(iterations=12000, lr=0.5)
History = q.train(epsilon=0.5)
# print(History['avg rewards'])
q.plot_reward(History)
# print(History['actions'][:10])
# print(History['actions'][-10:])

最后的可视化结果

后面还会尝试实现SARSA、DQN等等算法,持续更新中....

强化学习实战——Q learning 实现倒立摆相关推荐

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

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

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

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

  3. 【强化学习】PPO算法求解倒立摆问题 + Pytorch代码实战

    文章目录 一.倒立摆问题介绍 二.PPO算法简介 三.详细资料 四.Python代码实战 4.1 运行前配置 4.2 主要代码 4.3 运行结果展示 4.4 关于可视化的设置 一.倒立摆问题介绍 Ag ...

  4. 强化学习初探 DQN+PyTorch+gym倒立摆登山车

    文章目录 1.随便说几句 2.为什么选择DQN作为第一个入手的模型 2.工具准备 3.实现思路 3.1.环境采样 3.2 Reward设计 3.3 Q值近似计算 3.4 主循环 4.代码 5.参考文献 ...

  5. python Q learning玩倒立摆(inverted pendulum)

    今天使用Q learning实现了一下倒立摆哈,我这里把代码分享给大家学习啦: pendulum环境 # a few packages we need to importimport numpy as ...

  6. mdp框架_强化学习中q learning和MDP的区别是什么?

    MDP通常是指一种用转移概率描述连续不确定概率过程的数学框架,是强化学习中最基础的概念,很多强化学习的算法都是在把问题抽象为一个MDP之后再想办法求解的. 而q-learning是求解强化学习问题的算 ...

  7. 【强化学习实战】基于gym和tensorflow的强化学习算法实现

    [新智元导读]知乎专栏强化学习大讲堂作者郭宪博士开讲<强化学习从入门到进阶>,我们为您节选了其中的第二节<基于gym和tensorflow的强化学习算法实现>,希望对您有所帮助 ...

  8. Q学习(Q learning) 强化学习

    Q学习(Q learning) 强化学习的简单例子 Matlab实现 可视化_Morty 的挖坑记录-CSDN博客 强化学习(MATLAB) - 叮叮当当sunny - 博客园

  9. 【强化学习实战-04】DQN和Double DQN保姆级教程(2):以MountainCar-v0

    [强化学习实战-04]DQN和Double DQN保姆级教程(2):以MountainCar-v0 实战:用Double DQN求解MountainCar问题 MountainCar问题详解 Moun ...

  10. 【经典书籍】深度强化学习实战(附最新PDF和源代码下载)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 深度强化学习可以说是人工智能领域现在最热门的方向,吸引了众多该领域优秀的科学家去发 ...

最新文章

  1. 不限文件类型的ftp服务器,ftp服务器文件类型
  2. vscode pylint报错的问题
  3. 1812:网格_指导设计:网格的历史
  4. php中间件怎么使用,laravel框架中间件简单使用方法示例
  5. python 编码问题之终极解决
  6. FIFO(命名管道)
  7. iis日志字段解析 网站运维工具使用iis日志分析工具分析iis日志(iis日志的配置)
  8. Handler 消息传递机制
  9. 无盘工作站与VMware View虚拟桌面对比
  10. 模拟电路和数字电路区别
  11. c++ ActiveX基础1:使用VS2010创建MFC ActiveX工程项目
  12. css模糊文字,CSS3模糊文字
  13. 五、肺癌检测-数据集训练 training.py model.py
  14. 短信平台API接口demo示例-JAVA/Message/XSend
  15. .Net5使用Sqlsugar操作加密Sqlite数据库
  16. 无线网服务器在哪里设置方法,无线网络如何设置静态ip地址
  17. iphone邮箱收件服务器设置,iphone中使用国内邮箱设置方法
  18. 星岚技术 Win10 x64 纯净版 V2021.5【带驱动包】
  19. Cesium中的儒略日JulianDate
  20. bytebuffer获得byte[]的操作

热门文章

  1. 二叉树的遍历以及遍历算法的应用(链式存储结构)
  2. Python爬虫爬取VIP网站
  3. java上下载不了jdk_新手想学java,到哪里下载jdk?我在甲骨文官网下载jdk下载不了。...
  4. 计算机软件处理化学数据,化学中的常用计算机软件与资源程功臻武汉大学化学系计算机作为一.pdf...
  5. TOGAF9企业架构规划与设计学习考试经验简记
  6. 51单片机开发第一步 keilC51 以及 proteus 的安装
  7. 机器学习数学基础(1)-回归、梯度下降
  8. python+java家庭理财个人理财管理系统记账系统
  9. 海康威视SDK基于JAVA二次开发
  10. 硬件电路设计中的几点注意事项