В этом примере показано, как обучить индивидуальный агент линейной квадратичной регуляции (LQR) управлять дискретно-временной линейной системой, смоделированной в MATLAB ®.
Среда обучения армированию для этого примера представляет собой дискретно-временную линейную систему. Динамика для системы задается
+ Но
Закон контроля обратной связи:
Kxt
Цель контроля - минимизировать квадратичную стоимость: ).
В этом примере системными матрицами являются
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 = [10,3,1;3,5,4;1,4,9]; R = 0.5*eye(3);
Для этой среды вознаграждение в момент дается что является отрицательным результатом квадратичной стоимости. Таким образом, максимизация вознаграждения сводит к минимуму затраты. Начальные условия устанавливаются случайным образом функцией сброса.
Создайте интерфейс среды MATLAB для этой линейной системы и награды. myDiscreteEnv функция создает среду путем определения пользовательского step и reset функции. Дополнительные сведения о создании такой пользовательской среды см. в разделе Создание среды MATLAB с помощью пользовательских функций.
env = myDiscreteEnv(A,B,Q,R);
Зафиксируйте начальное число случайного генератора для воспроизводимости.
rng(0)
Для задачи LQR Q-функция для данного управляющего усиления может быть определена как HK [xu], HxHxuHuxHuu] является симметричной положительной определенной матрицей.
Закон управления для максимизации равен -1Hux x, а коэффициент усиления обратной связи -1Hux.
Матрица содержит + 1) различных значений элементов, где n - сумма числа состояний и количества входов. Обозначим startкак вектор, соответствующий этим m элементам, где внедиагональные в HK умножаются на два.
Представляем Q-функцию (Q-function) с помощью
(x, u), (x, u) является квадратной основной функцией с точки зрения и u.
Агент LQR начинается со стабилизирующего контроллера . Чтобы получить начальный стабилизирующий контроллер, поместите полюса замкнутой системы внутрь круга блока.
K0 = place(A,B,[0.4,0.8,0.5]);
Для создания пользовательского агента необходимо создать подкласс rl.agent.CustomAgent абстрактный класс. Для пользовательского агента LQR определен пользовательский подкласс LQRCustomAgent. Дополнительные сведения см. в разделе Создание пользовательских агентов обучения усилению. Создайте пользовательский агент LQR с помощью , и . Агенту не требуется информация о системных матрицах и .
agent = LQRCustomAgent(Q,R,K0);
В этом примере установите коэффициент скидки агента равным единице. Для использования дисконтированного будущего вознаграждения установите коэффициент дисконтирования меньше единицы.
agent.Gamma = 1;
Поскольку линейная система имеет три состояния и три входа, общее количество обучаемых параметров равно 21. Чтобы обеспечить удовлетворительную производительность агента, установите количество параметров Np больше, чем в два раза больше числа обучаемых параметров. В этом примере значение = 45.
agent.EstimateNum = 45;
Чтобы получить хорошие результаты оценки, вы должны применить к системе постоянно возбужденную модель исследования. В этом примере поощряйте исследование модели, добавляя белый шум к выходному сигналу контроллера: + 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);
Оптимальное вознаграждение дает .
x0 = experience.Observation.obs1.getdatasamples(1); Joptimal = -x0'*P*x0;
Вычислите ошибку в вознаграждении между обученным агентом LQR и оптимальным решением LQR.
rewardError = totalReward - Joptimal
rewardError = 1.5270e-06
Просмотрите историю ошибки 2-norm в выигрыше между обученным агентом 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 = 2.2458e-11
В целом обучаемый агент находит решение LQR, близкое к истинному оптимальному решению LQR.