在上一期中,使用DQN算法,我们让智能体能够顺利解决较大的网格迷宫问题。本期我们更进一步,尝试用DQN控制倒立摆。倒立摆是非常经典的控制问题,如果DQN能够有效实现倒立摆的控制,也就意味着DQN等强化学习算法适用于更复杂的动力学控制问题,即就是说,采用相似的思想,我们可以将强化学习算法用于机械臂控制、卫星姿态控制等工程问题上。

像往常一样,想要实现倒立摆的强化学习控制,我们可以把这样一个大问题拆解成几个相对独立的问题解决。第一是使用MatLab实现倒立摆的数值仿真建模;第二则是修改DQN算法,使之能够与倒立摆环境相适应;第三则是改善程序的整体框架,使它更简洁、更易于维护。

第一个问题中,倒立摆的动力学方程可以整理为常微分方程;同时,为了更好的与之前我们掌握的神经网络工具箱结合,我们使用MatLab的Ode45()函数实现动力学仿真。
第二个问题,我们需要根据倒立摆问题调整神经网络和DQN算法的相关参数,使之能够满足控制需求。这其中,神经网络的输入、输出参数需要得到调整;DQN算法中的回报(reward)需要修改;训练循环的计数方式以及训练周期等内容也需要调整。
最后,由于整个程序中加入了倒立摆的数值仿真,不仅参数和常数增多,程序也相对网格迷宫程序复杂了很多。因此,我们需要优化程序的编写,以提高程序的易读性和维护性。

一、倒立摆的数学建模

1.1 倒立摆模型的方程


倒立摆由小车以及小车上向上铰支的摆杆组成,显然,当摆杆朝上时,这是一个可以平衡但不能稳定的系统。
小车固定在横轴上,因此在y方向上无位移,仅在x方向上有位移和速度。在水平方向上,小车受到控制力、摩擦力以及摆杆支撑力水平分量的作用。取x_c为x方向位移、x_c为x方向速度,得方程(1.1):

至于摆杆,虽然摆杆的下端固定在小车上,但摆杆的质心却是存在垂直和水平两向位移的。水平方向上,摆杆受力为支撑力的水平分量;垂直方向上,摆杆的受力包括重力和支撑力的垂直分量。

除此之外,摆杆存在转动,绕质心的转动方程为:

然而,上述动力学系统中,四个物理坐标仅仅有两个是相互独立的,
因此,在实际的数值仿真中,为了更好的与物理现象相对应,我们选取小车的横坐标x_c和摆杆的转角θ作为状态量。摆杆质心的横纵坐标与x_c及θ的关系如下:

小车所收到的摩擦力与运动方向相反,与相对滑轨的正压力成正比,摩擦力F_f可表示为:

联立上述方程,即可得到用于适合于数值求解的方程格式:

1.2倒立摆的数值仿真

如上,即完成了倒立摆的数值仿真建模。我们将方程在编程中实现,并调用ode45()函数,即可实现倒立摆的MatLab仿真。

[t,y]=ode45(@CartPole_Eqs,[0,T_step],OdeInput,opts);
function dotPara=CartPole_Eqs(t,Para)
global Mc Mp Lp Cf g;
X=Para(1);
V=Para(2);
Theta=Para(3);
Omega=Para(4);
Fc=Para(5);
dotPara=zeros(4,1);dotPara(1,:)=V;if V~=0D1=V/abs(V);
elseD1=0;         %停滞状态下不考虑摩擦力,实际上,除去初值外,dotx几乎不为0
end
C21=(Mc+Mp)/Mc+3/4*Mp/Mc*cos(Theta)*(Cf*D1*sin(Theta)-cos(Theta));
C22=Fc/Mc-(Mp+Mc)/Mc*Cf*D1*g+(sin(Theta)+cos(Theta)*Cf*D1)*Mp/Mc*Lp/2*(Omega^2)+0.75*(Cf*D1*sin(Theta)-cos(Theta))*Mp/Mc*sin(Theta)*g;
dotPara(2,:)=C22/C21;dotPara(3,:)=Omega;
dotPara(4,:)=1.5/Lp*(sin(Theta)*g-cos(Theta)*dotPara(2));
dotPara(5,:)=0;

二、倒立摆的DQN控制

想要使用DQN控制倒立摆,有两个问题需要解决。第一,是DQN的状态和动作分别是什么?第二,DQN的奖赏如何定义?
对于第一个问题,DQN的状态就是倒立摆动力学系统的状态,包括四个参量,小车的横坐标、水平速度,摆杆的转角以及旋转角速度。对于DQN的动作,我们知道倒立摆的平衡是由控制力F_c实现的,因此其动作自然应该是控制力。但控制力本身是连续量,在依据策略选择动作时我们没办法将这一连续量的所有值都遍历一遍以获得Q值最大的控制力。因此,**我们将倒立摆的控制力离散化成一个控制力数组来实现DQN需要的动作输入,**也就是说,倒立摆的控制力输出为一组规定的常值。**在仿真模拟中,智能体每隔规定间隔进行一次状态采样,输入DQN网络中获得该状态下所有动作的Q值并选择Q值最高的动作,此控制力即为下一时间段的控制力输出。**也就是说,由于DQN的特点,我们采用幅值和时间上均离散的控制力来实现倒立摆的控制。
对于第二个问题,我们希望,倒立摆的小车水平位置距离导轨越近越好,摆杆如垂直方向的夹角越小越好。由于整个倒立摆控制程序中,需要在多个地方进行奖赏reward()的计算,我们将奖赏封装成如下的函数:

function reward=Reward_Cal(CPstate)
global X_threshold Theta_threshold;
r1=1.4*((X_threshold-abs(CPstate(1)))/X_threshold-0.8);
r2=(Theta_threshold-abs(CPstate(3)))/Theta_threshold-0.95;
reward=r1+r2;

奖赏的定义对DQN控制器的表现存在着较大的影响,r1与r2的权重决定了DQN对两种位置误差的敏感程度。也因此,奖赏的定义本身也是倒立摆DQN控制中可以调试的参数。读者也可尝试对奖赏函数进行修改来观察DQN的表现。

三、 倒立摆程序设计

我们修改在网格迷宫中搭建的MatLab程序框架,以实现其对倒立摆的控制。变化主要有以下几点:

  1. 由于神经网络智能体和倒立摆环境参数较多,参数的初始化单独用两个.m文件封装,这样也方便了参数的调整与检查。
  2. 将观察期和训练期合并成了一段代码,缩短代码长度,便于检查和维护。
  3. 单训练周期内,循环变量由次数变为时间,且时间的步进为可调参数。
  4. 在每个episode的开始,倒立摆的初始化会产生随机的扰动,一方面提高训练中的“探索”概率,另一方面模拟真实情况。
    程序的框架可由下面的流程图展示。
    程序的主体部分则如下:
% 忘记面孔的Batou
% "I thought what I'd do was I'd pretend I was one of those deaf-mutes, or should I?" clear all;run('CartPoleInitializer');
run('AgentInitializer'); %训练周期设置:观察期,训练期
N_obs=300;
N_train=3000;
N_total=N_obs+N_train;
T_episode=60;           %每个周期的总时间%数据记录初始化,状态记录在Episode开始前进行
TimeRecord=zeros(1,N_total);
AveTimeRecord=zeros(2,N_total/10);
ATRpointer=1;%episode及其余设置
T_step=0.1;
n_step=1;%动态绘图初始化
Plotset=zeros(2,1);
p = plot(Plotset(1,:),Plotset(2,:),...'EraseMode','background','MarkerSize',5);
axis([0 N_obs+N_train 0 60]);for Ns=1:N_totalCPstate=CartPoleReset();                %CPstate为4*1矩阵,x,dotx,theta,dotthetaT1=0;%初始化历史记录。记录下列内容:1.控制时长;2.每个episode的600个状态与控制力矩TrackPointer=1;TrackRecord(Ns).Track=zeros(6,T_episode/T_step);while T1<=T_episode%根据tcegreedy策略选择动作[act,Qnow]=tcegreedy(Ns,CPstate,QNet_eval);  Fc=FcTable(act);%使用Ode45执行动作OdeInput=[CPstate;Fc];[t,y]=ode45(@CartPole_Eqs,[0,T_step],OdeInput,opts);Nsize=size(y); Nsize=Nsize(1);Newstate=y(Nsize,1:4); Newstate=Newstate';%Replaymemory记录+指针更新Rmemo(:,Memopointer)=[CPstate;act;Newstate];Memopointer=PointerMove(Memopointer,S_memo);%轨迹数据记录更新TrackRecord(Ns).Track(:,TrackPointer)=[T1;CPstate;Fc];TrackPointer=TrackPointer+1;%更新状态T1=T1+T_step;n_step=n_step+1;CPstate=Newstate;       %按照T-renew间隔更新估计Q_target的目标神经网络QNet_targetif (mod(n_step,N_renew)==0)&&(Ns>=N_obs)QNet_target=QNet_eval;end%按照T_gap的间隔训练估计Q_eval的评估神经网络QNet_evalif (mod(n_step,N_gap)==0)&&(Ns>=N_obs)%1. 利用Rmemo生成训练数据级Trainset=zeros(10,nBatch);      %前9行与replaymemory一致,后一行为利用QNet_target计算得到的Q_target;i=1;while i<=nBatchnum1=unidrnd(S_memo);if Rmemo(5,num1)>0          %有记录的第五行始终不为零Trainset(1:9,i)=Rmemo(:,num1);i=i+1;endend%2. 计算Q_targetTrainset(10,:)=CalculationQtarget(Trainset(1:9,:),QNet_target);            %3. 训练QNet_evalQNet_eval=train(QNet_eval,Trainset(1:5,:),Trainset(10,:));end%判断是否跳出本episode,并记录控制时长if (abs(CPstate(1))>X_threshold)||(abs(CPstate(3))>Theta_threshold)TimeRecord(Ns)=T1;break;elseif T1>=T_episodeTimeRecord(Ns)=T1;break;endend%动态绘图if mod(Ns,10)==0Ave1=mean(TimeRecord(Ns-9:Ns));AveTimeRecord(:,ATRpointer)=[Ns;Ave1]';ATRpointer=ATRpointer+1;        TempP=[Ns;Ave1];Plotset=[Plotset,TempP];set(p,'XData',Plotset(1,:),'YData',Plotset(2,:));drawnowaxis([0 N_obs+N_train 0 60]);             endend

四、Let it RUN

完成程序后,我们运行程序以观察智能体的训练。在倒立摆模型中,我们不能再简单的以智能体是否到达终点作为性能评估的标识,而以每一个episode中DQN控制倒立摆不倒(小车的坐标距离中心的偏差和摆杆的转角均不超过门限)的时长作为观察其性能的标志。我们取每10个Episode的控制时长作平均进行绘图,得到DQN的训练情况:
在训练完成后,单个Episode里,倒立摆呈现出如下的运动状态:

以上,即是《MatLab强化学习入门》第五期的内容。本期我们使用DQN解决倒立摆问题的完整代码,已经和第四期解决网格迷宫问题的代码合并上传,读者可以移步以下链接下载:MATLAB强化学习_神经网络控制_倒立摆问题&网格迷宫问题

十分欢迎有心读本文的CSDNer交流讨论;如果觉得本文有帮助的话,打赏一下可是更好(๑•̀ㅂ•́)و✧

MATLAB强化学习入门——五、倒立摆的DQN神经网络控制相关推荐

  1. 强化学习--实验一倒立摆

    强化学习 强化学习--实验一倒立摆 强化学习 一.安装库 二.实验代码及解释 一.安装库 首先需要安装pygame与gym,直接在命令窗口中运行如下指令即可 pip install pygame pi ...

  2. 【深入浅出强化学习-编程实战】 7 基于策略梯度的强化学习-Cartpole(小车倒立摆系统)

    [深入浅出强化学习-编程实战] 7 基于策略梯度的强化学习-Cartpole 小车倒立摆MDP模型 代码 代码解析 小车倒立摆MDP模型 状态输入:s=[x,x˙,θ,θ˙]s = [x,\dot{x ...

  3. MATLAB强化学习实战(七) 在Simulink中训练DDPG控制倒立摆系统

    在Simulink中训练DDPG控制倒立摆系统 倒立摆的Simscape模型 创建环境接口 创建DDPG智能体 训练智能体 DDPG智能体仿真 此示例显示了如何训练深度确定性策略梯度(DDPG)智能体 ...

  4. [LQR简要快速入门]+[一级倒立摆的LQR控制]

    [LQR简要快速入门]+[一级倒立摆的LQR控制] 1. 什么是LQR 2. 公式含义 3. 倒立摆的建模 3.1 线性化 3.2 状态空间建立 4. LQR算法实现 5. MATLAB代码仿真 6. ...

  5. 【强化学习】深度强化学习入门介绍

    深度强化学习是一种机器学习,其中智能体(Agent,也翻译作代理)通过执行操作(Action)和查看结果(Reward)来学习如何在环境中采取最佳的动作或策略. 自 2013 年Deep Q-Lear ...

  6. 深度强化学习入门介绍

    深度强化学习是一种机器学习,其中智能体(Agent,也翻译作代理)通过执行操作(Action)和查看结果(Reward)来学习如何在环境中采取最佳的动作或策略. 自 2013 年Deep Q-Lear ...

  7. 强化学习入门这一篇就够了!!!万字长文

    强化学习 强化学习入门这一篇就够了万字长文带你明明白白学习强化学习... 强化学习入门这一篇就够了 强化学习 前言 一.概率统计知识回顾 1.1 随机变量和观测值 1.2 概率密度函数 1.3 期望 ...

  8. matlab强化学习算例理/菜鸟理解1——双足机器人行走算例

    目录 matlab双足机器人强化学习算例介绍 强化学习的一些基础理解 菜鸟对一些名词的理解 matlab强化学习库介绍 双足机器人算例逻辑盘点 如何改写算例做自己的强化学习. %写在前面: 本人大四狗 ...

  9. 强化学习入门知识与经典项目分析1.3

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  10. 写给开发同学的 AI 强化学习入门指南

    该篇文章是我学习过程的一些归纳总结,希望对大家有所帮助. 最近因为 AI 大火,搞的我也对 AI 突然也很感兴趣,于是开启了 AI 的学习之旅.其实我也没学过机器学习,对 AI 基本上一窍不通,但是好 ...

最新文章

  1. ffmpeg + x264+ x265 + libde265 + opengl es display
  2. 企业网络推广专员浅析企业网络推广初期网站优化应重视的一些问题
  3. 计算机基本组成: 触发器
  4. 汇编语言 在存储单元中显示字符串
  5. java 查看变量类型
  6. mysql数据库没启动命令_mysql数据库服务启动和停止命令介绍(转载)
  7. c语言 异或_C语言经典例题来袭!5大方法告诉你答案
  8. HBase数据备份及恢复(导入导出)的常用方法
  9. 从头搭建一个深度学习框架
  10. Python注释的写作笔记
  11. 解决远程服务器ssh登陆慢等问题
  12. 抢占云安全管理高地 启明星辰先发云SOC
  13. java 支付宝预下单失败,系统异常,预下单状态未知!!! connect timed out
  14. 自己画一块ESP32-C3 的开发板(立创EDA)(PCB到手)
  15. 支付宝陷“隐私门”:加强监管避免隐私不当收集
  16. linux系统下载及安装(CentOS-7-x86_64-DVD-1810.iso)
  17. 小白题解 Codeforces 794B Cutting Carrot
  18. wordpress 黑客_12个迹象表明您的WordPress网站被黑客入侵
  19. 群晖 Let's Encrypt 泛域名证书自动更新
  20. 常用CSS中文字体转Unicode对照表

热门文章

  1. 击穿面试官的套路:经典面试问题剖析
  2. 如何制作朋友圈搞笑证件图片(附源码实例)
  3. 四核处理器_一千块普通办公电脑配置清单,还是四核处理器,能玩TX全家桶
  4. 关于笔记本电脑无法连接到网络
  5. Install Windows Vista Service Pack 2 (SP2)
  6. java poi word bookmarks_poi根据word/excel模板(书签)创建导出word/excel文档
  7. 【python】filetype根据内容推测文件类型
  8. [模拟登陆三剑客]1. Fiddler怎么用?--使用Fiddler 进行网络抓包
  9. 【漏洞复现】蓝凌OA近期公开几个漏洞汇总
  10. 神的战争god无法显示服务器,神的战争GOD