Обучите пользовательского агента LQR

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

Создайте линейное системное Окружение

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

xt+1=Axt+But

Закон о регулировании с обратной связью

ut=-Kxt

Цель управления состоит в том, чтобы минимизировать квадратичные затраты: J=t=0(xtQxt+utRut).

В этом примере системные матрицы

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=-xtQxt-utRut, что является негативом квадратичной стоимости. Поэтому максимизация вознаграждения минимизирует стоимость. Начальные условия задаются случайным образом функцией сброса.

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

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

Исправьте начальное значение генератора для повторяемости.

rng(0)

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

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

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

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

Представьте Q-функцию θ, где θ содержит параметры, которые нужно узнать.

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=-x0Px0.

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

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

rewardError = totalReward - Joptimal
rewardError = 1.5270e-06

Просмотрите историю 2-нормы ошибки в коэффициентах усиления между обученным агентом 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.

См. также

Похожие темы