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

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

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

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

xt+1=Axt+But

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

ut=-Kxt.

Цель управления состоит в том, чтобы минимизировать квадратичную стоимость J=t=0(xtQx t+utРутенийt).

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

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);

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

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;

Существует три состояния и три входных параметров для линейной системы, поэтому общее количество learnable параметров m=21. Чтобы гарантировать удовлетворительную производительность агента, определите номер оценок параметра Np быть больше, чем дважды количество learnable параметров. В этом примере значение 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 : -35.31 | Episode Steps:   50 | Avg Reward : -35.31 | Step Count : 50
Episode:   2/ 10 | Episode Reward : -28.66 | Episode Steps:   50 | Avg Reward : -31.99 | Step Count : 100
Episode:   3/ 10 | Episode Reward : -31.65 | Episode Steps:   50 | Avg Reward : -31.88 | Step Count : 150
Episode:   4/ 10 | Episode Reward : -25.57 | Episode Steps:   50 | Avg Reward : -30.30 | Step Count : 200
Episode:   5/ 10 | Episode Reward : -17.66 | Episode Steps:   50 | Avg Reward : -27.77 | Step Count : 250
Episode:   6/ 10 | Episode Reward : -20.21 | Episode Steps:   50 | Avg Reward : -24.75 | Step Count : 300
Episode:   7/ 10 | Episode Reward : -19.78 | Episode Steps:   50 | Avg Reward : -22.97 | Step Count : 350
Episode:   8/ 10 | Episode Reward : -7.37 | Episode Steps:   50 | Avg Reward : -18.12 | Step Count : 400
Episode:   9/ 10 | Episode Reward : -23.41 | Episode Steps:   50 | Avg Reward : -17.69 | Step Count : 450
Episode:  10/ 10 | Episode Reward : -16.25 | Episode Steps:   50 | Avg Reward : -17.40 | Step Count : 500

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

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

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

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

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

Оптимальным вознаграждением дают Jоптимальный=-x0Пкс0.

x0 = experience.Observation.obs1.Data(1,:)';
Joptimal = -x0'*P*x0;

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

rewardError = totalReward - Joptimal
rewardError = single
    2.6321e-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 = single
    2.1597e-06

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

MATLAB и Simulink являются зарегистрированными торговыми марками MathWorks, Inc. См. www.mathworks.com/trademarks для списка других товарных знаков, принадлежавших MathWorks, Inc. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте