Обучите пользовательского агента 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 для этой линейной системы и вознаграждения. 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 элементы, где недиагональные элементы в 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 опция), и отключают процесс обучения в диалоговом окне Episode Manager (установите 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.

Смотрите также

Похожие темы