В этом примере показано, как автоматически сгенерировать премиальную функцию от стоимости и ограничительных технических требований, заданных в прогнозирующем объекте контроллера модели. Вы затем используете сгенерированную премиальную функцию, чтобы обучить агента обучения с подкреплением.
Можно использовать generateRewardFunction чтобы сгенерировать вознаграждение функционируют для обучения с подкреплением, начинающего со стоимости и ограничений, заданных в прогнозирующем контроллере модели. Получившимся сигналом вознаграждения является сумма затрат (как задано целевой функцией) и штрафы нарушения ограничений в зависимости от текущего состояния среды.
Этот пример основан на theDC Сервоприводе с Ограничением на Неизмеренный Выход (Model Predictive Control Toolbox) пример, в котором вы проектируете прогнозирующий контроллер модели для сервомеханизма DC под напряжением и ограничениями крутящего момента вала. Здесь, вы преобразуете стоимость и ограничительные технические требования, заданные в mpc объект в премиальную функцию и использование это, чтобы обучить агента управлять сервоприводом.
Откройте модель Simulink для этого примера, который является на основе вышеупомянутого примера MPC, но был изменен для обучения с подкреплением.
open_system('rl_motor')
![]()
![]()
![]()
Создайте динамическую модель разомкнутого контура двигателя, заданного в plant и максимальный допустимый крутящий момент tau использование функции помощника.
[plant,tau] = mpcmotormodel;
Задайте типы сигнала ввода и вывода для контроллера MPC. Угловое положение вала, измеряется, как сначала выведено. Второй выход, крутящий момент, неизмерим.
plant = setmpcsignals(plant,'MV',1,'MO',1,'UO',2);
Задайте ограничения на переменную, которой управляют и задайте масштабный коэффициент.
MV = struct('Min',-220,'Max',220,'ScaleFactor',440);
Наложите ограничения крутящего момента во время первых трех шагов предсказания и задайте масштабный коэффициент и для положения вала и для крутящего момента.
OV = struct('Min',{-Inf, [-tau;-tau;-tau;-Inf]},... 'Max',{Inf, [tau;tau;tau;Inf]},... 'ScaleFactor',{2*pi, 2*tau});
Задайте веса для квадратичной функции стоимости, чтобы достигнуть отслеживания углового положения. Обнулите вес для крутящего момента, таким образом, позволив ему плавать в рамках его ограничения.
Weights = struct('MV',0,'MVRate',0.1,'OV',[0.1 0]);
Создайте контроллер MPC для plant модель с шагом расчета 0.1 s, горизонт предсказания 10 шаги и горизонт управления 2 шаги, с помощью ранее заданных структур для весов, управляли переменными и выходными переменными.
mpcobj = mpc(plant,0.1,10,2,Weights,MV,OV);
Отобразите технические требования контроллера.
mpcobj
MPC object (created on 25-Aug-2021 20:00:40):
---------------------------------------------
Sampling time: 0.1 (seconds)
Prediction Horizon: 10
Control Horizon: 2
Plant Model:
--------------
1 manipulated variable(s) -->| 4 states |
| |--> 1 measured output(s)
0 measured disturbance(s) -->| 1 inputs |
| |--> 1 unmeasured output(s)
0 unmeasured disturbance(s) -->| 2 outputs |
--------------
Indices:
(input vector) Manipulated variables: [1 ]
(output vector) Measured outputs: [1 ]
Unmeasured outputs: [2 ]
Disturbance and Noise Models:
Output disturbance model: default (type "getoutdist(mpcobj)" for details)
Measurement noise model: default (unity gain after scaling)
Weights:
ManipulatedVariables: 0
ManipulatedVariablesRate: 0.1000
OutputVariables: [0.1000 0]
ECR: 10000
State Estimation: Default Kalman Filter (type "getEstimator(mpcobj)" for details)
Constraints:
-220 <= MV1 (V) <= 220, MV1/rate (V) is unconstrained, MO1 (rad) is unconstrained
-78.54 <= UO1 (Nm)(t+1) <= 78.54
-78.54 <= UO1 (Nm)(t+2) <= 78.54
-78.54 <= UO1 (Nm)(t+3) <= 78.54
UO1 (Nm)(t+4) is unconstrained
Контроллер работает с объектом с 4 состояниями, 1 вход (напряжение) и 2 выходных сигнала (угол и крутящий момент) и имеет следующие технические требования:
Веса функции стоимости для переменного, плавающего курса, которым управляют, которым управляют, и выходных переменных 0, 0.1 и [0.1 0] соответственно.
Переменная, которой управляют, ограничивается между-220V и 220 В.
Плавающий курс, которым управляют, неограничен.
Первая выходная переменная (угол) является неограниченной, но второй (крутящий момент), ограничивается между-78.54 нм и 78,54 нм в первых трех временных шагах предсказания и неограниченный на четвертом шаге.
Обратите внимание на то, что для обучения с подкреплением только ограничительная спецификация от первого временного шага предсказания будет использоваться, поскольку вознаграждение вычисляется для одного временного шага.
Сгенерируйте премиальный код функции из технических требований в mpc объект с помощью generateRewardFunction. Код отображен в редакторе MATLAB.
generateRewardFunction(mpcobj)
Сгенерированная премиальная функция является начальной точкой для премиального проекта. Можно изменить функцию с различным выбором функции штрафа и настроить веса. В данном примере внесите следующее изменение в сгенерированный код:
Масштабируйте исходные веса стоимости Qy, Qmv и Qmvrate на коэффициент 100.
Внешним методом функции штрафа по умолчанию является step. Измените метод в quadratic.
После того, как вы внесете изменения, технические требования стоимости и штрафа должны быть следующие:
Qy = [10 0]; Qmv = 0; Qmvrate = 10; Py = Wy * exteriorPenalty(y,ymin,ymax,'quadratic'); Pmv = Wmv * exteriorPenalty(mv,mvmin,mvmax,'quadratic'); Pmvrate = Wmvrate * exteriorPenalty(mv-lastmv,mvratemin,mvratemax,'quadratic');
В данном примере модифицированный код был сохранен в файле функции MATLAB rewardFunctionMpc.m. Отобразите сгенерированную премиальную функцию.
type rewardFunctionMpc.mfunction reward = rewardFunctionMpc(y,refy,mv,refmv,lastmv) % REWARDFUNCTIONMPC generates rewards from MPC specifications. % % Description of input arguments: % % y : Output variable from plant at step k+1 % refy : Reference output variable at step k+1 % mv : Manipulated variable at step k % refmv : Reference manipulated variable at step k % lastmv : Manipulated variable at step k-1 % % Limitations (MPC and NLMPC): % - Reward computed based on first step in prediction horizon. % Therefore, signal previewing and control horizon settings are ignored. % - Online cost and constraint update is not supported. % - Custom cost and constraint specifications are not considered. % - Time varying cost weights and constraints are not supported. % - Mixed constraint specifications are not considered (for the MPC case). % Reinforcement Learning Toolbox % 02-Jun-2021 16:05:41 %#codegen %% Specifications from MPC object % Standard linear bounds as specified in 'States', 'OutputVariables', and % 'ManipulatedVariables' properties ymin = [-Inf -78.5398163397448]; ymax = [Inf 78.5398163397448]; mvmin = -220; mvmax = 220; mvratemin = -Inf; mvratemax = Inf; % Scale factors as specified in 'States', 'OutputVariables', and % 'ManipulatedVariables' properties Sy = [6.28318530717959 157.07963267949]; Smv = 440; % Standard cost weights as specified in 'Weights' property Qy = [0.1 0]; Qmv = 0; Qmvrate = 0.1; %% Compute cost dy = (refy(:)-y(:)) ./ Sy'; dmv = (refmv(:)-mv(:)) ./ Smv'; dmvrate = (mv(:)-lastmv(:)) ./ Smv'; Jy = dy' * diag(Qy.^2) * dy; Jmv = dmv' * diag(Qmv.^2) * dmv; Jmvrate = dmvrate' * diag(Qmvrate.^2) * dmvrate; Cost = Jy + Jmv + Jmvrate; %% Penalty function weight (specify nonnegative) Wy = [1 1]; Wmv = 10; Wmvrate = 10; %% Compute penalty % Penalty is computed for violation of linear bound constraints. % % To compute exterior bound penalty, use the exteriorPenalty function and % specify the penalty method as 'step' or 'quadratic'. % % Alternatively, use the hyperbolicPenalty or barrierPenalty function for % computing hyperbolic and barrier penalties. % % For more information, see help for these functions. % % Set Pmv value to 0 if the RL agent action specification has % appropriate 'LowerLimit' and 'UpperLimit' values. Py = Wy * exteriorPenalty(y,ymin,ymax,'step'); Pmv = Wmv * exteriorPenalty(mv,mvmin,mvmax,'step'); Pmvrate = Wmvrate * exteriorPenalty(mv-lastmv,mvratemin,mvratemax,'step'); Penalty = Py + Pmv + Pmvrate; %% Compute reward reward = -(Cost + Penalty); end
Чтобы интегрировать эту премиальную функцию, откройте блок MATLAB function в модели Simulink.
open_system('rl_motor/Reward Function')Добавьте функцию со следующей строкой кода и сохраните модель.
r = rewardFunctionMpc(y,refy,mv,refmv,lastmv);
Блок MATLAB function теперь выполнит rewardFunctionMpc.m в процессе моделирования.
В данном примере блок MATLAB function был уже изменен и сохранен.![]()
Динамика окружения моделируется в подсистеме Сервомеханизма. Для этой среды,
Наблюдения являются ссылочными и фактическими выходными переменными (угол и крутящий момент) от последних 8 временных шагов.
Действие является напряжением примененный сервопривод.
Шаг расчета .
Общее время симуляции .
Задайте общее время симуляции и шаг расчета.
Tf = 20; Ts = 0.1;
Создайте спецификации наблюдений и спецификации действия для среды.
numObs = 32; numAct = 1; oinfo = rlNumericSpec([numObs 1]); ainfo = rlNumericSpec([numAct 1],'LowerLimit',-220,'UpperLimit',220);
Создайте среду обучения с подкреплением с помощью rlSimulinkEnv функция.
env = rlSimulinkEnv('rl_motor','rl_motor/RL Agent',oinfo,ainfo);
Зафиксируйте случайный seed для воспроизводимости.
rng(0)
Агент в этом примере является Двойным Задержанным Глубоким Детерминированным Градиентом политики (TD3) агент.
Создайте два представления критика.
% Critic cnet = [ featureInputLayer(numObs,'Normalization','none','Name', 'State') fullyConnectedLayer(128, 'Name', 'fc1') concatenationLayer(1,2,'Name','concat') reluLayer('Name','relu1') fullyConnectedLayer(64, 'Name', 'fc3') reluLayer('Name','relu2') fullyConnectedLayer(1, 'Name', 'CriticOutput')]; actionPath = [ featureInputLayer(numAct,'Normalization','none', 'Name', 'Action') fullyConnectedLayer(8, 'Name', 'fc2')]; criticNetwork = layerGraph(cnet); criticNetwork = addLayers(criticNetwork, actionPath); criticNetwork = connectLayers(criticNetwork,'fc2','concat/in2'); criticOptions = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1); critic1 = rlQValueRepresentation(criticNetwork,oinfo,ainfo,... 'Observation',{'State'},'Action',{'Action'},criticOptions); critic2 = rlQValueRepresentation(criticNetwork,oinfo,ainfo,... 'Observation',{'State'},'Action',{'Action'},criticOptions);
Создайте представление актера.
actorNetwork = [
featureInputLayer(numObs,'Normalization','none','Name','State')
fullyConnectedLayer(128, 'Name','actorFC1')
reluLayer('Name','relu1')
fullyConnectedLayer(64, 'Name','actorFC2')
reluLayer('Name','relu2')
fullyConnectedLayer(numAct,'Name','Action')];
actorOptions = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1);
actor = rlDeterministicActorRepresentation(actorNetwork,oinfo,ainfo,...
'Observation',{'State'},'Action',{'Action'},actorOptions);Задайте опции агента с помощью rlTD3AgentOptions. Агент обучает от буфера опыта максимальной способности 1e6 путем случайного выбора мини-пакетов размера 256. Коэффициент дисконтирования 0.995 способствует долгосрочным вознаграждениям.
agentOpts = rlTD3AgentOptions("SampleTime",Ts, ... "DiscountFactor", 0.995, ... "ExperienceBufferLength",1e6, ... "MiniBatchSize",256);
Модель исследования в этом агенте TD3 является Гауссовой. Шумовая модель добавляет универсальное случайное значение в действие во время обучения. Установите стандартное отклонение шума к 100. Стандартное отклонение затухает по курсу 1e-5 каждый шаг агента до минимального значения 0.005.
agentOpts.ExplorationModel.StandardDeviationMin = 0.005; agentOpts.ExplorationModel.StandardDeviation = 100; agentOpts.ExplorationModel.StandardDeviationDecayRate = 1e-5;
Создайте агента TD3 с помощью представлений актёра и критика. Для получения дополнительной информации об агентах TD3 смотрите rlTD3Agent.
agent = rlTD3Agent(actor,[critic1,critic2],agentOpts);
Чтобы обучить агента, сначала задайте опции обучения с помощью rlTrainingOptions. В данном примере используйте следующие опции:
Запустите каждое обучение самое большее 2 000 эпизодов с каждым эпизодом, длящимся в большей части ceil(Tf/Ts) временные шаги.
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем -2 по 20 последовательные эпизоды. На данном этапе агент может отследить опорный сигнал.
trainOpts = rlTrainingOptions(... 'MaxEpisodes',2000, ... 'MaxStepsPerEpisode',ceil(Tf/Ts), ... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',-2,... 'ScoreAveragingWindowLength',20);
Обучите агента с помощью train функция. Обучение этот агент является в вычислительном отношении интенсивным процессом, который может занять несколько минут, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученного агента установкой doTraining к false. Чтобы обучить агента самостоятельно, установите doTraining к true.
doTraining = false; if doTraining trainingStats = train(agent,env,trainOpts); else load('rlDCServomotorTD3Agent.mat') end
Снимок состояния процесса обучения показывают в следующем рисунке. Можно ожидать различные результаты из-за свойственной случайности в учебном процессе.

![]()
![]()
![]()
Чтобы подтвердить производительность обученного агента, симулируйте модель и просмотрите ответ в блоках Scope. Агент обучения с подкреплением может отследить опорный угол при удовлетворении ограничениям на крутящий момент и напряжение.
sim('rl_motor');
![]()


Закройте модель.
close_system('rl_motor')Copyright 2021 The MathWorks, Inc..