Обучите пользовательского агента 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);

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

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 : -56.92 | Episode Steps:   50 | Avg Reward : -56.92 | Step Count : 50
Episode:   2/ 10 | Episode Reward : -13.45 | Episode Steps:   50 | Avg Reward : -35.19 | Step Count : 100
Episode:   3/ 10 | Episode Reward : -21.52 | Episode Steps:   50 | Avg Reward : -30.63 | Step Count : 150
Episode:   4/ 10 | Episode Reward : -18.58 | Episode Steps:   50 | Avg Reward : -27.62 | Step Count : 200
Episode:   5/ 10 | Episode Reward : -11.43 | Episode Steps:   50 | Avg Reward : -24.38 | Step Count : 250
Episode:   6/ 10 | Episode Reward : -19.76 | Episode Steps:   50 | Avg Reward : -16.95 | Step Count : 300
Episode:   7/ 10 | Episode Reward : -12.21 | Episode Steps:   50 | Avg Reward : -16.70 | Step Count : 350
Episode:   8/ 10 | Episode Reward : -16.95 | Episode Steps:   50 | Avg Reward : -15.79 | Step Count : 400
Episode:   9/ 10 | Episode Reward : -45.29 | Episode Steps:   50 | Avg Reward : -21.13 | Step Count : 450
Episode:  10/ 10 | Episode Reward : -26.22 | Episode Steps:   50 | Avg Reward : -24.09 | Step Count : 500

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

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

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

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

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

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

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

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

rewardError = totalReward - Joptimal
rewardError = single
    8.7034e-07

Просмотрите историю 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
    1.6082e-06

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

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

Похожие темы

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