В этом примере показано, как обучить агента критика агента (AC) балансировать полюсную корзиной систему, смоделированную в MATLAB®.
Для получения дополнительной информации об агентах AC смотрите Агентов Критика Агента. Для примера на учебном агенте AC с помощью параллельных вычислений смотрите, Обучают Агента AC Балансировать полюсную Корзиной Систему Используя пример Параллельных вычислений.
Среда обучения с подкреплением для этого примера является полюсом, присоединенным к неприводимому в движение соединению на корзине, которая проходит лишенная трения дорожка. Учебная цель состоит в том, чтобы заставить маятник стоять вертикально без падения.
Для этой среды:
Восходящим сбалансированным положением маятника является 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: [4x1 double]
env.PenaltyForFalling = -10;
Интерфейс имеет дискретный пробел действия, где агент может применить одно из двух возможных значений силы к корзине,-10 или 10 Н.
Получите информацию о наблюдении и действии из интерфейса среды.
obsInfo = getObservationInfo(env); actInfo = getActionInfo(env);
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
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