Этот пример показывает, как обучить пользовательского агента линейной квадратичной регуляции (LQR) управлять линейной системой в дискретном времени, смоделированной в MATLAB ®.
Окружение обучения с подкреплением для этого примера является линейной системой дискретного времени. Динамика для системы определяется как
Закон о регулировании с обратной связью
Цель управления состоит в том, чтобы минимизировать квадратичные затраты: .
В этом примере системные матрицы
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 для этой линейной системы и вознаграждения. The myDiscreteEnv
функция создает окружение путем определения пользовательских step
и reset
функций. Дополнительные сведения о создании такого пользовательского окружения см. в разделе Создание окружении MATLAB с использованием пользовательских функций.
env = myDiscreteEnv(A,B,Q,R);
Исправьте начальное значение генератора для повторяемости.
rng(0)
Для задачи LQR, Q-функция для заданного усиления управления может быть определено как , где является симметричной, положительно определенной матрицей.
Закон о контроле для максимизации является , и коэффициент усиления обратной связи .
Матрица содержит отдельные значения элементов, где - сумма количества состояний и количества входов. Обозначить как вектор, соответствующий этим элементы, где off-diagonal элементы в умножаются на два.
Представьте Q-функцию , где содержит параметры, которые нужно узнать.
, где - квадратичная функция базиса с точки зрения и .
Агент 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;
Поскольку линейная система имеет три состояния и три входов, общее количество настраиваемых параметров . Чтобы гарантировать удовлетворительную эффективность агента, установите количество оценок параметра быть больше, чем в два раза больше количества настраиваемых параметров. В этом примере значение является .
agent.EstimateNum = 45;
Чтобы получить хорошие результаты оценки для необходимо применить к системе постоянно возбужденную модель исследования. В этом примере поощряйте исследование модели путем добавления белого шума к контроллер выходу: . В целом исследовательская модель зависит от системных моделей.
Чтобы обучить агента, сначала укажите опции обучения. В данном примере используйте следующие опции.
Запускайте каждый эпизод тренировки самое большее для 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-нормы ошибки в коэффициентах усиления между обученным агентом 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.