Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
pathfinding.doc
Скачиваний:
43
Добавлен:
18.04.2015
Размер:
351.74 Кб
Скачать

Дальнейшая оптимизация

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

В самом простом случае, когда мы имеем дело с однородной в плане проходимости местностью, эвристические функции оценки расстояния на ней сводятся либо к вычислению его по формуле длины отрезка с известными координатами крайних точек, либо к простому суммированию расстояния между точками по горизонтали и по вертикали. Первый способ несколько точнее, но значительно дольше второго (возведение в степень против сложения), отчего в большинстве случаев приоритетнее именно второй способ. К слову, эти функции легко изменить при переходе в n-мерное пространство, например приn=5, формула примет вид

AB=((Ax-Bx)^2+(Ay-By)^2+(Az-Bz)^2+(Ap-Bp)^2+(Aq-Bq)^2)^0.5

Где x,y,z,p,q– оси в координатном пространстве,Ax,Ayи т.д. – координата точки А на соответствующей оси.

Если местность начинает иметь значительно более неоднородную структуру, т.е. вес связи между двумя вершинами графа его представляющими будет не пропорционален геометрическому расстоянию между ними, то представленные функции всё ещё актуальны, но уже сильно теряют в точности. Ещё меньше точность у этих функций становится, если граф теряет привязку к местности. Разумеется, в теории всякий граф можно представить в виде геометрической фигуры и взять координаты, но построение большого графа, который к тому же строится в не меньше, чем, скажем, пятимерном пространстве – задача даже более сложная, чем нахождение пути по этому графу, поэтому простая эвристика уже неактуальна.

Существует несколько способов замены эвристики для таких случаев. Во-первых, можно ввести простую систему приоритетов, ведь с точки зрения теории вероятности, шанс нахождения на кратчайшем пути больше у тех узлов, которые имеют больше исходящих связей, а узел, не имеющий связей кроме той, по которой к нему перешла обработка, если этот узел не является узлом конца пути, является тупиком и может вовсе не обрабатываться.

Также можно воспользоваться принципом базы данных. Допустим, у нас есть статический граф или любая область поиска. На ней несколько раз запускается поиск пути для разных точек. Каждый раз при этом сохраняются данные о точках начала и конца пути, а также их суммарной длине. Для ускорения процесса получения таких данных, можно проводить также после каждого использования поиска пути полный анализ закрытого списка для тех точек, для которых путь ещё не изучен. При таком применении алгоритма, мы можем использовать следующую эвристическую функцию:

  • Если путь между текущей точкой и точкой конца пути уже вычислялся, то мы можем смело считать длину найденного пути точным расстоянием между этими точками (при том, что граф не динамичен или не менялся с момента того расчёта; менее точная версия – если изменения были, но не затронули узлы вычисленного пути и их связи).

  • Иначе если точки, для которых вызвана эвристика, числятся среди связей одного из вычисленных путей, причём вес этих связей меньше, чем, скажем, треть этого пути, то эвристическим расстоянием можно считать сумму длины такого пути и веса ребра/рёбер, которые ведут из его края/краёв в необходимые узлы.

  • Иначе неизвестно.

Проблема здесь в том, что пока не получена достаточно полная база результатов, использование такой эвристики будет лишь замедлять поиск пути, а даже при сборе достаточного числа данных, применение эвристики будет куда дороже, чем в случае с привязкой графа к местности. С другой стороны, в некоторых условиях возможно сразу во входных данных получить некоторые расстояния, что облегчит сбор данных. Замечу также, что поскольку эвристические функции становятся сложнее, возрастает актуальность расписанного ранее отката их значений (см. подзаголовок «Практика» раздела «Алгоритм А*») вместо перевычисления результатов.

Кроме того, иногда бывает возможно постоянно получать данные, которые должны генерироваться эвристикой, как входные данные. Например, если исполнитель может самостоятельно измерять такие данные, что существенно облегчит задачу.

Другой аспект оптимизации – оптимизация хранения информации, и тут основные изменения имеют место быть в том случае, если длина пути имеет ощутимые размеры в плане числа узлов. Во-первых, повышается актуальность работы алгоритма через два динамических списка, что было мною уже применено в описании данного алгоритма и алгоритма Дейкстры (см. подзаголовок «Практика» разделов «Алгоритм А*» и «Алгоритм Дейкстры»), в то время как каноническая версия предполагает изначальное введение массива всех необработанных узлов. Использование двух динамических списков позволяет не хранить в памяти огромное число структур данных, описывающих необработанный узел, а добавлять их по мере надобности. Это также позволяет алгоритму работать в том случае, если не весь граф изначально известен.

Также серьёзным поводом для оптимизации служит то, что если узел уже не будет требовать переобработки, то для него имеет смысл хранить только его название и тот узел, из которого в него перешли. Тем не менее, в канонической версии для таких узлов хранится также стоимость перемещения в них из начальной точки и эвристическое значение суммарной длины пути. Вывод прост – начиная с определённой длины пути (допустим, 20 узлов) имеет смысл удалять вышеуказанную информацию для тех узлов, которые, имеют связи только с узлами из списка уже обработанных узлов (задача несколько усложняется для орграфов).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]