В этом примере показано, как обучить актера-критика (AC) балансировать систему тележек, смоделированную в MATLAB ®.
Дополнительные сведения об агентах AC см. в разделе Агенты актера-критика. Пример обучения агента AC с помощью параллельных вычислений см. в разделе Обучение агента AC балансированию системы Cart-Pole с помощью параллельных вычислений.
Среда обучения армированию для этого примера представляет собой столб, прикрепленный к неактивированному соединению на тележке, которое перемещается по безфрикционной дорожке. Цель тренировки - сделать маятник стоящим вертикально, не заваливаясь.

Для этой среды:
Уравновешенное вверх положение маятника 0 радианы, и положение подвешивания вниз pi радианы.
Маятник начинается вертикально с начального угла от -0,05 до 0,5 рад.
Сигнал силового воздействия от агента к окружающей среде составляет от -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 N.
Получение информации о наблюдениях и действиях из интерфейса среды.
obsInfo = getObservationInfo(env); actInfo = getActionInfo(env);
Зафиксируйте начальное число случайного генератора для воспроизводимости.
rng(0)
Агент AC аппроксимирует долгосрочное вознаграждение, учитывая наблюдения и действия, используя представление функции значения критика. Для создания критика сначала создать глубокую нейронную сеть с одним входом (наблюдение) и одним выходом (значение состояния). Входной размер критической сети равен 4, так как среда имеет четыре наблюдения. Дополнительные сведения о создании глубокого представления функции значений нейронной сети см. в разделе Создание представлений политик и функций значений.
criticNetwork = [
featureInputLayer(4,'Normalization','none','Name','state')
fullyConnectedLayer(1,'Name','CriticFC')];Укажите параметры критического представления с помощью rlRepresentationOptions.
criticOpts = rlRepresentationOptions('LearnRate',8e-3,'GradientThreshold',1);
Создайте критическое представление, используя заданную глубокую нейронную сеть и опции. Необходимо также указать информацию о действиях и наблюдениях для критика, которую можно получить из интерфейса среды. Дополнительные сведения см. в разделе rlValueRepresentation.
critic = rlValueRepresentation(criticNetwork,obsInfo,'Observation',{'state'},criticOpts);
Агент AC решает, какое действие предпринять, учитывая наблюдения, используя представление актера. Для создания актёра необходимо создать глубокую нейронную сеть с одним входом (наблюдение) и одним выходом (действие). Выходной размер акторной сети равен 2, так как среда имеет два возможных действия, -10 и 10.
Сконструировать актера аналогично критику. Дополнительные сведения см. в разделе rlStochasticActorRepresentation.
actorNetwork = [
featureInputLayer(4,'Normalization','none','Name','state')
fullyConnectedLayer(2,'Name','fc')
softmaxLayer('Name','actionProb')];
actorOpts = rlRepresentationOptions('LearnRate',8e-3,'GradientThreshold',1);
actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,...
'Observation',{'state'},actorOpts);Для создания агента AC сначала укажите параметры агента AC с помощью rlACAgentOptions.
agentOpts = rlACAgentOptions(... 'NumStepsToLookAhead',32, ... 'DiscountFactor',0.99);
Затем создайте агента, используя указанное представление актера и параметры агента по умолчанию. Дополнительные сведения см. в разделе rlACAgent.
agent = rlACAgent(actor,critic,agentOpts);
Для обучения агента сначала укажите варианты обучения. В этом примере используются следующие опции.
Запускать каждый учебный эпизод максимум для 1000 эпизодов, причем каждый эпизод длится не более 500 временных шагов.
Отображение хода обучения в диалоговом окне «Менеджер эпизодов» (установите Plots и отключите отображение командной строки (установите Verbose опция для false).
Прекратите обучение, когда агент получит среднее совокупное вознаграждение более 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 the 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