Как мне смоделировать динамическое состояние призрака/капсулы при перепланировании A* для Berkeley Pacman?Python

Программы на Python
Anonymous
Как мне смоделировать динамическое состояние призрака/капсулы при перепланировании A* для Berkeley Pacman?

Сообщение Anonymous »

Я работаю над проектом Berkeley Pacman, и у меня есть ClassicGameAgent, который перепланирует A* каждый ход.
Моя текущая настройка:
- Ограниченная глубина A* перепланирует каждый такт

- Состояние в настоящее время включает:
  • Позиция Pacman
  • оставшуюся еду сетка
  • оставшиеся капсулы
  • таймеры испуга призраков
  • оставшаяся глубина

    - Позиции призраков считываются из текущего состояния игры

    - Стоимость шага наказывает за опасность и повторное посещение

    - Эвристическая оценка стоимости сбора еды и опасности призраков
Недавно я изменил представление состояния, включив в него «капсулы». и `scaredTimers`, потому что в противном случае поиск не мог бы правильно рассуждать о фьючерсах «съешьте капсулу сейчас, станьте безопасным следующим шагом».
Это изменение улучшило мою оценку, но я все еще не уверен в *правильном* способе моделирования динамической призрачной опасности в 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* в этой настройке.
При необходимости я могу предоставить более минимальную воспроизводимую версию состояния, преемника, стоимости шага и эвристического кода.

Вернуться в «Python»