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