A * Алгоритм поиска - PullRequest
12 голосов
/ 01 мая 2011

Я бы хотел кое-что прояснить относительно следующего примера поиска A *:

A* Search Example

Разделы, выделенные красными эллипсами, - это области, которые я не понимаю;кажется, что {S,B} f=2+6=8 было взято / перемещено / скопировано из Expand S (выше) и использовано в Expand A.Также представляется, что {S,A,X} f=(1+4)+5=10 было взято / перемещено / скопировано из Expand A и использовано в Expand B.

Может кто-нибудь любезно объяснить, почему это происходит?Я могу читать график очень хорошо и не испытываю затруднений при его интерпретации - это просто факт, что я не знаю , почему вышеупомянутые пути / маршруты были дублированы в других местах.

Спасибо.

Ответы [ 2 ]

8 голосов
/ 01 мая 2011

Это получение текущего лучшего элемента, его удаление и замена на расширение (вставка новых элементов в соответствующие позиции в списке).Думайте об этом так:

Расширить S:

  • {S,A} f = 1+5 = 6
  • {S,B} f = 2+6 = 8

Расширить A:

  • {S,A} f = 1+5 = 6
  • {S,B} f = 2+6 = 8
  • {S,A,X} f = (1+4)+5 = 10
  • {S,A,Y} f = (1+7)+8 = 16

Развернуть B:

  • {S,B} f = 2+6 = 8
  • {S,A,X} f = (1+4)+5 = 10
  • {S,B,C} f = (2+7)+4 = 13
  • {S,A,Y} f = (1+7)+8 = 16
  • {S,B,D} f = (2+1)+15 = 18
2 голосов
/ 01 мая 2011

Пути не дублируются, они просто остаются путями, которые алгоритм еще не исследовал. A * поддерживает открытый набор , это набор узлов, который алгоритм уже знает, как достичь (и какой ценой), но он еще не пытался их расширить.

На каждой итерации алгоритм выбирает узел, который расширяется из открытого набора (тот, который имеет наименьшую функцию f - функция f представляет собой сумму стоимости, которую алгоритм уже знает, что требуется для того, чтобы добраться до узла (g), и алгоритм оценивает, сколько будет стоить добраться от узла до цели (h, эвристика).

http://en.wikipedia.org/wiki/A*_search_algorithm

посмотрите на псевдокод, поскольку вы видите, что используется открытый набор. Итак, суть - дело не в том, что алгоритм работает путем дублирования \ копирования \ перемещения путей или узлов от одной итерации к другой - он просто выполняет свою работу с одной и той же коллекцией узлов (конечно, узлы добавляются и удаляются из коллекции).

Надеюсь, это поможет ...

...