DQN算法控制模拟旋转摆(Matlab代码实现)

文章介绍了使用DQN算法控制倒立摆的经典控制问题,通过MatLab进行数值仿真建模,调整DQN参数以适应倒立摆环境。主要内容包括动力学方程的建立、Ode45函数的应用、神经网络和算法的参数优化,以及程序的重构以提高可读性和维护性。
摘要由CSDN通过智能技术生成

       目录

💥1 概述

📚2 运行结果

🎉3 参考文献

👨‍💻4 Matlab代码


💥1 概述

本期我们尝试用DQN控制倒立摆。倒立摆是非常经典的控制问题,如果DQN能够有效实现倒立摆的控制,也就意味着DQN等强化学习算法适用于更复杂的动力学控制问题,即就是说,采用相似的思想,我们可以将强化学习算法用于机械臂控制、卫星姿态控制等工程问题上。

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

第一个问题中,倒立摆的动力学方程可以整理为常微分方程;同时,为了更好地与之前我们掌握的神经网络工具箱结合,我们使用MatLab的Ode45()函数实现动力学仿真。

第二个问题,我们需要根据倒立摆问题调整神经网络和DQN算法的相关参数,使之能够满足控制需求。这其中,神经网络的输入、输出参数需要得到调整;DQN算法中的回报(reward)需要修改;训练循环的计数方式以及训练周期等内容也需要调整。

最后,由于整个程序中加入了倒立摆的数值仿真,不仅参数和常数增多,程序也相对网格迷宫程序复杂了很多。因此,我们需要优化程序的编写,以提高程序的易读性和维护性。

📚2 运行结果

主函数部分代码:

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;

🎉3 参考文献

[1]蒋国飞,吴沧浦.基于Q学习算法和BP神经网络的倒立摆控制[J].自动化学报,1998(05):88-92.DOI:10.16383/j.aas.1998.05.014.

👨‍💻4 Matlab代码

以下是DQN算法控制倒立实例中的MATLAB代码: ```matlab clc; clear all; %% 初始化环境 % 参数 M = 1; % 杆质量 m = 0.1; % 小车质量 b = 0.1; % 摩擦系数 l = 0.5; % 杆长度 g = 9.8; % 重力加速度 Ts = 0.01; % 采样时间 maxTime = 20; % 最大仿真时间 maxStep = maxTime/Ts; % 最大仿真步数 x0 = [0; 0; pi; 0]; % 初始状态 thetaThresholdRadians = 12 * pi/180; % 杆倾斜的阈值 % 状态空间 % x: 小车位置 % dx: 小车速度 % theta: 杆倾斜角度 % dtheta: 杆角速度 % 状态变量:[x; dx; theta; dtheta] % 状态空间范围:[-Inf, Inf] stateBounds = [-inf, inf; -inf, inf; -pi, pi; -inf, inf]; % 动作空间 % u: 小车加速度 % 动作变量:u % 动作空间范围:[-2, 2] actionBounds = [-2, 2]; % DQN算法参数 numObservations = numel(x0); numActions = numel(actionBounds(:,1)); numHiddenUnits = 32; net = fitnet(numHiddenUnits); net.layers{2}.transferFcn = 'poslin'; net.input.processFcns = {'removeconstantrows','mapminmax'}; net.output.processFcns = {'removeconstantrows','mapminmax'}; opts = rlTrainingOptions('MaxEpisodes', 500, 'MaxStepsPerEpisode', maxStep, 'Verbose', false, 'Plots', 'training-progress'); agent = rlDQNAgent(net, numObservations, numActions, 'Observation', {'state'}, 'Action', {'action'}, opts); % 环境 env = rlSimulinkEnv('discretePendulumCartPole'); % 验证环节 % reset(env) % env.ModelState.Data(:) = x0; % [observation, reward, isDone, info] = step(env, 1); % disp(observation); %% 训练 % 训练 trainingStats = train(agent, env, opts); %% 仿真 % 仿真 simOptions = rlSimulationOptions('MaxSteps', maxStep); experience = sim(env, agent, simOptions); % 绘图 % 状态 figure plot(experience.Observation.state(:,1), 'r'); hold on; plot(experience.Observation.state(:,2), 'g'); plot(experience.Observation.state(:,3), 'b'); plot(experience.Observation.state(:,4), 'm'); title('States') legend('x', 'dx', 'theta', 'dtheta') xlabel('Steps') ylabel('Values') % 动作 figure plot(experience.Action.action, 'r'); title('Actions') xlabel('Steps') ylabel('Action') % 奖励 figure plot(experience.Reward, 'r'); title('Rewards') xlabel('Steps') ylabel('Reward') % 杆倾斜角度 figure thetaRadians = experience.Observation.state(:,3); thetaDegrees = rad2deg(thetaRadians); thetaThresholdDegrees = rad2deg(thetaThresholdRadians); plot(thetaDegrees) hold on plot([0, maxStep], [thetaThresholdDegrees, thetaThresholdDegrees],'r') plot([0, maxStep], [-thetaThresholdDegrees, -thetaThresholdDegrees],'r') title('Pole Angle') ylabel('Degrees') xlabel('Steps') ``` 该代码使用了MATLAB的深度学习工具箱来实现DQN算法,同时使用了Simulink环境来模拟控制倒立的运动。在训练过程中,agent将state作为输入,输出一个action;在仿真过程中,agent根据当前的状态选择一个动作来控制小车的运动,从而实现控制倒立的目的。最终,我们可以通过绘制状态、动作和奖励的变化以及杆倾斜角度的变化来评价DQN算法的性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值