Моя текущая настройка:
- Ограниченная глубина A* перепланирует каждый такт
- Состояние в настоящее время включает:
- Позиция Pacman
- оставшуюся еду сетка
- оставшиеся капсулы
- таймеры испуга призраков
- оставшаяся глубина
- Позиции призраков считываются из текущего состояния игры
- Стоимость шага наказывает за опасность и повторное посещение
- Эвристическая оценка стоимости сбора еды и опасности призраков
Это изменение улучшило мою оценку, но я все еще не уверен в *правильном* способе моделирования динамической призрачной опасности в A*.
Вот основная проблема:
- Если я сохраняю фиксированные позиции призраков и ношу только `scaredTimers`, поиск будет дешевле, но оценки опасности будут неточно.
- Если я попытаюсь предсказать будущее призрачное движение с помощью эвристики или стоимости шага, производительность станет нестабильной, а вероятность выигрыша иногда ухудшится.
- Я хочу знать, что считается разумным/стандартным подходом для такого рода задач перепланирования.
Соответствующий упрощенный код:
Код: Выделить всё
def getStartState(self):
return (
self.startPosition,
self.startFood,
tuple(self.capsules),
tuple(self.scaredTimers),
self.depth,
)
def isGoalState(self, state):
position, foodGrid, capsules, scaredTimers, depthRemaining = state
return depthRemaining == 0 or foodGrid.count() == 0
def _stepCost(self, currentPosition, nextPosition,
currentFood, nextFood,
currentCapsules, currentScaredTimers,
nextCapsules, nextScaredTimers):
cost = 1.0
ate_capsule = nextPosition in currentCapsules
for ghostPosition, _, nextScaredTimer in zip(
self.ghostPositions, currentScaredTimers, nextScaredTimers
):
distance = util.manhattanDistance(nextPosition, ghostPosition)
if nextScaredTimer > 0:
if distance == 0:
cost -= 0.9
elif nextScaredTimer > distance:
cost -= 0.2 / float(distance + 1)
continue
if distance == 0:
return 999999.0
def classicHeuristic(state, problem):
position, foodGrid, capsules, scaredTimers, depthRemaining = state
...
Для агента Pacman, перепланирующего A* с движущимися призраками, с ограниченной глубиной, каков наилучший способ обработки динамики призраков?
Сохранять позиции призраков фиксированными в состоянии поиска и обрабатывать движение только эвристически?
Также включать в состояние прогнозируемые положения призраков?
Сохраняйте состояние небольшим, но вместо этого моделируйте «опасные зоны». точно предсказанных позиций призраков?
Меня особенно интересует, какой вариант с наименьшей вероятностью нарушит полезность/стабильность A* в этой настройке.
При необходимости я могу предоставить более минимальную воспроизводимую версию состояния, преемника, стоимости шага и эвристического кода.