Q:
1. рукописного алгоритма *, чтобы найти кратчайший путь
2. Напишите псевдокод
A:
1. * Процесс алгоритм:
1. Во-первых, начальное положение точки добавляется в список, называемый «открытый список» в процессе поиска пути, в настоящее время, можно сказать, что открытый список Этот список будет храниться много точек для тестирования, который является воротами к целевой точке ключевой момент, будущее будет постепенно заполнить, чтобы добавить больше контрольных точек, в то время как интерес к эффективности, этот список, как правило, уже отсортированный список.
2. Если список открыт список не пуст, а затем повторите следующее:
(1) найти наименьшее точку в целевой цены, чтобы открыть список в качестве текущей точки доступа;
(2) текущий момент в список, называемый близкий список;
(3) указывает на текущих четырех точках вокруг каждого процесса (это, чтобы ограничить движение под наклоном), если точка находится на этой точке и не близко список Список, обработка следующим образом;
4) Если точка происходит с целевой точкой, поставить точку родительского узла текущей точки, и происходит выход из цикла, то установленный флаг пути было найдено;
(5) Если точка не находится в открытом списке, то стоимость расчета узла к узлу назначения, родительский узел текущей точки как точки, и добавить узел в открытом список;
6) Если точка уже находится в открытом списке, стоимость текущей точки и точки до точки назначения сравнения, если текущая стоимость меньшей точки, помещает текущую точку в качестве точки родительского узла, а пересчитывается цена точки до пункта назначения, а также открытый список переупорядочения;
3. После завершения цикла выше, если вы нашли путь, начиная от целевой точки, а затем нажмите кнопку Найти родительский узел для каждого узла до тех пор, пока не найдете начальную точку, образуя таким образом путь.
2. Алгоритм псевдокода
Сначала создать в структуру данных узла:
структура Node {
INT г; // Г значение узла
ИНТ ч; // Н значение узла
ИНТ е; // диафрагменное значение узла
Узел * предварительно; // перед узлом узла
};
AStar_Search () {
структура узла start_node;
start_node.g = 0;
start_node.h = Н (начало);
start_node.f = start_node.h;
start_node.pre = NULL;
ОТКРЫТЫЙ = [start_node]; ЗАКРЫТЬ = [];
в то время как (OPEN не пусто) {
Узел с наименьшим значением F получается из ОТКРЫТОГО связанного списка,
который называется x_node, и соответствующий узел называются й;
Удалить x_node из открытого списка;
если (х представляет собой конечный узел) {
Возвращает путь
в соответствии с предварительно указателем структуры узла, соответствующей каждый узел;
}
для (каждого последующего узла у й) {
структура узла y_node;
y_node.g = x_node.g + W (х, у);
y_node.h = Н (у);
y_node.f = y_node.g + y_node.h;
y.pre = x_node;
если (у не в открытой таблице , а не в ЗАКРЫТЬ таблицу) {
Поместите y_node в открытой таблице;
} Еще если (у находится в открытой таблице) {
Вынуть структуру узла, соответствующую у узла в открытой таблице,
который называется y_open;
если (y_node.f <y_open.f) {
y_open.g = y_node.g;
y_open.h = y_node.h;
y_open.f = y_node.f;
y_open.pre = y_node.pre;
}
} Еще {
Извлеките структуру узла, соответствующую у узла в таблице ЗАКРЫТЬ,
который называется y_close;
если (y_node.f <y_close.f) {
Удалить y_close из списка ЗАКРЫТЬ
Поместите y_node в открытой таблице;
}
}
} // конец для
Поместите x_node в ЗАКРЫТЬ таблицу;
} // конец в то время как
} // конец AStar_Search