Общие теоретические основы

Обход в ширину. Алгоритм Дейкстры.

КУРСОВАЯ РАБОТА

студентки 1 курса 131 группы

специальности 090301.65 Компьютерная безопасность

факультета компьютерных наук и информационных технологий

Шакировой Виолетты Александровны


Научный руководитель (руководитель)

аспирант _____________ Гавриков А. В.

Зав. кафедрой
профессор, к.ф -м.н. _____________ Салий В. Н.

Саратов 2013

СОДЕРЖАНИЕ

Введение 3

1 Теоретическая часть 4

1.1 Общие теоретические основы 4

1.2 Алгоритмы обхода графа 4

1.2.1 Обход в ширину 4

1.2.1.1 Метод обхода 4

1.2.1.2 Алгоритм обхода 5

1.2.1.3 Анализ обхода 6

1.2.1.4 Корректность 6

1.2.2 Поиск кратчайшего пути 7

1.2.2.1 Метод обхода 7

1.2.2.2 Алгоритм обхода 9

1.2.2.3 Анализ обхода 9

1.2.2.4 Корректность 10

2 Практическая часть 13

2.1 Реализация обхода в ширину 12

2.2 Реализация алгоритма Дейкстры 14

Заключение 16

Список использованных источников 17

ВВЕДЕНИЕ

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

1) алгоритм Дейкстры (используется для нахождения оптимального маршрута между двумя вершинами);

2)алгоритм Флойда (для нахождения оптимального маршрута между всеми парами вершин);

3)алгоритм Йена (для нахождения k-оптимальных маршрутов между двумя вершинами)

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

Теоретическая часть

Общие теоретические основы

Введем соответствующую терминологию.

Граф – это упорядоченная пара множеств Общие теоретические основы - student2.ru Общие теоретические основы - student2.ru – это подмножество вершин (или узлов), а Общие теоретические основы - student2.ru – упорядоченное или не упорядоченное множество ребер, соединяющих пары вершин из Общие теоретические основы - student2.ru .

Взвешенный граф – граф Общие теоретические основы - student2.ru , где каждому ребру или вершине присваивается числовое значение, или вес.

Не взвешенный граф – граф Общие теоретические основы - student2.ru , где разные вершины или ребра не различаются по весу.

Ациклический граф – граф, не имеющий циклов.[1]

Временная сложность алгоритма – это функция размера входных и выходных данных, равная максимальному количеству элементарных операций, проделываемых алгоритмом для решения экземпляра задачи указанного размера. Во многих задачах размер выхода не превосходит или пропорционален размеру вход – в этом случае можно рассматривать временную сложность как функцию размера только входных данных.[2]

Список смежности – эффективный способ представления разреженных графов. Это структура, где для каждой вершины хранится в динамическом списке смежные ей вершины.

Разреженный граф – граф, в котором в действительности ребра определены только для малой части возможных пар вершин.[1].

1.2 Алгоритмы обхода графа

1.2.1 Обход в ширину

1.2.1.1 Метод обхода

Обход в ширину (breadth-first traversal) является основой для многих важных алгоритмов для работы с графами.

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

Поиск в ширину также может построить дерево поиска в ширину. Изначально оно состоит из одного корня Общие теоретические основы - student2.ru . Когда мы добавляем не посещенную вершину в очередь, то добавляем ее и ребро, по которому мы до нее дошли, в дерево. Поскольку каждая вершина может быть посещена не более одного раза, она имеет не более одного родителя. После окончания работы алгоритма для каждой достижимой из Общие теоретические основы - student2.ru вершины Общие теоретические основы - student2.ru путь в дереве поиска в ширину соответствует кратчайшему пути от Общие теоретические основы - student2.ru до Общие теоретические основы - student2.ru в Общие теоретические основы - student2.ru .

Также можно для каждой вершины Общие теоретические основы - student2.ru считать длину этого пути, равную Общие теоретические основы - student2.ru . Можно считать, что для не посещенных вершин эта длина бесконечно велика. Тогда на каждом шаге длина пути до Общие теоретические основы - student2.ru равна Общие теоретические основы - student2.ru , если Общие теоретические основы - student2.ru посещена и Общие теоретические основы - student2.ru в противном случае. Отсюда следует, что если на каждом шаге обновлять длины путей, то информация о множестве Общие теоретические основы - student2.ru является избыточной, и его можно не хранить.[4]

1.2.1.2 Алгоритм обхода

Ниже представлен псевдокод алгоритма поиска в ширину.

Таблица 1.2 – Псевдокод обхода в ширину.

Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru Общие теоретические основы - student2.ru [1]
1.2.1.3 Анализ обхода

Оценим время работы для входного графа Общие теоретические основы - student2.ru . В очередь добавляются только не посещенные вершины, поэтому каждая вершина посещается не более одного раза. Операции внесения в очередь и удаления из нее требуют Общие теоретические основы - student2.ru времени, так что общее время работы с очередью составляет Общие теоретические основы - student2.ru операций. Для каждой вершины Общие теоретические основы - student2.ru рассматривается не более Общие теоретические основы - student2.ru ребер, инцидентных ей. Так как Общие теоретические основы - student2.ru , то время, используемое на работу с ребрами, составляет Общие теоретические основы - student2.ru . Поэтому общее время работы алгоритма поиска в ширину — Общие теоретические основы - student2.ru .

1.2.1.4. Корректность

Утверждение: В алгоритме поиска в ширину очередь всегда содержит сначала некоторое количество вершин с расстоянием Общие теоретические основы - student2.ru ,а потом некоторое количество вершин с расстоянием Общие теоретические основы - student2.ru (возможно, нулевое).

▲ Докажем это утверждение индукцией по числу выполненных алгоритмом шагов.

База: изначально очередь содержит только одну вершину Общие теоретические основы - student2.ru с расстоянием 0, утверждение верно.

Переход: пусть после l-го шага алгоритма очередь содержит p вершин с расстоянием Общие теоретические основы - student2.ru и Общие теоретические основы - student2.ru вершин с расстоянием Общие теоретические основы - student2.ru . Тогда на Общие теоретические основы - student2.ru шаге мы извлечем из очереди одну вершину и добавим в нее все не посещенные Общие теоретические основы - student2.ru вершин связанные с ней; расстояние до них, очевидно, будет равно Общие теоретические основы - student2.ru . У нас останется Общие теоретические основы - student2.ru (возможно, 0) вершин с расстоянием Общие теоретические основы - student2.ru и Общие теоретические основы - student2.ru вершин с расстоянием Общие теоретические основы - student2.ru , что соответствует нашему инварианту. ■

Теорема: Алгоритм поиска в ширину в невзвешенном графе находит длины кратчайших путей до всех достижимых вершин.

▲ Допустим, что это не так. Выберем из вершин, для которых кратчайшие пути от Общие теоретические основы - student2.ru найдены некорректно, ту, настоящее расстояние до которой минимально. Пусть это вершина Общие теоретические основы - student2.ru , и она имеет своим предком в дереве обхода в ширину Общие теоретические основы - student2.ru , а предок в кратчайшем пути до Общие теоретические основы - student2.ru – вершина Общие теоретические основы - student2.ru .
Так как w – предок u в кратчайшем пути, то Общие теоретические основы - student2.ru и расстояние до Общие теоретические основы - student2.ru найдено верно, Общие теоретические основы - student2.ru
Так как Общие теоретические основы - student2.ru предок Общие теоретические основы - student2.ru в дереве обхода в ширину, то Общие теоретические основы - student2.ru
Расстояние до Общие теоретические основы - student2.ru найдено некорректно, поэтому Общие теоретические основы - student2.ru Подставляя сюда два последних равенства, получаем Общие теоретические основы - student2.ru то есть, Общие теоретические основы - student2.ru . Из ранее доказанной леммы следует, что в этом случае вершина Общие теоретические основы - student2.ru попала в очередь и была обработана раньше, чем Общие теоретические основы - student2.ru . Но она соединена с Общие теоретические основы - student2.ru , значит, Общие теоретические основы - student2.ru не может быть предком Общие теоретические основы - student2.ru в дереве обхода в ширину. Мы пришли к противоречию, следовательно, найденные расстояния до всех вершин являются кратчайшими.[4] Общие теоретические основы - student2.ru

1.2.2 Поиск кратчайшего пути

1.2.2.1 Метод обхода

Алгоритм Дейкстры является предпочтительным методом поиска кратчайших путей в графах со взвешенными ребрами и/или вершинами. Основная идея данного алгоритма очень похожа на основную идею алгоритма Прима. В каждом цикле мы добавляем одну вершину к дереву вершин, для которых мы знаем кратчайший путь из вершины Общие теоретические основы - student2.ru . Так же, как и в алгоритме Прима, мы сохраняем информацию о наилучшем пути на данное время для всех вершин вне дерева и вставляем их в дерево в порядке возрастания веса.

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

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

Допустим, что кратчайший путь от вершины Общие теоретические основы - student2.ru к вершине t графа G проходит через определенную промежуточную вершину Общие теоретические основы - student2.ru . Очевидно, что этот путь должен содержать кратчайший путь от вершины Общие теоретические основы - student2.ru к вершине x, в качестве префикса, ибо в противном случае можно было бы сократить путь Общие теоретические основы - student2.ru , используя более короткий префиксный путь Общие теоретические основы - student2.ru . Таким образом, прежде чем найти кратчайший путь от начальной вершины Общие теоретические основы - student2.ru к промежуточной вершине Общие теоретические основы - student2.ru .

Алгоритм Дейкстры работает поэтапно, находя на каждом этапе кратчайший путь от вершины Общие теоретические основы - student2.ru к некой новой вершине. Говоря конкретно, вершина Общие теоретические основы - student2.ru такова, что сумма Общие теоретические основы - student2.ru минимальна для всех необработанных 1≤ i≤ n, где Общие теоретические основы - student2.ru – длина ребер между вершинами i и j, a Общие теоретические основы - student2.ru – длина кратчайшего пути между ними.

Здесь напрашивает стратегия, аналогичная динамическому программированию. Кратчайший путь от вершины Общие теоретические основы - student2.ru к самой себе является тривиальным, при условии отсутствия ребер с отрицательным весом, поэтому Общие теоретические основы - student2.ru . Если Общие теоретические основы - student2.ru является самым легким ребром, входящим в вершину Общие теоретические основы - student2.ru , то это означает, что Общие теоретические основы - student2.ru . Определив кратчайший путь к вершине Общие теоретические основы - student2.ru , мы проверяем все исходящие из нее ребра, чтобы узнать, не существует ли лучшего пути из начальной вершины Общие теоретические основы - student2.ru к какой-либо неизвестной вершине через вершину Общие теоретические основы - student2.ru .

1.2.2.2 Алгоритм обхода

Ниже представлен псевдокод алгоритма поиска кратчайшего пути.

Таблица 1.2 – Псевдокод алгоритма Дейкстры.

Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru
Общие теоретические основы - student2.ru

1.2.2.3 Анализ обхода

Временная сложность алгоритма Дейкстры, в том виде, как он реализован здесь, равна Общие теоретические основы - student2.ru .

Длина кратчайшего пути от начальной вершины start к созданной вершине t равна точно значению distance[t]. Каким образом мы можем найти сам путь с помощью алгоритма Дейкстры? Мы следуем обратным указателям на родительские узлы от вершины t, пока мы не дойдем до начальной вершины (или пока не получим -1, если такого пути не существует).

Алгоритм работает правильно только на графах, в которых нет ребер с отрицательным весом. Дело в том, что при построении пути может встретиться ребро с отрицательным весом настолько большим по модулю, что оно полностью изменит оптимальный путь от вершины s к какой-то другой вершине, которая уже включена в дерево.[1]

1.2.2.4. Корректность

Теорема: Пусть Общие теоретические основы - student2.ru ориентированный взвешенный граф, вес рёбер которого неотрицателен, s – стартовая вершина. Тогда после выполнения алгоритма Дейкстры Общие теоретические основы - student2.ru для всех Общие теоретические основы - student2.ru где Общие теоретические основы - student2.ru длина кратчайшего пути из вершины Общие теоретические основы - student2.ru в вершину Общие теоретические основы - student2.ru .

▲ Докажем по индукции, что в момент посещения любой вершины Общие теоретические основы - student2.ru Общие теоретические основы - student2.ru .

На первом шаге выбирается Общие теоретические основы - student2.ru , для нее выполнено: Общие теоретические основы - student2.ru

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

Поскольку алгоритм заканчивает работу, когда все вершины посещены, в этот момент Общие теоретические основы - student2.ru для всех Общие теоретические основы - student2.ru . [3]■

Практическая часть

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

Наши рекомендации