Обучите пользовательского агента 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 | Avg Reward : -55.16 | Step Count : 50
Episode:   2/ 10 | Episode Reward : -12.52 | Episode Steps:   50 | Avg Reward : -33.84 | Step Count : 100
Episode:   3/ 10 | Episode Reward : -15.59 | Episode Steps:   50 | Avg Reward : -27.76 | Step Count : 150
Episode:   4/ 10 | Episode Reward : -22.22 | Episode Steps:   50 | Avg Reward : -26.37 | Step Count : 200
Episode:   5/ 10 | Episode Reward : -14.32 | Episode Steps:   50 | Avg Reward : -23.96 | Step Count : 250
Episode:   6/ 10 | Episode Reward : -19.23 | Episode Steps:   50 | Avg Reward : -16.78 | Step Count : 300
Episode:   7/ 10 | Episode Reward : -34.14 | Episode Steps:   50 | Avg Reward : -21.10 | Step Count : 350
Episode:   8/ 10 | Episode Reward : -13.95 | Episode Steps:   50 | Avg Reward : -20.77 | Step Count : 400
Episode:   9/ 10 | Episode Reward : -36.01 | Episode Steps:   50 | Avg Reward : -23.53 | Step Count : 450
Episode:  10/ 10 | Episode Reward : -12.43 | Episode Steps:   50 | Avg 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*-')

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

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

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

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

Похожие темы