PacMan: какие эвристики используются в основном?

Рядом с A *, BFS, DFS и т.д., каковы другие хорошие алгоритмы поиска/эвристики, используемые в Pacman? Я не думаю, что те, о которых я говорил, будут работать, если для пакмана будет найдено несколько фруктов.

Мне нужны хорошие алгоритмы поиска пути, которые PacMan может использовать для завершения лабиринта с наименьшим возможным шагом. Я попытался найти руководство для руководства, но пока не повезло. A * с Манхэттенским расстоянием упоминается повсюду, но он будет работать только с лабиринтами только с одним (или двумя? Или, возможно, до нескольких?) Фруктами.

Кстати, чтобы все было просто, предполагая, что вокруг нет призраков.

Некоторые примеры из исходных проблем PacMan: Сначала, Second и Третий

Ответы

Ответ 1

Вы комментируете, что вы ищете кратчайший путь. Эта проблема представляет собой вариацию TSP на планарном графике и, следовательно, NP-Hard.

Возможная эвристическая функция для A*, которая может решить проблему, но не admissible [таким образом, найденный путь не гарантирован оптимальная]:

Сумма манхэттенских расстояний от всех плодов до агента.

Вы также можете использовать допустимую эвристику, #fruits - но это займет много времени.

Если вы ищете оптимальное, хорошо - это сложно. Вы можете попробовать все перестановки фруктов и проверить общее расстояние, необходимое для поездки. Это решение факториально в количестве фруктов, а если оно больше 20 - с наивной грубой силой - это займет слишком много времени. Вы можете как-то улучшить его, уменьшить проблему до TSP, а также использовать динамическое программирование, которое также является экспоненциальным, или некоторые эвристические решения для TSP.


Можно также улучшить недопустимое эвристическое решение, чтобы обеспечить алгоритм любого времени:

итеративно выполните A* с уменьшающейся эвристической функцией: h(v) = h'(v) / m, где h' - эвристическая функция на последней итерации A * и m > 1. Это гарантирует, что в какой-то момент ваша эвристическая функция h будет допустимой - и найденное решение будет оптимальным. Однако ожидается, что каждая итерация займет гораздо больше времени, чем предыдущая [экспоненциально длиннее..]

Ответ 2

Эвристика, которая работала для меня, если вы знаете внешний вид лабиринта:

  • Найдите реальное расстояние между двумя самыми последними плодами в лабиринте - позвоните, чтобы x.
  • Найдите реальное расстояние от текущего положения Pacman до более близкого к предыдущему двум плодам - ​​позвоните по телефону y.

Тогда ответ просто: x + y.

Обратите внимание, что реальные расстояния не являются расстояниями на Манхэттене, но real расстояния в лабиринте - вы можете рассчитать это (даже заранее просчитайте, если хотите), потому что вы знаете внешний вид лабиринта (вы знаете все стены,...). Эта информация (реальное расстояние между двумя точками в лабиринте) статична, поскольку стены не меняются.

Интерпретация этой формулы x + y может быть примерно такой:

  • x - в любом случае вам придется пройти это расстояние, по крайней мере, в конце.
  • y - пока вы находитесь на некоторых из двух самых больших плодов, лучше собрать пищу, которая находится рядом с ней, чтобы вам не пришлось возвращаться.

Если вы решаете это как часть проекта класса Berkeley AI, для вычисления реального расстояния между двумя точками вы можете использовать функцию mazeDistance(pos1, pos2, gameState), которая уже реализована и использует вашу реализацию bfs. Кроме того, эта эвристика допустима и согласована, по крайней мере, для их тестовых случаев. Кстати, с этой эвристикой мне удалось расширить только 376 узлов в лабиринте trickySearch.

Ответ 3

Я нашел ближайшую аппетитную пищу (с использованием манхэттенских расстояний), но для моей эвристики я использовал фактическое расстояние от своего положения до ближайшей пищи. К этому я добавил 1 для всех тех пунктов питания, которые не разделяют строку или столбец с моей позицией или ближайшей точкой питания.

Потому что пункты питания, которые разделяют ряд или столбик с моей позицией или ближайшей пищей, будут съедены, переходя от моей позиции к ближайшей еде, и Ive уже подсчитал стоимость этого на фактическом расстоянии, о котором я упомянул во второй строке.

Итак, словом: эвристический = лабиринт. Сопротивление (моя позиция, оценка ближайшего питания) + указывает на то, что

Это было приемлемым и последовательным. С этим я расширил 5500 узлов и получил 5/4 на FoodHeuristic. https://github.com/sukritiverma1996/Intro-to-AI-course

Ответ 4

Я знаю, что это старо, но, вероятно, есть много других людей, которые хотят решить эту проблему (это часть свободного класса Berkeley AI). Там много предложений грубой силы, поэтому я вношу довольно простой, который будет довольно близок и IS ADMISSIBLE:

  • Найдите ближайший плод
  • Удалите этот фрукт из списка оставшихся фруктов и добавьте расстояние до общей суммы
  • Найти ближайший плод к этому фрукту
  • вернитесь к шагу 2 и повторите, пока не появится больше фруктов.
  • возвращает общее количество

edit: Предыдущее требование о том, что это допустимая эвристика, неверно. Извините!

Ответ 5

Вы можете грубо заставить его для небольшого количества фруктов в лабиринте разумного размера.

  • Создайте граф с node для каждого куска фруктов в лабиринте.
  • Используйте A * или аналогично, чтобы найти расстояние между каждой парой фруктов. (Вам понадобится O(n^2) пробеги A *, чтобы получить все попарные расстояния между n плодами.)
  • Свяжите узлы (фрукты) в графе с ребрами, взвешенными расстоянием.
  • Найдите самый дешевый цикл на графике (по крайней мере один раз для посещения всех узлов) с помощью грубой силы. См. самый дешевый траверс на полном графике.

Ответ 6

если вы хотите уменьшить количество узлов, расширенных и не заботящихся о времени выполнения, я бы рекомендовал использовать минимальное связующее дерево, стоимость края должна быть mazeDistance и использовать priorityQueue при каждом добавлении node в посетив node, найдите ближайший node только что добавленный node, а затем добавив его к посещенному node, пока вся еда node не будет добавлена ​​в посещенный node. Если вы работаете с проблемой курса AI, расширение node должно быть очень низким.

Ответ 7

в заданном состоянии игры, скажем, md(x) - это расстояние manhattan от pacman до node x, рассмотрите minmd(X) как функцию, возвращающую xmin st md(xmin)<=md(x) для всех x в x. пусть x будет множество продуктов, которые pacman получил, чтобы поесть.

Затем подумайте об этом - если вы подумаете о расслаблении своего мира-пакмана, в котором нет стен, пакман не может ходить меньше, чем md(xmin), где xmin=minmd(X) есть фрукты, а затем, если он хочет есть еще один плод он должен идти не менее md(xmin1), где xmin1=minmd(X-{xmin}) и так далее. вернуть сумму mds pacman, пройдя от xmin до xmin1 до xmin2 и т.д., и так как это оптимальное решение для релаксации, вы получили большую допустимую и согласную эвристику работать!

Еще один момент, который следует учитывать, заключается в том, что вы даже можете получить лучшую эвристику, если учесть стены, это гораздо более сложная проблема, поэтому я не очень много вникал в нее, но я заметил, что если вы связали pacman в прямоугольнике со следующим оптимальный плод, ему придется заплатить как минимум еще 2 действия, если между ними будет ПОЛНАЯ вертикальная или горизонтальная линия стены, потому что ему придется выйти из ограничивающего прямоугольника и снова ввести его снова, заплатив хотя бы 2 действия, делая это для каждого такого стены. Это можно дополнительно изучить, и вы также можете найти дополнительные функции в этом прямоугольнике.

Ответ 8

Предполагая, что это для проекта Berkeley AI:

В общем случае поиск кратчайшего пути, который посещает каждую точку, является NP-hard. Однако это не означает, что на практике это сложно. Причина кроется в том, что фиксированные параметры сжимаемых алгоритмов, а лабиринты Pacman предоставляются в случае графиков, которые легко решить.

В частности, для любой заданной ширины ветки кратчайший путь можно найти во временном многочлене по размеру графика (но экспоненциального по ширине ответвления графа) простым применением динамического программирования. Это не нарушает NP-твердость, так как произвольные графы могут иметь большую ширину ветки, но это означает, что проблема может быть решена эффективно, если вы только заботитесь о графиках с низкой шириной ответвления. Палимские лабиринты имеют плохую связность и, следовательно, низкую ширину ответвления.

Для получения дополнительной информации см. этот пост.