В этом примере показано, как обучить Q-обучающего агента решению общей среды процесса принятия решений Маркова (MDP). Дополнительные сведения об этих агентах см. в разделе Q-Learning Agents.
Среда 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-learning, сначала создайте таблицу Q с использованием спецификаций наблюдения и действий из среды MDP. Установка скорости обучения представления на 1.
obsInfo = getObservationInfo(env); actInfo = getActionInfo(env); qTable = rlTable(obsInfo, actInfo); qRepresentation = rlQValueRepresentation(qTable, obsInfo, actInfo); qRepresentation.Options.LearnRate = 1;
Затем создайте агент Q-learning, используя это представление таблицы, настроив эпсилон-жадное исследование. Дополнительные сведения о создании агентов Q-learning см. в разделе 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