Этот пример показывает, как обучить пользовательский агент линейного квадратичного регулирования (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. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.