dqn算法代码用控制倒立摆实例matlab
时间: 2023-08-23 14:40:25 浏览: 293
以下是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算法的性能。
阅读全文