Вещь с A * алгоритмом является то, что он является полным и оптимальным. Это означает, что он найдет путь к решению, если существует путь, но также гарантирует, что он сначала найдет кратчайший путь.
Это происходит потому, что эвристический функция А * использование должно быть admissible heuristic; that is, it must not overestimate the distance to the goal.
Это, в свою очередь, гарантирует, что как только вы найти путь к решению, вы знаете, что нет пути короче что один в остальной части поискового пространства.
Предположим, что расстояние до вашего первого решения было d (проблема). Теперь, мое последнее заявление на самом деле означает, что если вы просто продолжать идти после того, как вы найдете первое решение д (проблема) и найти другое решение, d2 (проблема) Есть две возможности:
- d2 (проблема) = d (проблема): вы хотите сохранить это, так как вы хотите все оптимальные пути. Кроме того, все новые пути могут быть равны или больше, чем d2 = d
- d2 (проблема)>d (проблема): сейчас, то же самое я писал выше, действительно: есть нет дорожки короче чем d2 больше. И, d2 уже длиннее тех решений, которые вы ищете. Таким образом, вы можете отказаться от d2 и закончить ваш поиск
- примечание что не третий вариант, d2 (проблема) никогда не может быть короче, чем оптимальное г (проблемы) вы уже нашли, потому что что является одним из основных свойств алгоритма.
Таким образом, чтобы подвести итог: вы просто продолжать идти после того, как вы найдете первые оптимальных решений, и вы принимаете все решения, которые имеют такое же расстояние. Первый путь, который имеет худшее (более длинное) расстояние, отбрасывает и останавливает поиск.
Я только что видел «по часовой стрелке» часть вопроса. Вероятно, вы можете избежать поиска всех оптимальных решений путем как-то вставки по часовой стрелке -ness в эвристику или вашу стоимость. Например. трюк, который я использовал иногда: у вас есть стоимость как целое число, от 0 до inf. И затем вы добавляете компонент часовой стрелки, который может иметь значения реальных значений с интервалом [0, 1). Таким образом, где бы это ни было, a > b
раньше, он останется таким, но отношение a == b
может быть изменено, если компонент по часовой стрелке отличается.
Другой способ сравнения, если вы явно не хотите работать с числовым значением, должен иметь стоимость пары значений. Если первый компонент пары отличается по двум затратам на путь, вы просто сравниваете их. Если первые компоненты одинаковы, только тогда вы сравниваете второе значение в парах.
Тем не менее, я не уверен, что я посоветую вам изменить стоимость или вашу эвристическую функцию (или и то, и другое). Кроме того, я не уверен, что этот точный трюк будет работать в вашей проблеме, но я считаю, что вы должны быть в состоянии переместить алгоритм в сторону большинства решений по часовой стрелке, просто изменив одну из этих функций, если вы просто немного поиграете.
Если вы можете измерить, как далеко идет «по часовой стрелке» путь (без сравнения с другими путями), вы можете просто заменить определение длины от * N шагов * до пары * N шагов, M% по часовой стрелке * и использовать одинаковые алгоритм поиска путей, но сравнивая пары вместо длин. – hamstergene
@hamstergene Да, в идеале я могу определить приоритет как сочетание расстояния L2 с приоритетом по часовой стрелке.Но на практике это сложно, потому что они в разных масштабах. – teloon