Этот пример показывает, как решить окружение мира сетки с помощью обучения с подкреплением путем настройки агентов Q-обучения и SARSA. Для получения дополнительной информации об этих агентах см. «Агенты Q-обучения» и «Агенты SARSA».
Это окружение мира сетки имеет следующее строение и правила:
Мир сетки 5 на 5 и ограничен границами, с четырьмя возможными действиями (Север = 1, Юг = 2, Восток = 3, Запад = 4).
Агент стартует с камеры [2,1] (вторая строка, первый столбец).
Агент получает вознаграждение + 10, если он достигает конечного состояния в камере [5,5] (синяя).
Среда содержит специальный переход от камеры [2,4] к камере [4,4] с вознаграждением + 5.
Агент блокируется препятствиями (черными камерами).
Все другие действия приводят к вознаграждению -1.
Создайте базовое окружение мира сетки.
env = rlPredefinedEnv("BasicGridWorld");
Чтобы указать, что начальное состояние агента всегда является [2,1], создайте функцию сброса, которая возвращает номер состояния для начального состояния агента. Эта функция вызывается в начале каждого эпизода тренировки и симуляции. Состояния нумеруются начиная с положения [1,1]. Номер состояния увеличивается при перемещении вниз по первому столбцу, а затем вниз по каждому последующему столбцу. Поэтому создайте указатель анонимной функции, который устанавливает начальное состояние на 2
.
env.ResetFcn = @() 2;
Исправьте начальное значение генератора для повторяемости.
rng(0)
Чтобы создать агента Q-обучения, сначала составьте Q-таблицу с помощью наблюдений и спецификаций действия от окружения мира сетки. Установите скорость обучения для представления равной 1.
qTable = rlTable(getObservationInfo(env),getActionInfo(env)); qRepresentation = rlQValueRepresentation(qTable,getObservationInfo(env),getActionInfo(env)); qRepresentation.Options.LearnRate = 1;
Затем создайте агента Q-обучения с помощью этого представления таблицы и сконфигурируйте эпсилоново-жадное исследование. Для получения дополнительной информации о создании агентов Q-обучения смотрите rlQAgent
и rlQAgentOptions
.
agentOpts = rlQAgentOptions; agentOpts.EpsilonGreedyExploration.Epsilon = .04; qAgent = rlQAgent(qRepresentation,agentOpts);
Чтобы обучить агента, сначала укажите опции обучения. В данном примере используйте следующие опции:
Обучайте на самое большее 200 эпизодах. Укажите, что каждый эпизод длится в течение большинства 50 временных шагов.
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше на 10 для 30 последовательных эпизодов.
Для получения дополнительной информации смотрите rlTrainingOptions
.
trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes= 200;
trainOpts.StopTrainingCriteria = "AverageReward";
trainOpts.StopTrainingValue = 11;
trainOpts.ScoreAveragingWindowLength = 30;
Обучите агента Q-обучения с помощью train
функция. Обучение может занять несколько минут. Чтобы сэкономить время при запуске этого примера, загрузите предварительно обученного агента путем установки doTraining
на false
. Чтобы обучить агента самостоятельно, установите doTraining
на true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train(qAgent,env,trainOpts); else % Load the pretrained agent for the example. load('basicGWQAgent.mat','qAgent') end
Откроется окно Диспетчер эпизодов (Episode Manager), в котором отображается процесс обучения.
Чтобы подтвердить результаты обучения, моделируйте агент в среде обучения.
Перед запуском симуляции визуализируйте окружение и сконфигурируйте визуализацию, чтобы сохранить трассировку состояний агента.
plot(env) env.Model.Viewer.ShowTrace = true; env.Model.Viewer.clearTrace;
Симулируйте агент в окружении с помощью sim
функция.
sim(qAgent,env)
Трассировка агента показывает, что агент успешно находит переход от камеры [2,4] к камере [4,4].
Чтобы создать агента SARSA, используйте то же представление Q-таблицы и жадную к эпсилону строение, что и для агента Q-обучения. Для получения дополнительной информации о создании агентов SARSA смотрите rlSARSAAgent
и rlSARSAAgentOptions
.
agentOpts = rlSARSAAgentOptions; agentOpts.EpsilonGreedyExploration.Epsilon = 0.04; sarsaAgent = rlSARSAAgent(qRepresentation,agentOpts);
Обучите агента SARSA с помощью train
функция. Обучение может занять несколько минут. Чтобы сэкономить время при запуске этого примера, загрузите предварительно обученного агента путем установки doTraining
на false
. Чтобы обучить агента самостоятельно, установите doTraining
на true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train(sarsaAgent,env,trainOpts); else % Load the pretrained agent for the example. load('basicGWSarsaAgent.mat','sarsaAgent') end
Чтобы подтвердить результаты обучения, моделируйте агент в среде обучения.
plot(env) env.Model.Viewer.ShowTrace = true; env.Model.Viewer.clearTrace;
Моделируйте агент в окружении.
sim(sarsaAgent,env)
Агент SARSA находит то же решение мира сетки, что и агент Q-обучения.