Лучший путь в сетке

У меня есть проблема с лучшим путем, которую нужно решить. Учитывая сетку nxn, заполненную проходимыми и не проходимыми плитками, я должен добраться до точки B из точки A по кратчайшему пути. Хитрость в том, что некоторые плитки, по которым можно пройти, содержат очки. Чтобы быть действительным решением, когда я достигаю цели, я должен иметь определенное количество очков. На плитках есть переменное количество точек (или нет), и мне нужен кратчайший путь, чтобы достичь цели, но также набрать по крайней мере M точек на пути.

То, что я пробовал, — это алгоритм A*, который находит кратчайший путь между двумя точками и пытался настроить его так, чтобы он имел условие остановки не только при достижении цели, но и для наличия необходимых точек. Это не работает так, как я это сделал, потому что я блокирую пути.

Если у вас есть какие-либо предложения, как подойти к этой проблеме или другому алгоритму, который был бы более подходящим, я был бы признателен за помощь. Спасибо.


person Adrian    schedule 15.04.2013    source источник
comment
Вы видели алгоритм Дейкстры?   -  person Caesar    schedule 15.04.2013
comment
Могу ли я получить очки с одной и той же плитки более одного раза? Другими словами, если в сетке есть петля, которая включает в себя несколько плиток с точками, может ли допустимый путь содержать такую ​​петлю, чтобы получить необходимое количество точек до прибытия в конечный пункт назначения?   -  person Sergey Kalinichenko    schedule 15.04.2013
comment
@Caesar Обычный Дейкстра (или Флойд-Уоршалл) не поможет, потому что задача оптимизации имеет второе измерение.   -  person Sergey Kalinichenko    schedule 15.04.2013
comment
@dasblinkenlight Нет, очки можно выбрать только один раз.   -  person Adrian    schedule 15.04.2013
comment
@ Цезарь Я посмотрел на Дейкстру и, по моему мнению, у меня будет та же проблема, что и с A *.   -  person Adrian    schedule 15.04.2013
comment
Должен ли путь быть простым? (То есть, можем ли мы вернуться к квадратам не для точек, а для того, чтобы сделать решение короче или даже существующим?)   -  person David Eisenstat    schedule 16.04.2013
comment
Да, вы можете повторно посетить квадраты, если вы набрали необходимые очки и кратчайший путь лежит через некоторые уже посещенные квадраты, чем необходимо для их прохождения.   -  person Adrian    schedule 16.04.2013


Ответы (2)


Если вы все еще застряли в этой проблеме, поскольку другие ответы / комментарии дают вам только частичный ответ - вот трещина в проблемном пространстве.

На самом деле вы можете использовать A * с несколькими модификациями для захвата (в основном) неупорядоченного пути M точек. Единственное, что вам нужно изменить, это эвристика и критерии завершения.

Сначала вам нужно изменить свою эвристику, чтобы учитывать пути через M точек. Эвристика должна быть допустимой и непротиворечивой, поэтому она должна равняться значению, меньшему или равному истинной стоимости пути, и может только уменьшаться по мере приближения к цели (должна быть монотонно возрастающей).

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

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

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

Наконец, ваши критерии завершения должны измениться на достижение M точек, где последней точкой является завершающая плитка. Это имитирует ходячие M-графы без необходимости построения M! возможные графики для прогулки. Предоставленная эвристика позволит A* творить чудеса без изменения базового алгоритма и должна быть настолько эффективной, насколько это возможно, при сохранении требуемых ограничений эвристики на общих сетках.

person Pyrce    schedule 17.04.2013
comment
Я сам решил проблему, но ваш ответ ближе всего к тому, что я сделал. - person Adrian; 25.04.2013

Вы можете добавлять слои к своему графику, когда вы находитесь на слое глубины X -> вы набрали не менее X очков. Добавьте соответствующие ребра на ваш график из верхнего слоя в слой +N, где N — количество точек на текущем тайле.

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

Вы должны финишировать на уровнях >M.

Если нужны уточнения, спрашивайте =)

Изменить

Как сказал @Pyrce, вы также должны предоставить последовательную эвристику, если планируете использовать A* http://en.wikipedia.org/wiki/Consistent_heuristic

person kassak    schedule 15.04.2013
comment
+1 за чистый ответ, хотя его график не бесконечен, просто может быть действительно очень большим, поскольку вы можете зафиксировать только M точек способами перестановки (M). Вы также можете добавить, что эвристика должна измениться и для A*, т. е. расстояния больше не являются двумерными. - person Pyrce; 15.04.2013
comment
@Pyrce В общем, график бесконечен, потому что M является входным параметром, таким как начало и конец. Для случая A* эвристика, как всегда, не такая уж простая задача =) Но я думаю, что обычная эвристика (манхэттенское расстояние до финиша) с взвешенным сложением типа abs (cur_level - M) подойдет. - person kassak; 16.04.2013
comment
Да, но M фиксируется при запуске алгоритма и не меняется. M из 4 точек обеспечит 24 возможных перестановки для решения, таким образом, размер графа будет NxNx(M!) = 24N^2; большой, но гораздо меньше бесконечности. Конечно, существует бесконечное количество возможных вариантов N и M для начала задачи. Предлагаемая вами эвристика допустима, но несостоятельна, поскольку вы можете упасть в дыру в точке решения, не достигнув всех M точек, где удаление делает эвристику немонотонной. См. en.wikipedia.org/wiki/Consistent_heuristic. Просто подумал, что вы должны добавить это к своему ответу. - person Pyrce; 16.04.2013
comment
@Pyrce Да, я знаю об эвристике, но, как я уже сказал, правильный вариант сложен. Я добавлю вашу ссылку, чтобы ответить. Что касается размера, я пытался отделить пространство поиска от проблемы поиска. Задача алгоритма не переборщить =) - person kassak; 16.04.2013