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