Этот пример показывает, как обучить пользовательский агент линейного квадратичного регулирования (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);
Зафиксируйте случайный seed генератора для воспроизводимости.
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;
Существует три состояния и три входных параметров для линейной системы, поэтому общее количество learnable параметров . Чтобы гарантировать удовлетворительную производительность агента, определите номер оценок параметра быть больше, чем дважды количество learnable параметров. В этом примере значение .
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 : -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);
Оптимальным вознаграждением дают .
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. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.