Этот пример показывает, как обучить агента Q-обучения для решения общего окружения марковского процесса принятия решений (MDP). Для получения дополнительной информации об этих агентах см. Раздел «Агенты Q-обучения».
Окружение MDP имеет следующий график.
Здесь:
Каждый кружок представляет состояние.
В каждом состоянии существует решение подняться или опуститься.
Агент стартует с состояния 1.
Агент получает вознаграждение, равное значению на каждом переходе в графике.
Цель обучения состоит в том, чтобы собрать максимальное совокупное вознаграждение.
Создайте модель MDP с восемью состояниями и двумя действиями («вверх» и «вниз»).
MDP = createMDP(8,["up";"down"]);
Чтобы смоделировать переходы в вышеупомянутом графе, измените матрицу переходов и матрицу вознаграждения MDP. По умолчанию эти матрицы содержат нули. Для получения дополнительной информации о создании модели MDP и свойствах объекта MDP, смотрите createMDP
.
Задайте матрицы переходов и вознаграждения для MDP. Для примера следующими командами:
Первые две линии определяют переход от состояния 1 к состоянию 2 путем принятия мер 1
(«вверх») и вознаграждение + 3 за этот переход.
Следующие две линии задают переход от состояния 1 к состоянию 3 путем принятия мер 2
(«вниз») и вознаграждение + 1 за этот переход.
MDP.T(1,2,1) = 1; MDP.R(1,2,1) = 3; MDP.T(1,3,2) = 1; MDP.R(1,3,2) = 1;
Точно так же задайте изменения состояния и вознаграждения для остальных правил в графике.
% State 2 transition and reward MDP.T(2,4,1) = 1; MDP.R(2,4,1) = 2; MDP.T(2,5,2) = 1; MDP.R(2,5,2) = 1; % State 3 transition and reward MDP.T(3,5,1) = 1; MDP.R(3,5,1) = 2; MDP.T(3,6,2) = 1; MDP.R(3,6,2) = 4; % State 4 transition and reward MDP.T(4,7,1) = 1; MDP.R(4,7,1) = 3; MDP.T(4,8,2) = 1; MDP.R(4,8,2) = 2; % State 5 transition and reward MDP.T(5,7,1) = 1; MDP.R(5,7,1) = 1; MDP.T(5,8,2) = 1; MDP.R(5,8,2) = 9; % State 6 transition and reward MDP.T(6,7,1) = 1; MDP.R(6,7,1) = 5; MDP.T(6,8,2) = 1; MDP.R(6,8,2) = 1; % State 7 transition and reward MDP.T(7,7,1) = 1; MDP.R(7,7,1) = 0; MDP.T(7,7,2) = 1; MDP.R(7,7,2) = 0; % State 8 transition and reward MDP.T(8,8,1) = 1; MDP.R(8,8,1) = 0; MDP.T(8,8,2) = 1; MDP.R(8,8,2) = 0;
Задайте состояния "s7"
и "s8"
как конечные состояния MDP.
MDP.TerminalStates = ["s7";"s8"];
Создайте окружение MDP обучения с подкреплением для этой модели процесса.
env = rlMDPEnv(MDP);
Чтобы указать, что начальное состояние агента всегда является состоянием 1, задайте функцию сброса, которая возвращает начальное состояние агента. Эта функция вызывается в начале каждого эпизода тренировки и симуляции. Создайте указатель анонимной функции, который устанавливает начальное состояние равным 1.
env.ResetFcn = @() 1;
Исправьте начальное значение генератора для повторяемости.
rng(0)
Чтобы создать агента Q-обучения, сначала составьте Q-таблицу с помощью наблюдений и спецификаций действия от окружения MDP. Установите скорость обучения для представления равной 1
.
obsInfo = getObservationInfo(env); actInfo = getActionInfo(env); qTable = rlTable(obsInfo, actInfo); qRepresentation = rlQValueRepresentation(qTable, obsInfo, actInfo); qRepresentation.Options.LearnRate = 1;
Затем создайте агента Q-обучения, используя это представление таблицы, конфигурируя эпсилоново-жадное исследование. Для получения дополнительной информации о создании агентов Q-обучения смотрите rlQAgent
и rlQAgentOptions
.
agentOpts = rlQAgentOptions;
agentOpts.DiscountFactor = 1;
agentOpts.EpsilonGreedyExploration.Epsilon = 0.9;
agentOpts.EpsilonGreedyExploration.EpsilonDecay = 0.01;
qAgent = rlQAgent(qRepresentation,agentOpts); %#ok<NASGU>
Чтобы обучить агента, сначала укажите опции обучения. В данном примере используйте следующие опции:
Обучайте на самое большее 500 эпизодах с каждым эпизодом, длящимся самое большее 50 временных шагов.
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше на 10 для 30 последовательных эпизодов.
Для получения дополнительной информации смотрите rlTrainingOptions
.
trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes = 500;
trainOpts.StopTrainingCriteria = "AverageReward";
trainOpts.StopTrainingValue = 13;
trainOpts.ScoreAveragingWindowLength = 30;
Обучите агента с помощью train
функция. Это может занять несколько минут. Чтобы сэкономить время при запуске этого примера, загрузите предварительно обученного агента путем установки doTraining
на false
. Чтобы обучить агента самостоятельно, установите doTraining
на true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train(qAgent,env,trainOpts); %#ok<UNRCH> else % Load pretrained agent for the example. load('genericMDPQAgent.mat','qAgent'); end
Чтобы подтвердить результаты обучения, симулируйте агента в среде обучения с помощью sim
функция. Агент успешно находит оптимальный путь, который приводит к совокупному вознаграждению 13
.
Data = sim(qAgent,env); cumulativeReward = sum(Data.Reward)
cumulativeReward = 13
Поскольку коэффициент скидки установлен на 1
значения в Q-таблице обученного агента совпадают с недисконтированными возвратами окружения.
QTable = getLearnableParameters(getCritic(qAgent)); QTable{1}
ans = 8×2
12.9874 7.0759
-7.6425 9.9990
10.7193 0.9090
5.9128 -2.2466
6.7830 8.9988
7.5928 -5.5053
0 0
0 0
TrueTableValues = [13,12;5,10;11,9;3,2;1,9;5,1;0,0;0,0]
TrueTableValues = 8×2
13 12
5 10
11 9
3 2
1 9
5 1
0 0
0 0