Научная статья на тему 'Решение задачи поиска оптимального пути между двумя точками на графе с нерегулярным весом ребер'

Решение задачи поиска оптимального пути между двумя точками на графе с нерегулярным весом ребер Текст научной статьи по специальности «Математика»

CC BY
1323
124
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
АЛГОРИТМ A* / ОПТИМИЗАЦИЯ / ПРОЦЕССОРНОЕ ВРЕМЯ / ГРАФ / ALGORITHM A * / OPTIMIZATION / CPU TIME / GRAPH

Аннотация научной статьи по математике, автор научной работы — Плотников О. А., Подвальный Е. С.

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

SOLUTION OF THE PROBLEM OF SEARCH AN OPTIMAL PATH BETWEEN TWO POINTS ON A GRAPH WITH IRREGULAR EDGES OF WEIGHT

Developed and implemented in the code an algorithm that solves the problem of finding the optimal path between two points on a graph with irregular edges of weight. The algorithm is an extension of the algorithm A *. The optimization of computational CPU time is produced

Текст научной работы на тему «Решение задачи поиска оптимального пути между двумя точками на графе с нерегулярным весом ребер»

Информационные технологии

УДК 004.023

РЕШЕНИЕ ЗАДАЧИ ПОИСКА ОПТИМАЛЬНОГО ПУТИ МЕЖДУ ДВУМЯ ТОЧКАМИ НА ГРАФЕ С НЕРЕГУЛЯРНЫМ ВЕСОМ РЕБЕР

О.А. Плотников, Е.С. Подвальный

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

Ключевые слова: алгоритм А*, оптимизация, процессорное время, граф

1. Постановка задачи

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

Рис. 1. Дорожный граф

Также мы имеем две точки: начало и конец маршрута. Используя дорожный граф необхо-

димо рассчитать оптимальный маршрут за приемлемое время (~0,1 с).

2. Алгоритм А*

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

^п) = g(n) + Мп)

где Дп) значение оценки, назначенное узлу п, g(n) наименьшая стоимость прибытия в узел п из точки старта, ^п) эвристическое приближение стоимости пути к цели от узла п.

А* является полным в том смысле, что он всегда находит решение, если таковое существует. Если эвристическая функция h допустима, то есть никогда не переоценивает действительную минимальную стоимость достижения цели, то А* сам является допустимым (или оптимальным), также при условии, что мы не отсекаем пройденные вершины. Требование неот-сечения вершин диктуется тем, что мы работаем со взвешенным графом и, следовательно, не выполняется свойство монотонности ^х). Свойство монотонности означает, что если существуют пути А—В—С и А—С, то оценка стоимости пути от А до С должна быть меньше либо равна сумме оценок путей А—В и В—С. Математически, для всех путей х, у (где у — потомок х) должно выполняться:

Плотников Олег Александрович - ВГТУ, аспирант, тел.

8 (473) 243-74-04

Подвальный Евгений Семенович - ВГТУ, д-р техн. наук, профессор, тел. 8 (473) 243-74-04

g(x) + ^х) < g(y) + Му)

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

tAB = S*v*(1 + к) где S - расстояние от А до В, V - расход топлива, к - коэффициент, учитывающий увеличение нормативного расхода топлива, например, движение в «пробке».

П ___________________________

1 = 1 " " ' "

где (х;,1, У!д) - координаты первой вершины вектора 1, (х12, у12) - координаты второй вершины вектора 1.

А* пошагово просматривает все пути, ведущие от начальной вершины в конечную, пока не найдёт минимальный. Как и все информированные алгоритмы поиска, он просматривает сначала те маршруты, которые «кажутся» ведущими к цели. При выборе вершины он учитывает, помимо прочего, весь пройденный до неё путь (составляющая g(x) — это стоимость пути от начальной вершины). В начале работы просматриваются узлы, смежные с начальным; выбирается тот из них, который имеет минимальное значение Дх), после чего этот узел раскрывается. На каждом этапе алгоритм оперирует с множеством путей из начальной точки до всех ещё не раскрытых (листовых) вершин графа («множеством частных решений»), которое размещается в очереди с приоритетом. Приоритет пути определяется по значению Дх) = g(x) + Цх). Алгоритм продолжает свою работу до тех пор, пока значение Д(х) целевой вершины не окажется меньшим, чем любое значение в очереди (либо пока всё дерево не будет просмотрено). Из множественных решений выбирается решение с наименьшей стоимостью.

Рис. 2. Пример работы алгоритма А*

Пусть нам нужно переместиться из точки А в точку 2. Для начального узла g = 0, а h -расстояние «по прямой» до пункта назначения. Взяв к рассмотрению все соседние узлы и посчитав для них значение Д, мы должны выбрать такой узел (и отметить путь к нему), для которого Д будет минимальным. Естественно, те узлы, которые были рассмотрены на предыдущем шаге (и которые уже содержатся в результирующем пути) мы не должны включать в рассмотрение, а это в свою очередь несколько упростит задачу и время на вычисления. Эта последовательность действий выполняется до тех пор, пока не будет достигнута конечная точка.

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

Когда А* завершает поиск, он, согласно определению, нашёл путь, истинная стоимость которого меньше, чем оценка стоимости любого пути через любой открытый узел. Но поскольку эти оценки являются оптимистичными, соответствующие узлы можно без сомнений отбросить. Иначе говоря, А* никогда не упустит возможности минимизировать длину пути, и потому является допустимым.

А* оптимален для «случайно» заданных графов, что отвечает требованиям поставленной задачи.

Перейдем к более детальному рассмотрению понятий представленного алгоритма.

Состоянием является узел графа, который занимает объект - транспортное средство. Узел включает следующие поля:

- место (координаты) на карте, рассматриваемое в этом состоянии;

- стоимость лучшего пути к этой позиции из исходной позиции g(n);

- длина пути к этой позиции;

- эвристическое приближение ^п) (стоимости оставшегося пути к цели);

- оценка для этого состояния Дп), используемая для выбора следующего состояния;

- отметку времени;

- ссылка на родителя этого узла, то есть узла, который привел к этому состоянию.

Ссылки на родительский узел необходимы для того, чтобы по окончании работы алгоритм возвращал найденный оптимальный маршрут,

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

Стоимость перехода из одной позиции в другую, как и минимальная оценка стоимости достижения цели, составляет затраты топлива на переход из одного узла графа в другой.

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

Качество работы алгоритма сильно зависит от качества эвристического приближения ^п). Если h близко к истинной стоимости оставшегося пути, то эффективность будет очень высокой; с другой стороны, если h будет слишком низким, то это отразится на эффективности в худшую сторону.

3. Оптимизация А*

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

где ^ — оптимальная эвристика, то есть точная оценка расстояния из вершины х к цели. Другими словами, ошибка ^х) не должна расти быстрее, чем логарифм от оптимальной эвристики.

При работе алгоритма он потребляет ресурсы памяти и процессорного времени. Для нас особенно критичен ресурс времени, поэтому оптимизацию будем проводить по этому параметру. Оценку работы алгоритма будем рассматривать для двух случаев: трудного и простого. Измерение проводим в миллисекундах для каждого из случаев. Соотношения ско-

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

Реализация алгоритма А* в стандартном виде для трудного случая занимает 2876 мс, для простого - 315 мс. Такой результат не удовлетворяет условиям задачи, следовательно, данная реализация нуждается в оптимизации. Результаты работы алгоритма А* и результаты оптимизаций представлены в таблице 1.

Во-первых, мы можем сократить время работы алгоритма, предварительно просчитав расстояния между узлами графа, приведя его к виду, представленному на рис 3. Заметим, что при частом использовании алгоритма, данные вычисления необходимо провести лишь один раз и затем использовать полученные результаты при каждом выполнении алгоритма. Вынеся данный расчет (для всей карты) из алгоритма, время работы алгоритма сократилось на 21,9% для трудного и на 8,6% для простого случаев.

Mm

Рис. 3. Оптимизированный дорожный граф

Существует несколько особенностей реализации и приёмов, которые могут влиять на эффективность алгоритма. Первое, на что стоит обратить внимание — это то, как очередь с приоритетом обрабатывает связи между вершинами. Если вершины добавляются в неё так, что очередь работает по принципу LIFO, то в случае вершин с одинаковой оценкой A* «пойдёт» в глубину. Если же при добавлении вершин реализуется принцип FIFO, то для вершин с одинаковой оценкой алгоритм, напротив, будет реализовывать поиск в ширину. В случае

дорожного графа имеет смысл использовать очередь по принципу LIFO, т.к. наиболее вероятные решения находятся на приближении к прямой до точки назначения. Данная оптимизация позволяет добиться сокращения времени работы алгоритма на 7% и 15,6% для трудного и простого случаев соответственно.

Для поиска вершины в сортирующем дереве многие стандартные алгоритмы требуют времени O(n). Для минимизации временных затрат усовершенствуем дерево с помощью хеш-таблицы. Воспользуемся стандартным классом HashMap <K,V> в среде NetBeans IDE 7.0.1, он отличается от HashTable <K,V> тем, что его методы несинхронизированы, соответственно, скорость работы выше. Данный класс производит выборку за время 0(1). Реализовав алгоритм с использованием только структур HashMap <точка, узел>, мы получили выигрыш по производительности в 89,6% и 96,2% для трудного и простого случаев соответственно.

Далее мы предположили, что возможно добиться лучших результатов при просмотре дорожного графа в двух направлениях: от начальной вершины к конечной и в обратном направлении (от конечной вершины к начальной). Однако, данный подход предполагает использование дополнительных структур данных и поиск в них. Реализация двунаправленного поиска наоборот увеличила время работы алгоритма в обоих случаях. Результат также представлен в таблице 1.

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

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

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

Выполнив соответствующие модификации в алгоритме мы сократили время его работы на 94,2% для трудного случая и на 81,6% для простого случая. В результате данной оптимизации мы сократили количество обрабатываемых уз-

лов. Результат для трудного случая представлен на рис. 4.

Рис. 4. Пример сокращения количества обрабатываемых узлов (сверху - до оптимизации, снизу - после оптимизации)

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

Реализация двунаправленного поиска показала отрицательные результаты производительности алгоритма. Возможно, дополнив и расширив данный подход, он даст положительные результаты.

Также стоит отметить, что мы не рассматривали оптимизацию оценки эвристического приближения. Так, если оценка будет ближе к

истине, это также сократит время работы алгоритма.

Не смотря на то, что мы добились приемлемого времени работы алгоритма, следует учитывать, что при большом количестве ис-

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

Оценка результатов работы алгоритма A*

Реализация Простой случай Трудный случай

Время ЦП Изменение, мс Изменение, %

Классический A* 315 - - 2876 - -

Оптимизация графа 288 27 8,57 2360 516 17,94

Очередь по принципу LIFO 243 45 15,63 2193 167 7,07

Использование структур HashMap 9,22 233,78 96,20 228 1965 89,60

Двунаправленный поиск 10,07 -0,85 -9,22 318 -90 -39,47

Контроль оценки эвристического приближения 1,7 7,52 81,56 13,3 214,7 94,17

Итого 1,7 313,3 99,46 13,3 2862,7 99,54

Литература

1. Russell S.J., Norvig P. Artificial Intelligence: A Modem Approach. Upper Saddle River, N.J.: Prentice Hall, 2009, - pp. 1152.

2. A* algorithm [Электронный ресурс] — Режим доступа: http://intelligence. worldofcomputing. net/ai-search/ a-star.html, свободный. — Загл. с экрана.

3. Recursive Best First Search [Электронный ресурс] — Режим доступа:

http://intelligence.worldofcomputing.net/ ai-search/recursive-best-first-search.html, свободный. — Загл. с экрана.

4. Iterative deepening A* [Электронный ресурс] — Режим доступа: http://intelligence.worldofcomputing.net/ai-search/ iterative-deepening-a-star.html, свободный. — Загл. с экрана.

Воронежский государственный технический университет

SOLUTION OF THE PROBLEM OF SEARCH AN OPTIMAL PATH BETWEEN TWO POINTS ON A GRAPH WITH IRREGULAR EDGES OF WEIGHT O.A. Plotnikov, E.S. Podvalniy

Developed and implemented in the code an algorithm that solves the problem of finding the optimal path between two points on a graph with irregular edges of weight. The algorithm is an extension of the algorithm A *. The optimization of computational CPU time is produced

Key words: algorithm A *, optimization, CPU time, graph

i Надоели баннеры? Вы всегда можете отключить рекламу.