Я предполагаю, что A * означает алгоритм поиска (например, http://en.wikipedia.org/wiki/A*_search_algorithm).. Если это так, я понимаю вашу проблему, поскольку у нас аналогичные требования. Вот алгоритм WP, и я прокомментирую ниже:
<ч />
Псевдокод
function A*(start,goal)
closedset := the empty set % The set of nodes already evaluated.
openset := set containing the initial node % The set of tentative nodes to be evaluated.
g_score[start] := 0 % Distance from start along optimal path.
h_score[start] := heuristic_estimate_of_distance(start, goal)
f_score[start] := h_score[start] % Estimated total distance from start to goal through y.
while openset is not empty
x := the node in openset having the lowest f_score[] value
if x = goal
return reconstruct_path(came_from,goal)
remove x from openset
add x to closedset
foreach y in neighbor_nodes(x)
if y in closedset
continue
tentative_g_score := g_score[x] + dist_between(x,y)
if y not in openset
add y to openset
tentative_is_better := true
elseif tentative_g_score < g_score[y]
tentative_is_better := true
else
tentative_is_better := false
if tentative_is_better = true
came_from[y] := x
g_score[y] := tentative_g_score
h_score[y] := heuristic_estimate_of_distance(y, goal)
f_score[y] := g_score[y] + h_score[y]
return failure
function reconstruct_path(came_from,current_node)
if came_from[current_node] is set
p = reconstruct_path(came_from,came_from[current_node])
return (p + current_node)
else
return the empty path
Закрытый набор можно опустить (получая алгоритм поиска по дереву), если решение гарантированно существует, или если алгоритм адаптирован так, что новые узлы добавляются в открытый набор, только если они имеют меньшее значение f, чем при любая предыдущая итерация.
<Ч />
Во-первых, и я не легкомысленен, это зависит от того, понимаете ли вы алгоритм - это звучит так, как будто вы понимаете. Также можно было бы расшифровать вышеприведенный алгоритм - надеясь, что он сработает) и провести ряд тестов. Вот что я бы сделал, так как подозреваю, что авторы WP лучше меня! Крупномасштабные тесты выполняли бы граничные случаи, такие как отсутствие узла, один узел, два узла + отсутствие ребра и т. Д. Если бы все они прошли, я бы заснул счастливым. Но если они потерпели неудачу, нет другого выбора, кроме как понять алгоритм.
Если это так, я думаю, вы должны построить тесты для структур данных. Это (как минимум) набор, расстояние, оценка и т. Д. Вы должны создать эти объекты и проверить их. Каково ожидаемое расстояние для случая 1,2,3 ... написать тесты. Каков эффект добавления A для установки Z? нужен тест. Для этого алгоритма вам нужно проверить heuristic_estimate_of_distance
и так далее. Это много работы.
Один из подходов может заключаться в том, чтобы найти реализацию на другом языке и опросить ее, чтобы найти значения в структурах данных. Конечно, если вы изменяете алгоритм, вы сами!
Есть одна вещь, еще хуже, чем это - численные алгоритмы. Диагонализирующие матрицы - действительно ли мы получаем правильные ответы. Я работал с одним ученым, пишущим 3-е производные матрицы - это меня ужаснуло бы ...