Нахождение кратчайших путей с помощью алгоритма Дейкстры

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 22.09.2011
Размер файла 1,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Аннотация

Курсовая работа по дисциплине “Структуры и алгоритмы обработки данных” ставит своей целью самостоятельного исследования студентами различных алгоритмов нахождения кротчайших путей.

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

Содержание

1. Введение

2. Задание

3. Краткие теоретические сведения

4. Тестовый пример (вручную)

5. Содержательный (словесный) алгоритм

6. Блок-схема

7. Реализация программы

8. Заключение

9. Список литературы

10. Приложение

1. Введение

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

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

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

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

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

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

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

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

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

2. Задание

алгоритм граф дейкстр

3. Краткие теоретические сведения

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

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

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

Напомним, что алгоритм построения МОД нацелен на поиск дерева с минимальным суммарным весом ребер. Рассмотрим, например, «циклический» граф, т.е. такой граф, в котором первая вершина соединена со второй, вторая с третьей, и так далее, а последняя вершина свою очередь соединена с первой. Такой граф представляет собой просто кольцо, каждая вершина в котором соединена с двумя другими. Пример такого графа с шестью вершинами приведен на рис. 6.7 (а).

Обратите внимание на то, что вес каждого ребра равен 1 за исключением ребра, соединяющего вершины А и В, вес которого равен 2. Алгоритм построения минимального остовного дерева выберет все ребра веса 1, отбросив единственное ребро веса 2. Это означает, однако, что путь от А к В в минимальном остовном дереве должен проходить через все остальные вершины, а его длина равна 5 (рис. 6.7 (6)). Ясно, что он не является кратчайшим, поскольку в исходном графе вершины А и В соединены ребром длины 2

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

Жадный алгоритм построения минимального остовного дерева не пригоден для поиска кратчайшего пути между двумя вершинами, поскольку на каждом проходе он учитывает длину лишь одного ребра. Если же изменить его так, чтобы при выборе ребра, ведущего в кайму, он выбирал ребро, являющееся частью кратчайшего в целом пути из начальной вершины, то мы получим требуемый результат. На рис. 6.8 приведен пример исполнения этого алгоритма. Алгоритм выполняется на том же графе (рис. 6.8 (а)), что и алгоритм построения минимального остовного дерева, а искать мы будем кратчайший путь А до G.

В начале пути из вершины А у нас есть четыре возможных ребра. Из этих четырех ребер ребро АВ является кратчайшим. Поэтому мы добавляем к дереву вершину В (рис. 6.8 (в)) и смотрим, как следует обновить набор путей. С уже построенным деревом соединены теперь вершины Е и О, поэтому их следует добавить к кайме. Кроме того, мы должны посмотреть на вершину IЭ и сравнить прямой путь из нее в А, длина которого равна 7, с окольным путем через вершину В, длина которого равна 8. Прямой путь короче, поэтому приписанное к IЭ ребро менять не следует. Изучив теперь имеющиеся возможности, мы видим, что кратчайшим является путь из А в С длины 4. Ребро ВЕ короче, однако мы рассматриваем полную длину пути из А, а такой путь, ведущий в Е, имеет длину 5. Теперь к дереву кратчайших путей добавим вершину С (рис. 6.8 (г)). Посмотрев на граф, мы обнаруживаем, что можем пройти в вершину Г через вершину С, однако длина этого пути будет равна 10 - больше, чем у прямого пути из А в Е, поэтому изменения в наборе путей не производятся.

На рис. 6.8 (г) мы можем выбрать теперь либо путь из А в Е, либо путь из А в Е, проходящий через вершину В: оба они имеют длину 5. Какой из путей будет выбран при исполнении программы, зависит от способа хранения данных в ней. Мы же, встретившись с необходимостью добавить вершину, будем всегда выбирать вершину, метка которой первая в лексикографическом порядке.

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

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

На рис. 6.8 (е) видно, что путь в вершину В короче пути в вершину О. Поэтому мы добавляем к дереву вершину В и получаем ситуацию, изображенную на рис. 6.8 (ж).

Осталось добавить только вершину О, и в результате мы получаем дерево кратчайшего пути с рис. 6.8 (з). Длина кратчайшего пути из А в О равна 10. Вернувшись к рис. 6.5 (з), мы находим на нем еще один пример минимального остовного дерева, в котором путь между А и О не является кратчайшим: его длина равна 11.

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

4. Тестовый пример (вручную)

Дейкстры

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

5. Содержательный (словесный) алгоритм

Дейкстры.

procedure Dijkstra;

begin

A) S:= {1};

B) for i:= 2 to n do

C) D[i]:= C[l, i] ; { инициализация D }

D) for i:= 1 to л - 1 do begin

E) выбор из множества V\S такой вершины w,

что значение D[w] минимально;

F) добавить w к множеству S;

G) for каждая вершина v из множества V\S do

(8) D[v]:= min(D[v], D[w] + C[w, v] )

end

end; { Dijkstra }

6. Блок-схема

Дейкстры

7. Реализация программы

Программа выводит минимальный путь между двумя указанными вершинами в графе и его длину.

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

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

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

Кроме стандартных функций из библиотек iostream.h, string.h, stdio.h, conio.h были использованы также следующие функции.

· word minim(word x, word y) - функция, которая возвращает минимальное из x и y.

· int min(int n) - функция, которая возвращает номер элемента массива l[i] минимальной «неотмеченной» длиной пути(flag[i]=0).

Описание переменных

Переменная

Тип

Описание

n

int

Количество точек (вершин) грифа

i,j

int

Счётчики

p

int

Номер кратчайшего пути и наименьшей длины пути

xn

int

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

xk

int

Номер конечной точки (вершины)

flag[11]

int

Массив, i-й элемент которого имеет значение 0, когда i-й путь и расстояние временные, и принимает значение 1, когда i-й путь и расстояние становятся постоянными

c[11][11]

word (unsigned int)

Массив i-j элемент которого содержит расстояние между i-й и j-й точками (вершинами)

Замечание:

1. с[i][i]=

2. c[i][j]=c[j][i]

s[80]

char

Строчная переменная, которая содержит промежуточные значения пути

path[80][11]

char

Массив строк, который содержит пути

Замечание:

После прохождения обработки по алгоритму Дейкстры p-й элемент массива содержит кратчайший путь.

l[11]

word (unsigned int)

Массив, который содержит длины путей (path)

Замечание:

После прохождения обработки по алгоритму Дейкстры p-й элемент массива содержит длину кратчайшего пути.

8. Заключение

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

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

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

9. Список литературы

1. В. Липский “ Комбинаторика для программистов”, Москва “Мир” 1988 г.

2. М. Свами, К. Тхуларисаман “Графы, сети и алгоритмы”, Москва “Мир” 1984 г.

3. Х. Пападимитриу, К. Стайлиц “Комбинаторная оптимизация. Алгоритмы и сложность”, Москва “Мир” 1985г.

4. Белов Теория Графов, Москва, «Наука»,1968.

5. Новые педагогические и информационные технологии Е.С. Полат, Москва, «Akademia» 1999 г.

6. Кузнецов О.П., Адельсон-Вельский Г.М. Дискретная математика для инженера. - М.: Энергоатомиздат, 1988.

7. Кук Д., Бейз Г. Компьютерная математика. - М.: Наука, 1990.

Нефедов В.Н., Осипова В.А. Курс дискретной математики. - М.: Издательство МАИ, 1992.

Лекции по теории графов. / Емеличев В.А., Мельников О.И. и др. М.: Наука, 1990.

Альфред В. Ахо, Джон Э. Хопкрофт, Джеффри Д. Ульман, «Структуры данных и алгоритмы»

10. Приложение

Дейкстры.

#include<iostream.h>

#include<string.h>

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#define word unsigned int

int i, j, n, p, xn, xk;

int flag[11];

word c[11][11], l[11];

char s[80], path[80][11];

int min(int n)

{int i, result;

for(i=0;i<n;i++)

if(!(flag[i])) result=i;

for(i=0;i<n;i++)

if((l[result]>l[i])&&(!flag[i])) result=i;

return result;}

word minim(word x, word y)

{if(x<y) return x;

return y;}

void main()

{cout<<"Vvedite kolichestvo tochek: ";

cin>>n;

for(i=0;i<n;i++)

for(j=0;j<n;j++) c[i][j]=0;

for(i=0;i<n;i++)

for(j=i+1;j<n;j++)

{cout<<"Vvedite rasstoyanie ot x"<<i+1<<" do x"<<j+1<<": ";

cin>>c[i][j];}

cout<<" ";

for(i=0;i<n;i++) cout<<" X"<<i+1;

cout<<endl<<endl;

for(i=0;i<n;i++)

{printf("X%d",i+1);

for(j=0;j<n;j++)

{printf("%6d",c[i][j]);

c[j][i]=c[i][j];}

printf("\n\n");}

for(i=0;i<n;i++)

for(j=0;j<n;j++)

if(c[i][j]==0) c[i][j]=65535; //бесконечность

cout<<"Vvedite nachalnuy tochku: ";

cin>>xn;

cout<<"Vvedite konechnuy tochku: ";

cin>>xk;

xk--;

xn--;

if(xn==xk)

{cout<<"Nachalnaya I konechnaya tochki sovpadayt."<<endl;

getch();

return;}

for(i=0;i<n;i++)

{flag[i]=0;

l[i]=65535;}

l[xn]=0;

flag[xn]=1;

p=xn;

itoa(xn+1,s,10);

for(i=1;i<=n;i++)

{strcpy(path[i],"X");

strcat(path[i],s);}

do

{for(i=0;i<n;i++)

if((c[p][i]!=65535)&&(!flag[i])&&(i!=p))

{if(l[i]>l[p]+c[p][i])

{itoa(i+1,s,10);

strcpy(path[i+1],path[p+1]);

strcat(path[i+1],"-X");

strcat(path[i+1],s);}

l[i]=minim(l[i],l[p]+c[p][i]);}

p=min(n);

flag[p]=1;}

while(p!=xk);

if(l[p]!=65535)

{cout<<"Put: "<<path[p+1]<<endl;

cout<<"Dlina puti: "<<l[p]<<endl;}

else

cout<<"takogo puti ne syshestvuet!"<<endl;

getch();}

Результат выполнения программ.

Декстра.

Размещено на Allbest.ru


Подобные документы

  • Графы: определения, примеры, способы изображения. Смежные вершины и рёбра. Путь в ориентированном и взвешенном графе. Матрица смежности и иерархический список. Алгоритм Дейкстры - алгоритм поиска кратчайших путей в графе. Работа в программе "ProGraph".

    презентация [383,8 K], добавлен 27.03.2011

  • Разработка алгоритма реализации на ЭВМ процесса поиска кратчайшего пути в графе методом Дейкстры. Программная реализация алгоритма поиска кратчайшего пути между двумя любыми вершинами графа. Проверка работоспособности программы на тестовых примерах.

    реферат [929,8 K], добавлен 23.09.2013

  • Анализ алгоритмов нахождения кратчайших маршрутов в графе без отрицательных циклов: Дейкстры, Беллмана-Форда и Флойда-Уоршалла. Разработка интерфейса программы на языке C++. Доказательство "правильности" работы алгоритма с помощью математической индукции.

    курсовая работа [1,5 M], добавлен 26.07.2013

  • Изучение основных понятий и определений теории графов. Рассмотрение методов нахождения кратчайших путей между фиксированными вершинами. Представление математического и программного обоснования алгоритма Флойда. Приведение примеров применения программы.

    контрольная работа [1,4 M], добавлен 04.07.2011

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

    курсовая работа [495,7 K], добавлен 24.06.2013

  • Задача нахождения кратчайшего покрытия булевой матрицы. Алгоритмы поиска кратчайших покрытий методом Патрика и методом Закревского. Метод предварительного редуцирования булевой матрицы. Описание программы "Нахождение кратчайшего покрытия булевых матриц".

    курсовая работа [884,1 K], добавлен 12.12.2010

  • Теория графов и её применения. Разработка программного продукта для решения задач нахождения минимального пути. Анализ надежности и качества ПП "метода Дейкстры". Математическая модель задачи. Алгоритмы Дейкстры на языке программирования Turbo Pascal.

    курсовая работа [1,6 M], добавлен 26.03.2013

  • Алгоритм сортировки Шейкер: математическое описание задачи и описание алгоритма. Алгоритм покрытия: построение одного кратчайшего покрытия. Описание схемы и работы алгоритма на графах: нахождение кратчайшего пути. Контрольные примеры работы алгоритмов.

    курсовая работа [43,8 K], добавлен 19.10.2010

  • История и термины теории графов. Описание алгоритма Дейкстры. Математическое решение проблемы определения кратчайшего расстояния от одной из вершин графа до всех остальных. Разработка программы на объектно-ориентированном языке программирования Delphi 7.

    контрольная работа [646,9 K], добавлен 19.01.2016

  • Понятие и сущность графы, методы решения задач по поиску кратчайших путей в ней. Особенности составления программного кода на языке программирования Pascal с использованием алгоритма Форда-Беллмана, а также порядок ее тестирования с ручным просчетом.

    курсовая работа [1,2 M], добавлен 31.07.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.