помогите, пожалуйста написать код для пятнашек с эвристикой. чтобы компьютер демонстрировал решение. Нашла код, но он не работает, разобраться не получается.
вот код, помогите исправить
Код:
function A*(start,goal)
closedset := the empty set // Множество вершин, которые уже были обработаны(раскрыты)
openset := {start} // Множество вершин(очередь), которые предстоит обработать(раскрыть).
// Изначально здесь присутствует только начальная вершина start.
path_map := the empty set // Карта пройденных вершин. Используется функцией reconstruct_path
//Заполняем свойства вершины start
start.g := 0 // g(x). Стоимость пути от начальной вершины. У start g(x) = 0
start.h := heuristic_cost_estimate(start, goal) // Эвристическая оценка расстояние до цели. h(x)
start.f := g_score[start] + h_score[start] // f(x) = g(x) + h(x)
start.came_from := start //Вершина с которой мы пришли. Используется для реконструкции пути.
while openset is not empty
x := вершина из openset имеющая самую низкую оценку f(x)
if x = goal
return reconstruct_path(goal) //заполняем карту path_map
remove x from openset // Вершина x пошла на обработку, а значит её следует удалить из очереди на обработку
add x to closedset // И добавить в список уже обработанных
foreach y in neighbor_nodes(x) // Проверяем каждого соседа x
if y in closedset // Пропускаем соседей из закрытого списка
continue
tentative_g_score := x.g + dist_between(x,y) // Вычисляем g(x) для обрабатываемого соседа
if y not in openset // Если сосед x ещё не в открытом списке - добавим его туда
add y to openset
tentative_is_better := true
else // Сосед был в открытом списке, а значит мы уже знаем его g(x), h(x) и f(x)
if tentative_g_score < y.g
// Вычисленная g(x) оказалась меньше, а значит нужно будет обновить g(x), h(x), f(x)
tentative_is_better := true
else
// Вычесленная g(x) оказалась больше, чем имеющаяся в openset.
// Это означает, что из вершины x путь через этого соседа дороже
// т.е. существует менее дорогой маршрут, пролегающий через этого соседа (из какой-то другой вершины, не из x)
// Поэтому данного соседа мы игнорируем
tentative_is_better := false
// Обновление свойств соседа.
if tentative_is_better = true
y.came_from := x
y.g := tentative_g_score
y.h := heuristic_cost_estimate(y, goal)
y.f := g_score[y] + h_score[y]
// Обратите внимание, что если происходит обновление свойств - значит y(сосед x)
// так или иначе находится в openset.
// Т.е. при следующей итерации внешнего цикла из openset будет извлечена вершина с наименьшей оценкой f(x)
// Не исключено, что она окажется соседом нашего x, которого мы только что добавили.
// В общем это самая важная особенность алгоритма А*
return failure //управление передаётся сюда когда openset пуст, а goal не найден.
// Заполняет карту path_map
// Путь можно проследить только от заданной вершины(чаще всего это goal)
// к старту(каждая вершина имеет свойство came_from, чем мы и воспользуемся)
function reconstruct_path(start_node, goal_node)
// Добавляем в карту все вершины от finish_node до start_node.
// Если встречается вершина с не заполненным полем came_from - путь отсутствует
current_node := goal_node // поиск начинается от финиша
while current_node.came_from <> start_node
if current_node.came_from <> NULL
path_map.add_node(current_node) // Добавить вершину в карту
current_node := current_node.came_from
else
return path_not_found //нельзя найти путь, т.к. цепочка came_from оборвалась
return path_found
// TODO: По-моему, функция может зациклиться если вызвать её для не найденного пути и если на графе есть петли.
// В любом случае, код приведен для демонстрации алгоритма и конкретная реализация должна учитывать возможность зацикливания.
// Проблем быть не должно,если вызывать функцию только для найденных путей.
________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.