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

 

ОГЛАВЛЕНИЕ


ЗАДАНИЕ

Постановка задачи и сфера ее применения

Общие сведения о графах

Алгоритм Дейкстры

Алгоритм, реализованный в программе

ОСОБЕННОСТИ ПРОГРАММНОЙ РЕАЛИЗАЦИИ

ПРИМЕР ИСПОЛЬЗОВАНИЯ ПРОГРАММНОЙ РЕАЛИЗАЦИИ

ЗАКЛЮЧЕНИЕ

ЛИТЕРАТУРА


ЗАДАНИЕ


.Разработать алгоритм реализации на ЭВМ процесса поиска кратчайшего пути в графе (методом Дейкстры). Предусмотреть проверку допустимости весов дуг графа.

.Написать и отладить программу, реализующую разработанный алгоритм.

.Проверить работоспособность программы на тестовых примерах.


Постановка задачи и сфера ее применения


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

Нахождение кратчайшего пути - жизненно необходимо и используется практически везде, начиная от нахождения оптимального маршрута между двумя объектами на местности (например, кратчайший путь от дома до университета), в системах автопилота, для нахождения оптимального маршрута при перевозках, коммутации информационного пакета в Internet и т.п.

Кратчайший путь рассматривается при помощи некоторого математического объекта, называемого графом.

Существуют три наиболее эффективных алгоритма нахождения кратчайшего пути:

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

·алгоритм Флойда;

·алгоритм Йена.

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

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

Общие сведения о графах

алгоритм граф путь работоспособность

Граф G (рис.1.1) задается множеством точек (вершин) х1, х2,..., хn. (которое обозначается через Х) и множеством линий (ребер) а1, а2,...,аm. (которое обозначается символом А), соединяющих между собой все или часть этих точек. Таким образом, граф G полностью задается (и обозначается) парой (Х, А). Если ребра из множества А ориентированы, что обычно показывается стрелкой, то они называются дугами, и граф с такими ребрами называется ориентированным графом.




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

Если ребра не имеют ориентации, то граф называется неориентированным, (двухстороннее движение).

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

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

Так, на рис. 1.2 путями являются последовательности дуг:

а6, а5, а9, а8, а4. (1)

а1, а6, а5, а9. (2)

а1, а6, а5, а9, а10, а6, а4. (3)


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

Простой орцепью называется такой путь, в котором каждая вершина используется не более одного раза. Например, путь (2).

Маршрут есть неориентированный двойник пути, и это понятие рассматривается в тех случаях, когда можно пренебречь направленностью дуг в графе. Таким образом, маршрут есть последовательность ребер ä1, ä2,..., äq, в которой каждое ребро аi, за исключением первого и последнего ребер, связано с ребрами аi-1 и аi+1 своими концевыми вершинами.

В графе, изображенном на рис. 1.2, являются маршрутами; две точки над символом дуги означают, что ее ориентацией пренебрегают, т.е. дуга рассматривается как неориентированное ребро. Также путь или маршрут можно изображать последовательностью вершин. Например, путь (1) будет выглядеть следующем образом: х2, х5, х4, х3, х5, х6. Иногда дугам графа приписываются числа, называемые весом, стоимостью, или длиной этой дуги. В этом случае граф называется графом с взвешенными дугами. А если вес приписывается вершинам графа, то тогда получается граф с взвешенными вершинами. Если в графе веса приписаны и дугам и вершинам, то он называется просто взвешенным. При рассмотрении пути µ представленного последовательностью дуг (ä1, ä2,..., äq), за его вес принимается число l(µ), равное сумме весов всех дуг, входящих в µ, т.е.



Алгоритм Дейкстры


Алгоритм Дейкстры строит кратчайшие пути, ведущие из исходной вершины графа к остальным вершинам этого графа (если таковые имеются).

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

Сначала помечается исходная вершина; следующей, очевидно, будет помечена вершина, ближайшая к исходной, и смежная с ней.

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

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

.Выберем из этих путей кратчайший. А затем выберем среди них самый короткий ко всем непомеченным вершинам, и пометим вершину, к которой он ведет.

Алгоритм завершится, когда будут помечены все достижимые вершины.

В результате работы алгоритма Дейкстры строится Дерево кратчайших путей.


Алгоритм, реализованный в программе


Задаются:

. Матрица весов дуг W[i,j], веса дуг между вершинами i и j. Матрица симметричная и положительная. Если i и j не связаны дугой, то W[i,j]=-1

. Начальная вершина x1

. Конечная вершина х2

Рабочие данные:

. Массив distance[i]. В нем будут хранится длины кратчайших путей из x1 в i.

. Массив path[i]. В нем будет хранится шаг кратчайшего пути между i и х1.

. front[i]=1, если вершина во фронте волны, 0 иначе

. newfront[i] массив, где будет готовится новый фронт.

Начало.

.Заполняется массив distance значениями 10000 (символизирует бесконечность).

. front[x1]=1; остальные элементы 0

. Обнуляем все элементы в newfront

Шаг алгоритма.

. Ищем ненулевые элементы front[i]. Для каждого такого front[i] != 0 делаем шаг 1.1

.1 Ищем смежные с i вершины, т.е. ищем неотрицательные элементы W[i,j].

Для таких элементов делаем шаги 1.1.1-1.1.2

1.1.1 newdist=distance[i]+W[i,j]

1.1.2 если newdist<distance[j], то делаем шаги 1.1.2.1-1.1.2.3

.1.2.1 distance[j]=newdist - то есть до j вершины существует путь длины newdist

.1.2.2 path[j]=i - то есть кратчайший путь в j лежит через вершину i

.1.2.3 newfront[j]=1 - добавляем j вершину в новый фронт

. Анализируем newfront.

.1. Если newfront[x2]=1 (то есть в новом фронте присутствует конечная вершина), то путь найден и переходим к шагу 3

.2. Если newfront[i]=0 для всех i то пути между x1 и х2 не существует, завершаем алгоритм.

.3. Иначе для всех i front[i]=newfront[i]; newfront[i]=0; то есть обновляем фронт, и обнуляем новый фронт, и повторяем шаг 1.

. Шаг 3. Распечатка пути. Видимо кратчайший путь из x1 в х2 найден.

Длина этого пути лежит в distance[x2].

Печатаем путь их х2 в х1:


t=x2;(t != x1)

{(x2);=path[t];

}


Получили распечатку кратчайшего пути из х2 в х1, для вывода результата этот путь записываем в обратном направлении.


ОСОБЕННОСТИ ПРОГРАММНОЙ РЕАЛИЗАЦИИ


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

Выполнение программы: алгоритм реализован в среде Matlab в виде функции deikstra(initialPoint, endPoint), которая в качестве аргументов принимает начальную и конечную точку для поиска кратчайшего пути между ними. Начальная и конечная точки задаются по номеру соответствующей вершины графа.

Анализ входных данных: так как отрицательные веса невозможны, то в самом начале программа анализирует введенные входные данные; при обнаружении отрицательного веса возвращает ошибку и завершает выполнение.

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


ПРИМЕР ИСПОЛЬЗОВАНИЯ ПРОГРАММНОЙ РЕАЛИЗАЦИИ


Пусть имеется ориентированный взвешенный граф на пяти вершинах. Его матрица смежности имеет вид:


Таблица 1. Матрица смежности.

вершина123451010030902005000300001540020060500000

Необходимо найти кратчайший путь между вершинами 1 и 5.

.Данная матрица смежности записывается в файл testdata.xls:


Рис. 2. Задание матрицы смежности.


.В командном окне Matlab вызывается функция deikstra(1, 5), где в качестве аргументов указываются соответствующие номера начальной и конечной вершины:

Рис. 3. Вызов функции, реализующей алгоритм Дейкстры


.На экран выводится результат:


Рис. 4. Вывод результата.

ЗАКЛЮЧЕНИЕ


В данной работе была изучена тема «Поиск кратчайшего пути в графе» на основе алгоритма Дейкстры. Для изучения работы данного алгоритма была написана соответствующая программа. Программа реализована в среде Matlab. Работоспособность написанной программы была проверена на тестовых примерах, один из которых приведен в работе.

Изученный алгоритм является достаточно простым в понимании и программной реализации.

Полученные результаты согласуются с теорией.


ЛИТЕРАТУРА


Статья в Интернете: <http://www.tspu.tula.ru/ivt/old_site/umr/trpo/tasks/t13.htm>


ОГЛАВЛЕНИЕ ЗАДАНИЕ Постановка задачи и сфера ее применения Общие сведения о графах Алгоритм Дейкстры Алгоритм, реализованный в программе О

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ