Я пытаюсь решить Ti c Ta c Toe с помощью Deep Q-Network.
Окружение:
Массив длиной 9 используется для представления состояния игры, где 1 означает отмеченные позиции текущего игрока и -1 для следующего игрока. 0 используется для неотмеченных позиций. Переменная ход используется для определения следующего хода. Действие представлено в виде списка с номерами строки и столбца. 0 Награда дается за непрекращающиеся ходы и dr aws. За победу дается вознаграждение в размере 1.
Пример:
x | - | -
- | - | o
- | - | -
представлено как [1,0,0,0,0,0,0, -1,0], здесь x представлен как 1, а o как -1, поскольку следующий ход - x, действие [1,2] изменит состояние на
x | - | -
- | - | o
- | x | -
, представленное как [-1,0,0,0,0 , -1,0,1,0], здесь x представлен как -1, а o как 1, так как следующий ход - это o
Deep Q-Network:
Функция q принимает состояние и действие для вывода значения q, связанного с этим перемещением для этого состояния. Я обновляю функцию q, используя целевое значение q для состояния s и действие a как
целевое значение q (s, a ) = гамма * (награда (s, a) - значение q (s ', a'))
Где gamma = 1, s '- следующее состояние после того, как действие a выполнено в состоянии s и a '- следующий оптимальный ход для следующего игрока, определяемый функцией q.
Я вычитаю значение q из награды в соответствии с моим пониманием алгоритма минимакса.
Лучшее действие получается путем использования действия из списка допустимых ходов для получения значения q для текущего состояния и действие с наивысшим значением q считается лучшим ходом
Я использую онлайн q-сеть, чтобы обеспечить следующее оптимальное движение, которое обновляется во время каждой выборки и офлайн q -сеть, которая предоставляет значение q для получения целевого значения q, которое обновляется реже в соответствии с реализацией DDQN. Наряду с исследованием и эксплуатацией эпсилон-распада.
Я также использую буфер воспроизведения опыта
Используемая нейронная сеть:
model = models.Sequential()
model.add(layers.Dense(50, input_dim=11, activation='sigmoid'))
model.add(layers.Dense(20, activation='sigmoid'))
model.add(layers.Dense(1, activation='linear'))
с оптимизатором rmsprop со скоростью обучения 0,01
epsilon = от 1 до 0,05 со скоростью затухания 0,9995
размер буфера воспроизведения опыта = 500 эпизодов
размер_пакета для обучения = 500 состояний и действий
офлайн-модель обновляется с весами онлайн с интервалом в 500 эпизодов.
После тренировки для 20000 эпизодов колебания потерь кривая потерь
DQN не смог заблокировать ходы и был только заинтересован в завершении ряда. Я хочу понять, что пошло не так в этой реализации. Это из-за нестабильности DQN или из-за того, что я сделал fl aws. Любая помощь приветствуется. Это мой первый пост, и я не знаю, как писать вопрос, исправьте ошибки в вопросе.
Это код, но он написан не очень хорошо