Я пытаюсь сделать глубокого агента q-обучения из https://keon.io/deep-q-learning
Моя среда выглядит следующим образом: https://imgur.com/a/OnbiCtV
Как вы можете видеть, мой агент - это круг, и тамодна серая дорожка с оранжевыми линиями (награда ворот).Смелая линия - это активные ворота.Оранжевая линия от круга, указывающая на его направление.
Агент имеет постоянную скорость и может поворачиваться влево / вправо на 10 градусов или ничего не делать
На следующем изображении расположены датчики агентов https://imgur.com/a/Qj7Kesi
Они вращаются вместе с агентом.
Состояния - это расстояние от агента до активного затвора и длина датчиков.Всего существует 1 + 7 состояний, и это входное измерение нейронной сети с q-обучением.
Действия - повернуть налево, повернуть направо и ничего не делать.
Функция вознаграждения возвращает 25, когда агент пересекает ворота вознаграждения;125 когда агент пересекает последние ворота;-5 если агент пересекает границу трека Если ничего из этого, функция вознаграждения сравнивает расстояние от агента до активных ворот для текущего состояния и следующего состояния:
Если расстояние от текущего состояния> расстояние до следующего состояния: вернуть 0,1, иначе вернуть-0.1
Кроме того, DQNAgent обладает отрицательной, положительной и нейтральной памятью.Если награда равна -5, (состояние, действие, награда, следующее_статейное, выполнено) перейти в отрицательную память, если награда> = 25, в положительную, в противном случае в нейтральную
Это потому, что когда я формирую минибатдля тренировки я беру 20 случайных выборок из нейтральной памяти, 6 из положительных и 6 из отрицательных.
Каждый раз, когда агент пересекает границу дорожки или когда он застревает более 30 секунд, я делаюобучение (повтор) и агент начинается с самого начала.Это моя модель
model = Sequential()
model.add(Dense(64, input_dim=self.state_size,activation='relu',
kernel_initializer=VarianceScaling(scale=2.0)))
model.add(Dense(32,
activation='relu',kernel_initializer=VarianceScaling(scale=2.0)))
model.add(Dense(self.action_size, activation='linear'))
model.compile(loss=self._huber_loss,
optimizer=Adam(lr=self.learning_rate))
return model
Я пробовал разные типы моделей, разное количество нейронов на слой, другие функции активации и потери, выпадение, нормализация партии, и эта модель работает лучше всего на данный момент
Я пробовал разные значения вознаграждения
Также я пытался использовать статические датчики (они не вращаются вместе с агентом) https://imgur.com/a/8eDtQIF (зеленые линии на фото)
Иногда моему агенту удается пересечь несколько ворот, прежде чем попасть на границу.Редко ему удается пройти половину пути, и однажды с этими настройками он прошел два круга, прежде чем застрял.
Чаще он вращается только в одном месте.
Я думаю, чтопроблема заключается в представлении штата или функции вознаграждения.
Любые предложения будут оценены