Этот пример показывает, как обучить агент 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;
Зафиксируйте случайный seed генератора для воспроизводимости.
rng(0)
Чтобы создать агент Q-изучения, сначала составьте таблицу Q с помощью наблюдения и спецификаций действия от среды MDP. Установите темп обучения представления 1.
qTable = rlTable(getObservationInfo(env), getActionInfo(env)); tableRep = rlRepresentation(qTable); tableRep.Options.LearnRate = 1;
Затем, создайте агент Q-изучения с помощью этого табличного представления, конфигурируя жадное эпсилоном исследование. Для получения дополнительной информации о создании агентов Q-изучения смотрите rlQAgent и rlQAgentOptions.
agentOpts = rlQAgentOptions; agentOpts.DiscountFactor = 1; agentOpts.EpsilonGreedyExploration.Epsilon = 0.9; agentOpts.EpsilonGreedyExploration.EpsilonDecay = 0.01; qAgent = rlQAgent(tableRep,agentOpts);
Чтобы обучить агент, сначала задайте опции обучения. В данном примере используйте следующие опции:
Обучайтесь для самое большее 200 эпизодов с каждым эпизодом, длящимся самое большее 50 временных шагов.
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем 10 более чем 30 последовательных эпизодов.
Для получения дополнительной информации смотрите rlTrainingOptions.
trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes = 200;
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); 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 = getLearnableParameterValues(getCritic(qAgent))
QTable = 8×2
13 12
5 10
11 9
3 2
1 9
5 1
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