目录
💥1 概述
📚2 运行结果
🎉3 参考文献
👨💻4 Matlab代码
本期我们尝试用DQN控制倒立摆。倒立摆是非常经典的控制问题,如果DQN能够有效实现倒立摆的控制,也就意味着DQN等强化学习算法适用于更复杂的动力学控制问题,即就是说,采用相似的思想,我们可以将强化学习算法用于机械臂控制、卫星姿态控制等工程问题上。
像往常一样,想要实现倒立摆的强化学习控制,我们可以把这样一个大问题拆解成几个相对独立的问题解决。第一是使用MatLab实现倒立摆的数值仿真建模;第二则是修改DQN算法,使之能够与倒立摆环境相适应;第三则是改善程序的整体框架,使它更简洁、更易于维护。
第一个问题中,倒立摆的动力学方程可以整理为常微分方程;同时,为了更好地与之前我们掌握的神经网络工具箱结合,我们使用MatLab的Ode45()函数实现动力学仿真。
第二个问题,我们需要根据倒立摆问题调整神经网络和DQN算法的相关参数,使之能够满足控制需求。这其中,神经网络的输入、输出参数需要得到调整;DQN算法中的回报(reward)需要修改;训练循环的计数方式以及训练周期等内容也需要调整。
最后,由于整个程序中加入了倒立摆的数值仿真,不仅参数和常数增多,程序也相对网格迷宫程序复杂了很多。因此,我们需要优化程序的编写,以提高程序的易读性和维护性。
主函数部分代码:
close all
clear all
clc
% Add DeepLearnToolbox to path
addpath(genpath('DeepLearningToolbox'));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% UWAGA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pokazanie = 0; % 1 -- prezentacja działania już nauczonej sieci(bez uczenia), sieci przechowywane są w pliku "savedAgents")
% 0 -- nauka sieci od początku
nazwa_sieci = "siec(300sesji)"; % (przykład) jeśli wybrana została wyżej opcja 1; % TUTAJ WPISUJEMY NAZWĘ NAZWĘ GOTOWEJ SIECI np. 'matlab1'
% Parametry wahadła (wartości te zostały zidentyfikowane na
% podstawie prawdziwego modelu, można je modyfikować)
tau1 = 0.036; % moment siły pojedyńczej akcji (maksymalny moment naszego rzeczywistego silnika wynosi 0.267)
% dla tau1 = 0 wahadło nie będzie miało żadnego pobudzenia
%(można testować zachowanie się wachadła tylko dla zadanych warnunków początkowych)
tau2 = 0; % zakłócenie wahadła (moment siły) % stała wartość lepiej robić to w simulinku blokiem jakiejś funkcji
L1 = 0.05; % długość ramienia od osi silnika
L2 = 0.1; % długość wahadła
l1 = 0.022; % długość punktów mas ramienia 1 od środka osi silnika (miejsce położenia łożysk, jest to większość masy ramienia 1)
l2 = L2/2; % odległość środka masy ramienia 2 od jego osi obrotu
m1 = 0.045; % masa środków masy ramienia 1
m2 = 0.015; % masa ramienia 2
J1 = 2*m1*l1^2; % moment bezwładności ramienia 1 (dwa łożyska składające symetrycznie w tej samej odległości od osi obrotu silnika się) nie zmieniać
J2 = 1/3*m2*L2^2; % moment bezwładności ramienia 2 nie zmieniać
b1 = -5*10^(-3); % tłumienie obrotu ramienia 1
b2 = -5*10^(-5); % tłumienie obrotu ramienia 2
g = 9.81; % przyśpieszenie ziemskie
J1_dash = J1;
J2_dash = J2;
J0_dash = J1_dash + m2*L1^2;
[1]蒋国飞,吴沧浦.基于Q学习算法和BP神经网络的倒立摆控制[J].自动化学报,1998(05):88-92.DOI:10.16383/j.aas.1998.05.014.