强化学习:使用自动控制方法PID来解决强化学习问题中的cartpole问题(小车平衡杆问题)
网上找到的一个实现:
地址:
https://gist.github.com/HenryJia/23db12d61546054aa43f8dc587d9dc2c
稍微修改后的代码:
import numpy as np
import gym
def sigmoid(x):
return 1.0 / (1.0 + np.exp(-x))
env = gym.make('CartPole-v1')
desired_state = np.array([0, 0, 0, 0])
desired_mask = np.array([0, 0, 1, 0])
P, I, D = 0.1, 0.01, 0.5 ###
N_episodes = 10
N_steps = 50000
for i_episode in range(N_episodes):
state, _ = env.reset()
integral = 0
derivative = 0
prev_error = 0
for t in range(N_steps):
# print(f"step: {t}")
env.render()
error = state - desired_state
integral += error
derivative = error - prev_error
prev_error = error
pid = np.dot(P * error + I * integral + D * derivative, desired_mask)
action = sigmoid(pid)
action = np.round(action).astype(np.int32)
# print(P * error + I * integral + D * derivative, pid, action)
# print(state, action, )
state, reward, done, info, _ = env.step(action)
if done or t==N_steps-1:
print("Episode finished after {} timesteps".format(t+1))
break
env.close()
运行效果:

这个表现是极为神奇的,如果不考虑泛化性的话,不考虑使用AI算法和机器学习算法的话,那么不使用强化学习和遗传算法以外的算法,那么使用自动化的算法或许也是不错的选择,并且从这个表现来看这个效果远比使用AI类的算法表现好。
上面的这个代码只考虑小车平衡杆的角度与0的偏差,就可以获得如此高的表现。
根据原地址的讨论:
https://gist.github.com/HenryJia/23db12d61546054aa43f8dc587d9dc2c

我们可以知道,如果通过调整PID算法的系数,那么可以获得更为优秀的性能表现,为此我们修改代码如下:
点击查看代码
import numpy as np
import gym
def sigmoid(x):
return 1.0 / (1.0 + np.exp(-x))
env = gym.make('CartPole-v1')
desired_state = np.array([0, 0, 0, 0])
# desired_mask = np.array([0, 0, 1, 0])
desired_mask = np.array([1, 1, 1, 1])
# P, I, D = 0.1, 0.01, 0.5 ###
P, I, D = [1/150, 1/950, 0.1, 0.01], [0.0005, 0.001, 0.01, 0.0001], [0.2, 0.0001, 0.5, 0.005]
N_episodes = 10
N_steps = 1000000
for i_episode in range(N_episodes):
state, _ = env.reset()
integral = 0
derivative = 0
prev_error = 0
for t in range(N_steps):
# print(f"step: {t}")
env.render()
error = state - desired_state
integral += error
derivative = error - prev_error
prev_error = error
pid = np.dot(P * error + I * integral + D * derivative, desired_mask)
action = sigmoid(pid)
action = np.round(action).astype(np.int32)
# print(P * error + I * integral + D * derivative, pid, action)
# print(state, action, )
state, reward, done, info, _ = env.step(action)
if done or t==N_steps-1:
print("Episode finished after {} timesteps".format(t+1))
break
env.close()
性能表现:

根据这个PID的系数来运行gym下的cartpole游戏,可以认为这个游泳永远不会终止,因为这里我们已经将运行长度设置为100万步。
PS:
需要注意的是PID算法的这个P,I,D系数才是影响算法的关键,而如何获得这个系数也是一个极为难的问题,很多时候是需要使用试错的方法来进行的,可以说有的P,I,D系数可以运行几十步,有的可以运行几百步或几千步,而下面的系数却可以运行上百万步,甚至是永远一直运行,可以说这种PID系数的求解才是真正的关键。
P, I, D = [1/150, 1/950, 0.1, 0.01], [0.0005, 0.001, 0.01, 0.0001], [0.2, 0.0001, 0.5, 0.005]
强化学习:使用自动控制方法PID来解决强化学习问题中的cartpole问题(小车平衡杆问题)的更多相关文章
- tp5依赖注入(自动实例化):解决了像类中的方法传对象的问题
app\index\Demo1.php namespace app\index\controller; /* 容器与依赖注入的原理 ----------------------------- 1.任何 ...
- swift 学习之自动引用计数
swift 学习之自动引用计数 学习和研究的主要是"实例对象和实例对象直接的相会强引用所产生的内从泄漏"和"使用闭包产生的强引用造成的内存泄漏" 注意:只有以引 ...
- 用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践
https://zhuanlan.zhihu.com/p/25928551 近来在同时做一个应用深度学习解决淘宝商品的类目预测问题的项目,恰好硕士毕业时论文题目便是文本分类问题,趁此机会总结下文本分类 ...
- [转] 用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践
转自知乎上看到的一篇很棒的文章:用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践 近来在同时做一个应用深度学习解决淘宝商品的类目预测问题的项目,恰好硕士毕业时论文 ...
- 【RS】Automatic recommendation technology for learning resources with convolutional neural network - 基于卷积神经网络的学习资源自动推荐技术
[论文标题]Automatic recommendation technology for learning resources with convolutional neural network ( ...
- MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法
MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法 1 问题 [root@localhost m ...
- Eclipse没法自动补全代码解决
Eclipse没法自动补全代码解决 Eclipse无法自动补全代码解决 Window->Java->Editor->Content Assist->Advanced
- jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法
博客分类: jquery-easyui jQueryAjax框架HTML 现象: AJAX返回的html无法做到自动渲染为EasyUI的样式.比如:class="easyui-layout ...
- powerdesigner 不能自动生成注释的解决方法
解决power designer 不能自动生成注释的解决办法只需要3步: 一.快捷键 Alt+Shift+X 打开脚本编辑器: 二.将下面天蓝色的字体脚本添加到脚本编辑器里面: Option Expl ...
- Win10电脑经常自动掉线、自动断网的解决方法
近期一客户称自己使用电脑上网的时候,过一段时间莫名其妙的出现自动掉线.自动断网的情况,那么遇到这个问题该怎么办?下面装机之家分享一下Win10电脑经常自动掉线.自动断网的解决方法,以Win7系统为例. ...
随机推荐
- JVM 系列知识体系全面回顾
经过几个月的努力,JVM 知识体系终于梳理完成了. 很早之前也和小伙伴们分享过 JVM 相关的技术知识,再次感谢大家支持和反馈. 最后再次献上 JVM系列文章合集索引,感兴趣的小伙伴可以点击查看. J ...
- Blazor开发框架Known-V2.0.13
大家好,国庆节快乐,Known又更新了一波功能. 继上个版本以来,一直在完善网站文档.KnownCMS开源项目和解决框架客户提出的一些问题.这期间客户反馈的问题主要如下: 微信模板消息收不到,查其原因 ...
- Linux-USB驱动笔记-Gadget Function驱动
1.前言 在Linux-USB驱动笔记(四)–USB整体框架中有説到Gadget Function驱动,下面我们来具体看一下. Gadget Function就是指设备的功能,比如作为U盘,需要文件存 ...
- Android Systrace 基础知识 -- Why 60 fps ?
1.正文 今天来讲一下为何我们讲到流畅度,要首先说 60 帧. 我们先来理一下基本的概念: 60 fps 的意思是说,画面每秒更新 60 次 这 60 次更新,是要均匀更新的,不是说一会快,一会慢,那 ...
- markdown的html优雅使用语法(2024/10/10guixiang原创)
一:图片部分 第一范式 图 2 全字段排序 <center> <img style="border-radius: 0.3125em; box-shadow: 0 2px ...
- C#的排序方法 OrderBy
using System;using System.Collections.Generic;using System.Linq;using System.Net.Http;using System.R ...
- Linux查看CPU核数
**方法一:通过proc文件系统 获取cpu总数量 命令如下 ** cat /proc/cpuinfo |grep processor 方法二:nproc命令 nproc 方法三:lscpu 显示CP ...
- OGG异构平台安装部署 MySQL->Oracle
本文旨在从安装部署中了解OGG的知识 一.OGG理论概念 1.1 简单介绍 1.2 同步过程 1.3 Oracle Golden Gate简要体系图 二.测试实验 2.1 实验环境介绍 2.2 源端M ...
- Min-25 筛小记
Min-25 筛 参考 \(\text{OI-Wiki}\) 和 2018 集训队论文 朱震霆<一些特殊的数论函数求和问题>. \(\text{Min-25}\) 的本质是埃式筛和数论分块 ...
- Context的典型使用场景
获取应用文件路径 基类Context提供了获取应用文件路径的能力,ApplicationContext.AbilityStageContext.UIAbilityContext和ExtensionCo ...