Этот пример показывает, как обучить агент критика агента (AC) балансировать полюсную корзиной систему, смоделированную в MATLAB®.
Для получения дополнительной информации об агентах AC смотрите Агенты Критика Агента. Для примера на учебном агенте AC с помощью параллельных вычислений смотрите Агент AC Train, чтобы Сбалансировать полюсную Корзиной Систему Используя пример Параллельных вычислений.
Среда обучения укрепления для этого примера является полюсом, присоединенным к неприводимому в действие соединению на корзине, которая проходит лишенная трения дорожка. Учебная цель состоит в том, чтобы заставить маятник стоять вертикально без падения.
Для этой среды:
Восходящее сбалансированное положение маятника является радианами 0
, и нисходящее положение зависания является радианами pi
Маятник запускается вертикально с начального угла + радианы/-0.05
Сигнал действия силы от агента до среды от-10 до 10 Н
Наблюдения от среды являются положением и скоростью корзины, угла маятника и его производной
Эпизод останавливается, если полюс является больше чем 12 градусами вертикали, или корзина перемещает больше чем 2,4 м от исходного положения
Вознаграждение +1 предоставлено для каждого временного шага, что полюс остается вертикальным. Штраф-5 применяется, когда маятник падает.
Для получения дополнительной информации об этой модели смотрите Загрузку Предопределенные Среды Системы управления.
Создайте предопределенный интерфейс среды для маятника.
env = rlPredefinedEnv("CartPole-Discrete")
env = CartPoleDiscreteAction with properties: Gravity: 9.8000 MassCart: 1 MassPole: 0.1000 Length: 0.5000 MaxForce: 10 Ts: 0.0200 ThetaThresholdRadians: 0.2094 XThreshold: 2.4000 RewardForNotFalling: 1 PenaltyForFalling: -5 State: [4×1 double]
env.PenaltyForFalling = -10;
Интерфейс имеет дискретный пробел действия, где агент может применить одно из двух возможных значений силы к корзине,-10 или 10 Н.
Получите информацию о наблюдении и действии из интерфейса среды.
obsInfo = getObservationInfo(env); actInfo = getActionInfo(env);
Зафиксируйте случайный seed генератора для воспроизводимости.
rng(0)
Агент AC аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с одним входом (наблюдение) и один вывод (значение состояния). Входным размером сети критика является [4 1 1]
, поскольку среда имеет 4 наблюдения. Для получения дополнительной информации о создании представления функции значения глубокой нейронной сети смотрите, Создают политику и Представления Функции Значения.
criticNetwork = [ imageInputLayer([4 1 1],'Normalization','none','Name','state') fullyConnectedLayer(1,'Name','CriticFC')];
Задайте опции для представления критика с помощью rlRepresentationOptions
.
criticOpts = rlRepresentationOptions('LearnRate',8e-3,'GradientThreshold',1);
Создайте представление критика с помощью заданной глубокой нейронной сети и опций. Необходимо также указать информацию действия и наблюдения для критика, которого вы уже получили из интерфейса среды. Для получения дополнительной информации смотрите rlRepresentation
.
critic = rlRepresentation(criticNetwork,obsInfo,'Observation',{'state'},criticOpts);
Агент AC решает который действие взять данный наблюдения с помощью представления агента. Чтобы создать агента, создайте глубокую нейронную сеть с одним входом (наблюдение) и один вывод (действие). Выходной размер сети агента 2, поскольку среда имеет 2 возможных действия, -10
и 10
.
Создайте агента подобным образом критику.
actorNetwork = [ imageInputLayer([4 1 1],'Normalization','none','Name','state') fullyConnectedLayer(2,'Name','action')]; actorOpts = rlRepresentationOptions('LearnRate',8e-3,'GradientThreshold',1); actor = rlRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'state'},'Action',{'action'},actorOpts);
Чтобы создать агент AC, сначала задайте опции агента AC с помощью rlACAgentOptions
.
agentOpts = rlACAgentOptions(... 'NumStepsToLookAhead',32, ... 'DiscountFactor',0.99);
Затем создайте агент с помощью заданного представления агента и опций агента по умолчанию. Для получения дополнительной информации смотрите rlACAgent
.
agent = rlACAgent(actor,critic,agentOpts);
Чтобы обучить агент, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждый учебный эпизод для самое большее 1 000 эпизодов с каждым эпизодом, длящимся самое большее 500 временных шагов.
Отобразитесь учебный прогресс диалогового окна Episode Manager (установите опцию Plots
), и отключите отображение командной строки (установите опцию Verbose
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем 480 более чем 10 последовательных эпизодов. На данном этапе агент может сбалансировать маятник в вертикальном положении.
Для получения дополнительной информации смотрите rlTrainingOptions
.
trainOpts = rlTrainingOptions(... 'MaxEpisodes',1000, ... 'MaxStepsPerEpisode',500, ... 'Verbose',false, ... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',480,... 'ScoreAveragingWindowLength',10);
Полюсная корзиной система может визуализироваться с использованием функции plot
во время обучения или симуляции.
plot(env)
Обучите агент с помощью функции train
. Это - в вычислительном отношении интенсивный процесс, который занимает несколько минут, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученный агент установкой doTraining
к false
. Чтобы обучить агент самостоятельно, установите doTraining
на true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainOpts); else % Load pretrained agent for the example. load('MATLABCartpoleAC.mat','agent'); end
Чтобы подтвердить производительность обученного агента, моделируйте его в полюсной корзиной среде. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward)
totalReward = 500
MATLAB и Simulink являются зарегистрированными торговыми марками MathWorks, Inc. См. www.mathworks.com/trademarks для списка других товарных знаков, принадлежавших MathWorks, Inc. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.