exponenta event banner

Подготовка пользовательского агента LQR

В этом примере показано, как обучить индивидуальный агент линейной квадратичной регуляции (LQR) управлять дискретно-временной линейной системой, смоделированной в MATLAB ®.

Создание среды линейной системы

Среда обучения армированию для этого примера представляет собой дискретно-временную линейную систему. Динамика для системы задается

xt + 1 = Axt + Но

Закон контроля обратной связи:

ut = -Kxt

Цель контроля - минимизировать квадратичную стоимость: J=∑t=0∞ (xt′Qxt+ut′Rut).

В этом примере системными матрицами являются

A = [1.050.050.050.051.050.0500.051.05] B = [0.100.20.10.50000.5]

A = [1.05,0.05,0.05;0.05,1.05,0.05;0,0.05,1.05];
B = [0.1,0,0.2;0.1,0.5,0;0,0,0.5]; 

Квадратичные матрицы затрат:

Q = [1031354149] R = [0.50000.50000.5]

Q = [10,3,1;3,5,4;1,4,9]; 
R = 0.5*eye(3);

Для этой среды вознаграждение в момент времени t дается rt=-xt′Qxt-ut′Rut, что является отрицательным результатом квадратичной стоимости. Таким образом, максимизация вознаграждения сводит к минимуму затраты. Начальные условия устанавливаются случайным образом функцией сброса.

Создайте интерфейс среды MATLAB для этой линейной системы и награды. myDiscreteEnv функция создает среду путем определения пользовательского step и reset функции. Дополнительные сведения о создании такой пользовательской среды см. в разделе Создание среды MATLAB с помощью пользовательских функций.

env = myDiscreteEnv(A,B,Q,R);

Зафиксируйте начальное число случайного генератора для воспроизводимости.

rng(0)

Создать настраиваемый агент LQR

Для задачи LQR Q-функция для данного управляющего усиления K может быть определена как QK (x, u) = [xu] HK [xu], где HK = [HxHxuHuxHuu] является симметричной положительной определенной матрицей.

Закон управления для максимизации QK равен u = - (Huu) -1Hux x, а коэффициент усиления обратной связи равен K = (Huu) -1Hux.

Матрица HK содержит m = 12n (n + 1) различных значений элементов, где n - сумма числа состояний и количества входов. Обозначим startкак вектор, соответствующий этим m элементам, где внедиагональные элементы в HK умножаются на два.

Представляем Q-функцию (Q-function) с помощью

QK (x, u) = θ (K) ϕ (x, u), где ϕ (x, u) является квадратной основной функцией с точки зрения x и u.

Агент LQR начинается со стабилизирующего контроллера K0. Чтобы получить начальный стабилизирующий контроллер, поместите полюса замкнутой системы A-BK0 внутрь круга блока.

K0 = place(A,B,[0.4,0.8,0.5]);

Для создания пользовательского агента необходимо создать подкласс rl.agent.CustomAgent абстрактный класс. Для пользовательского агента LQR определен пользовательский подкласс LQRCustomAgent. Дополнительные сведения см. в разделе Создание пользовательских агентов обучения усилению. Создайте пользовательский агент LQR с помощью Q, R и K0. Агенту не требуется информация о системных матрицах A и B.

agent = LQRCustomAgent(Q,R,K0);

В этом примере установите коэффициент скидки агента равным единице. Для использования дисконтированного будущего вознаграждения установите коэффициент дисконтирования меньше единицы.

agent.Gamma = 1;

Поскольку линейная система имеет три состояния и три входа, общее количество обучаемых параметров равно m = 21. Чтобы обеспечить удовлетворительную производительность агента, установите количество оценок параметров Np больше, чем в два раза больше числа обучаемых параметров. В этом примере значение Np = 45.

agent.EstimateNum = 45;

Чтобы получить хорошие результаты оценки, вы должны применить к системе постоянно возбужденную модель исследования. В этом примере поощряйте исследование модели, добавляя белый шум к выходному сигналу контроллера: ut = -Kxt + et. Как правило, модель исследования зависит от моделей системы.

Агент поезда

Для обучения агента сначала укажите варианты обучения. В этом примере используются следующие опции.

  • Запускать каждый учебный эпизод максимум для 10 эпизоды, причем каждый эпизод длится не более 50 временные шаги.

  • Отображение командной строки (установите Verbose и отключить ход обучения в диалоговом окне «Менеджер эпизодов» (установите Plots опция).

Дополнительные сведения см. в разделе rlTrainingOptions.

trainingOpts = rlTrainingOptions(...
    'MaxEpisodes',10, ...
    'MaxStepsPerEpisode',50, ...
    'Verbose',true, ...
    'Plots','none');

Обучение агента с помощью train функция.

trainingStats = train(agent,env,trainingOpts);
Episode:   1/ 10 | Episode Reward:   -55.16 | Episode Steps:   50 | Average Reward:   -55.16 | Step Count:   50
Episode:   2/ 10 | Episode Reward:   -12.52 | Episode Steps:   50 | Average Reward:   -33.84 | Step Count:  100
Episode:   3/ 10 | Episode Reward:   -15.59 | Episode Steps:   50 | Average Reward:   -27.76 | Step Count:  150
Episode:   4/ 10 | Episode Reward:   -22.22 | Episode Steps:   50 | Average Reward:   -26.37 | Step Count:  200
Episode:   5/ 10 | Episode Reward:   -14.32 | Episode Steps:   50 | Average Reward:   -23.96 | Step Count:  250
Episode:   6/ 10 | Episode Reward:   -19.23 | Episode Steps:   50 | Average Reward:   -16.78 | Step Count:  300
Episode:   7/ 10 | Episode Reward:   -34.14 | Episode Steps:   50 | Average Reward:   -21.10 | Step Count:  350
Episode:   8/ 10 | Episode Reward:   -13.95 | Episode Steps:   50 | Average Reward:   -20.77 | Step Count:  400
Episode:   9/ 10 | Episode Reward:   -36.01 | Episode Steps:   50 | Average Reward:   -23.53 | Step Count:  450
Episode:  10/ 10 | Episode Reward:   -12.43 | Episode Steps:   50 | Average Reward:   -23.15 | Step Count:  500

Моделирование агента и сравнение с оптимальным решением

Для проверки производительности обучаемого агента смоделируйте его в среде MATLAB. Дополнительные сведения о моделировании агентов см. в разделе rlSimulationOptions и sim.

simOptions = rlSimulationOptions('MaxSteps',20);
experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward)
totalReward = -20.1306

Вы можете вычислить оптимальное решение для проблемы LQR с помощью dlqr функция.

[Koptimal,P] = dlqr(A,B,Q,R); 

Оптимальное вознаграждение дает Joptimal=-x0′Px0.

x0 = experience.Observation.obs1.getdatasamples(1);
Joptimal = -x0'*P*x0;

Вычислите ошибку в вознаграждении между обученным агентом LQR и оптимальным решением LQR.

rewardError = totalReward - Joptimal
rewardError = 1.5270e-06

Просмотрите историю ошибки 2-norm в выигрыше между обученным агентом LQR и оптимальным решением LQR.

% number of gain updates
len = agent.KUpdate;
err = zeros(len,1);
for i = 1:len
    % norm of error in the gain
    err(i) = norm(agent.KBuffer{i}-Koptimal);
end  
plot(err,'b*-')

Figure contains an axes. The axes contains an object of type line.

Вычислите норму окончательной ошибки для коэффициента усиления обратной связи.

gainError = norm(agent.K - Koptimal)
gainError = 2.2458e-11

В целом обучаемый агент находит решение LQR, близкое к истинному оптимальному решению LQR.

См. также

Связанные темы