Вопрос, например, что произойдет, если ближайший узел не может быть достигнут от предыдущего ближайшего узла?
Этот шаг не обязателен. Например, вы не вычисляете путь от предыдущего ближайшего к текущему ближайшему, вы пытаетесь добраться до целевого узла, и единственное, что имеет значение, - это текущий ближайший (например, алгоритм не заботится о последней итерации). вы были в 100 км, потому что на этой итерации вы всего в 96 км).
Как широкое введение, A * не создает путь напрямую: он исследует, пока точно не узнает, что путь содержится в исследуемом регионе, а затем создает путь на основе информации, записанной во время исследования.
(я собираюсь использовать код в статье Википедии в качестве справочной реализации, чтобы помочь моему объяснению.)
У вас есть два набора узлов: closedset
и openset
closedset
содержит узлы, которые были полностью оценены, то есть вы точно знаете, как далеко они находятся от start
, и все их соседи находятся в одном из двух наборов. Это больше не вычисление, которое вы можете сделать с ними, и поэтому мы можем (вроде) игнорировать их. (В основном они полностью заключены в границы.)
openset
содержит "пограничные" узлы, вы знаете, как далеко они находятся от start
, но вы еще не коснулись их соседей, поэтому они пока находятся на грани вашего поиска.
(Неявно, существует третий набор: совершенно нетронутые узлы. Но вы не касаетесь их, пока они не окажутся в openset
, поэтому они не имеют значения.)
На данной итерации, если у вас есть исследуемые узлы (то есть узлы в openset
), вам нужно решить, какой из них исследовать. Это работа эвристики, в основном она дает вам подсказку о том, какую точку на границе лучше всего исследовать, сообщая вам, какой узел, по ее мнению, будет иметь кратчайший путь к goal
.
Предыдущий ближайший узел не имеет значения, он просто немного расширил границу, добавив новые узлы к openset
. Эти новые узлы теперь являются кандидатами на ближайший узел в этой итерации.
Сначала openset
содержит только start
, но затем вы выполняете итерацию, и на каждом шаге граница немного расширяется (в наиболее многообещающем направлении), пока в итоге вы не достигнете goal
.
Когда A * действительно проводит исследование, он не беспокоится о том, какие узлы откуда и откуда. Это не нужно, потому что он знает их расстояние от start
и эвристическую функцию, и это все, что ему нужно.
Однако, чтобы восстановить путь позже, вам нужно иметь некоторую запись пути, вот что такое camefrom
. Для данного узла camefrom
связывает его с узлом, ближайшим к start
, поэтому вы можете восстановить кратчайший путь, следуя по ссылкам в обратном направлении от goal
.
Как на самом деле взять «граф» в качестве аргумента функции?
Передав одно из представлений графа .
Я действительно не вижу, как А * применяется к TSP. Я имею в виду, найти маршрут от А до Б, конечно, я понял. Но TSP? Я не вижу связи.
Вам нужна другая эвристика и другое конечное условие: goal
больше не является единичным узлом, а состоянием соединения всего; а ваша эвристика - это некоторая оценка длины кратчайшего пути, соединяющего остальные узлы.