Курсовая работа: Алгоритм Дейкстры
Название: Алгоритм Дейкстры Раздел: Рефераты по математике Тип: курсовая работа | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1. Постановка задачи Настоящая курсовая работа моделирует логическую задачу, состоящую из следующих частей: 1) Изучение конкретного раздела дискретной математики. 2) Решение 5-ти задач по изученной теме с методическим описанием. 3) Разработка и реализация в виде программы алгоритма по изученной теме. Разработка программного интерфейса. 2. Введение 2.1 Теоретическая часть дискретный математика программа интерфейс Пусть дан граф G=(X, Г), дугам которого приписаны веса (стоимости), задаваемые матрицей C=[cij
]. Задача о кратчайшем пути состоит в нахождении кратчайшего пути от заданной начальной вершины s Если, с другой стороны, такие циклы существуют, но исключаются из рассмотрения, то нахождение кратчайшего пути (простой цепи) между s и t эквивалентно нахождению в этом графе кратчайшего гамильтонова пути с концевыми вершинами s и t. Это можно усмотреть из следующего факта. Если из каждого элемента cij матрицы весов C вычесть достаточно большое число L, то получится новая матрица весов C'=[cij '], все элементы cij ' которой отрицательны. Тогда кратчайший путь от s к t – с исключением отрицательных циклов – необходимо будет гамильтоновым, т.е. проходящим через все другие вершины. Так как вес любого гамильтонова пути с матрицей весов C' равен весу этого пути с матрицей весов C, но уменьшенному на постоянную величину (n-1)×L, то кратчайший путь (простая цепь) от s к t с матрицей C' будет кратчайшим гамильтоновым путем от s к t при первоначальной матрице C. Задача о нахождении кратчайшего гамильтонова пути намного сложнее, чем задача о кратчайшем пути. Поэтому мы будем предполагать, что все циклы в G имеют неотрицательный суммарный вес. Отсюда также вытекает, что неориентированные дуги (ребра) графа G не могут иметь отрицательные веса. Следующие задачи являются непосредственными обобщениями сформулированной выше задачи о кратчайшем пути. 1) Для заданной начальной вершины s найти кратчайшие пути между t и всеми
другими вершинами xi
2) Найти кратчайшие пути между всеми парами вершин. Частные случаи, когда все cij
неотрицательны, встречаются на практике довольно часто (например, когда cij
являются расстояниями), так что рассмотрение этих специальных алгоритмов оправдано. Мы будем предполагать, что матрица не удовлетворяет, вообще говоря, условию треугольника, т.е. не обязательно
|
x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 |
x1 | 10 | 3 | 6 | 12 | ||||
x2 | 10 | 18 | 2 | 13 | ||||
x3 | 18 | 25 | 20 | 7 | ||||
x4 | 25 | 5 | 16 | 4 | ||||
x5 | 5 | 10 | ||||||
x6 | 20 | 10 | 14 | 15 | 9 | |||
x7 | 2 | 4 | 14 | 24 | ||||
x8 | 6 | 23 | 15 | 5 | ||||
x9 | 12 | 13 | 9 | 24 | 5 |
Алгоритм работает так:
Шаг 1
. .
Первая итерация
Шаг 2
. - все пометки временные.
;
;
;
Шаг 3
. соответствует x7
.
Шаг 4 . x7 получает постоянную пометку l(x7 )=3+ , p=x7 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Вторая итерация
Шаг 2
. - все пометки временные.
;
;
;
Шаг 3
. соответствует x2
.
Шаг 4 . x2 получает постоянную пометку l(x2 )=5+ , p=x2 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Третья итерация
Шаг 2
. - только вершины x3
и x9
имеют временные пометки.
;
Шаг 3
. соответствует x8
.
Шаг 4 . x8 получает постоянную пометку l(x8 )=6+ , p=x8 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Четвертая итерация
Шаг 2
. - только вершины x5
, x6
и x9
имеют временные пометки.
;
;
Шаг 3
. соответствует x4
.
Шаг 4 . x4 получает постоянную пометку l(x4 )=7+ , p=x4 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Пятая итерация
Шаг 2
. - только вершины x5
, x6
и x3
имеют временные пометки.
;
;
Шаг 3
. соответствует x9
.
Шаг 4 . x9 получает постоянную пометку l(x9 )=11+ , p=x9 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Шестая итерация
Шаг 2
. - только вершина x6
имеет временную пометку.
Шаг 3
. соответствует x5
.
Шаг 4 . x5 получает постоянную пометку l(x5 )=12+ , p=x5 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Седьмая итерация
Шаг 2
. - только вершина x6
имеет временную пометку.
Шаг 3
. соответствует x6
.
Шаг 4 . x6 получает постоянную пометку l(x5 )=17+ , p=x6 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Восьмая итерация
Шаг 2
. - только вершина x3
имеет временную пометку.
Шаг 3 . x3 получает постоянную пометку l(x3 )=23+ .
Найти кратчайшие пути от вершины 1 ко всем другим вершинам графа
Неориентированное ребро будем рассматривать как пару противоположно ориентированных дуг равного веса. Воспользуемся алгоритмом Дейкстры. Постоянные пометки будем снабжать знаком +, остальные пометки рассматриваются как временные.
x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 |
x1 | 3 | 2 | ||||||
x2 | 5 | 15 | 12 | |||||
x3 | 8 | 24 | ||||||
x4 | 6 | 8 | 18 | 4 | 11 | |||
x5 | 12 | 7 | 20 | |||||
x6 | 20 | 9 | 13 | |||||
x7 | 10 | 4 | 9 | 16 | ||||
x8 | 24 | 16 | 22 | |||||
x9 | 11 | 13 |
Алгоритм работает так:
Шаг 1
. .
Первая итерация
Шаг 2
. - все пометки временные.
;
Шаг 3
. соответствует x5
.
Шаг 4 . x5 получает постоянную пометку l(x5 )=2+ , p=x5 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Вторая итерация
Шаг 2
. - все пометки временные.
;
;
Шаг 3
. соответствует x2
.
Шаг 4 . x2 получает постоянную пометку l(x2 )=3+ , p=x2 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Третья итерация
Шаг 2
. - только вершины x3
и x4
имеют временные пометки.
;
Шаг 3
. соответствует x3
.
Шаг 4 . x3 получает постоянную пометку l(x3 )=8+ , p=x3 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Четвертая итерация
Шаг 2
. - все пометки временные.
;
Шаг 3
. соответствует x4
.
Шаг 4 . x4 получает постоянную пометку l(x4 )=9+ , p=x4 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Пятая итерация
Шаг 2
. - только вершины x7
, x6
и x9
имеют временные пометки.
;
;
Шаг 3
. соответствует x7
.
Шаг 4 . x7 получает постоянную пометку l(x7 )=13+ , p=x7 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Шестая итерация
Шаг 2
. - только вершины x6
и x8
имеют временные пометки.
;
Шаг 3
. соответствует x9
.
Шаг 4 . x9 получает постоянную пометку l(x9 )=20+ , p=x9 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Седьмая итерация
Шаг 2
. - только вершина x6
имеет временную пометку.
Шаг 3
. соответствует x6
.
Шаг 4 . x6 получает постоянную пометку l(x6 )=17+ , p=x6 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Восьмая итерация
Шаг 2
. временных пометок нет.
Шаг 3 . x8 получает постоянную пометку l(x8 )=29+ .
Найти кратчайшие пути от вершины 1 ко всем другим вершинам графа.
дискретный математика программа интерфейс
x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 |
x1 | ||||||||
x2 | 9 | |||||||
x3 | 8 | 3 | ||||||
x4 | 7 | |||||||
x5 | 6 | |||||||
x6 | 17 | 4 | ||||||
x7 | 4 | |||||||
x8 | 7 | |||||||
x9 | 9 | 5 |
Алгоритм работает так:
Шаг 1
. .
Первая итерация
Шаг 2
. - все пометки временные.
;
Шаг 3
. соответствует x4
.
Шаг 4 . x4 получает постоянную пометку l(x4 )=7+ , p=x4 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Вторая итерация
Шаг 2
. - все пометки временные.
;
Шаг 3
. соответствует x2
.
Шаг 4 . x2 получает постоянную пометку l(x2 )=9+ , p=x2 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Третья итерация
Шаг 2
. ;
Шаг 3
. соответствует x7
.
Шаг 4 . x7 получает постоянную пометку l(x7 )=11+ , p=x7 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Четвертая итерация
Шаг 2
. ;
Шаг 3
. соответствует x8
.
Шаг 4 . x8 получает постоянную пометку l(x8 )=14+ , p=x8 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Пятая итерация
Шаг 2
. ;
Шаг 3
. соответствует x3
.
Шаг 4 . x3 получает постоянную пометку l(x3 )=14+ , p=x3 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Шестая итерация
Шаг 2
. ;
Шаг 3
. соответствует x9
.
Шаг 4 . x9 получает постоянную пометку l(x9 )=19+ , p=x9 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Седьмая итерация
Шаг 2
. ;
Шаг 3
. соответствует x5
.
Шаг 4 . x5 получает постоянную пометку l(x5 )=17+ , p=x5 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Восьмая итерация
Шаг 2
. ;
Шаг 3 . x6 получает постоянную пометку l(x6 )=29+ .
Найти кратчайшие пути от вершины 1 ко всем другим вершинам графа.
Алгоритм работает так:
Шаг 1
. .
Первая итерация
Шаг 2
.
;
;
Шаг 3
. соответствует x2
.
Шаг 4 . x2 получает постоянную пометку l(x2 )=5+ , p=x2 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Вторая итерация
Шаг 2
.
;
;
Шаг 3
. соответствует x6
.
Шаг 4 . x6 получает постоянную пометку l(x6 )=8+ , p=x6 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Третья итерация
Шаг 2
.
;
;
Шаг 3
. соответствует x4
.
Шаг 4 . x4 получает постоянную пометку l(x4 )=10+ , p=x4 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Четвертая итерация
Шаг 2
.
;
Шаг 3
. соответствует x3
.
Шаг 4 . x3 получает постоянную пометку l(x3 )=13+ , p=x3 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Пятая итерация
Шаг 2
.
;
Шаг 3
. соответствует x8
.
Шаг 4 . x8 получает постоянную пометку l(x8 )=16+ , p=x8 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Шестая итерация
Шаг 2
.
;
Шаг 3
. соответствует x7
.
Шаг 4 . x7 получает постоянную пометку l(x7 )=17+ , p=x7 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Седьмая итерация
Шаг 2
.
;
;
Шаг 3
. соответствует x10
.
Шаг 4 . x10 получает постоянную пометку l(x10 )=18+ , p=x10 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Восьмая итерация
Шаг 2
. ;
Шаг 3
. соответствует x5
.
Шаг 4 . x5 получает постоянную пометку l(x5 )=19+ , p=x5 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Девятая итерация
Шаг 2
. ;
Шаг 3 . x9 получает постоянную пометку l(x9 )=21+ .
Найти кратчайшие пути от вершины 1 ко всем другим вершинам графа
Алгоритм работает так:
Шаг 1
. .
Первая итерация
Шаг 2
.
;
;
Шаг 3
. соответствует x7
.
Шаг 4 . x7 получает постоянную пометку l(x7 )=6+ , p=x7 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Вторая итерация
Шаг 2
.
;
Шаг 3
. соответствует x2
.
Шаг 4 . x2 получает постоянную пометку l(x2 )=7+ , p=x2 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Третья итерация
Шаг 2
.
;
Шаг 3
. соответствует x4
.
Шаг 4 . x4 получает постоянную пометку l(x4 )=8+ , p=x4 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Четвертая итерация
Шаг 2
.
;
;
;
Шаг 3
. соответствует x5
.
Шаг 4 . x5 получает постоянную пометку l(x5 )=16+ , p=x5 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Пятая итерация
Шаг 2
.
;
;
Шаг 3
. соответствует x8
.
Шаг 4 . x8 получает постоянную пометку l(x8 )=16+ , p=x8 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Шестая итерация
Шаг 2
. ;
Шаг 3
. соответствует x3
.
Шаг 4 . x3 получает постоянную пометку l(x3 )=18+ , p=x3 .
Шаг 5 . Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Седьмая итерация
Шаг 2
. ;
Шаг 3 . x6 получает постоянную пометку l(x6 )=20+ .
3. Алгоритмизация задачи
1) Вводим количество вершин неориентированного графа.
2) Если количество вершин больше 5, то переходим к пункту 3; иначе переходим к пункту 4.
3) Генератором случайных чисел произвольно задаются связи между вершинами в матрице смежностей, переходим к пункту 5.
4) Вводим связи между вершинами, исходя из следующего условия:
- если не существует пути длиной в одно ребро из одной вершины в другую, то ставим «100»,
- если существует путь между двумя вершинами, то ставим произвольное положительное ненулевое значение веса дуги.
Все введенные данные заносятся в матрицу смежностей.
5) Вводим номера вершин, путь между которыми нужно найти.
6) Задаем начальные значения длин путей равных 100 (в программе это обозначает бесконечность), а пометки всех вершин обнуляем.
7) Для начальной вершины в матрицу, хранящую пути (предшествующие вершины), заносим значение нуль, поскольку нет вершин предшествующих началу, значению пути присваиваем значение нуля, пометку на вершину устанавливаем в единицу.
8) Измененяем длины путей между вершинами «i» и начальной при условии, что рассматриваемая дуга не идет из вершины в саму себя и пометка этой вершины равна нулю, то тогда:
а) просматриваем длину пути в вершину «i» и сравниваем с длиной пути из начальной вершины «Nac»
б) получаем, что длина пути из вершины «s» меньше начального значения пути в вершину «i», то запоминаем в T[i] – ом элементе новую длину пути (меньшую) и H[i] – му присваиваем значение «s».
9) Присваиваем переменной ‘t» значение 100 (бесконечность), а переменной для хранения текущей вершины «k» присваиваем значение нуль.
10) Производим попытку уменьшить длину пути. Если вершина не помечена (ее пометка равна нулю), то если длина пути меньше значения «t» то значению «t» присваиваем текущее значение пути, а переменной для хранения текущей вершины «k» даем значение этой переменной.
11) Если переменная для хранения текущей вершины имеет значение нуля, то пути нет, переходим к пункту 14, иначе переходим к пункту 12.
12) Если переменная для хранения текущей вершины имеет значение конечной вершины, то путь найден, он кратчайший, переходим к пункту 14, иначе переходим к пункту 13.
13) Пометку на вершину, которую хранит переменная «k», изменяем на единицу и переходим к пункту 8.
14) Выводим на экран сообщение о длине пути между вершинами, если такой путь существует (т.е. путь имеет неотрицательную длину).
4 Экранная форма интерфейса и инструкция пользователя
|
Пункты меню:
1. Алгоритм реализации поставленной задачи.
2. Изображение исходного графа.
3. Выход из программы.
Для выбора пункта необходимо нажать на соответствующую клавишу:
- если это пункт 1, то нажмите «A» или «a»;
- если это пункт 2, то нажмите «D» или «d»;
- если это пункт 3, то нажмите «E» или «e».
Заключение
В соответствии с поставленной задачей в курсовой работе было выполнено следующее:
1) Изучен конкретный раздел дискретной математики.
2) Решены 5 задач по изученной теме с методическим описанием.
3) Разработан и реализован в виде программы алгоритм по изученной теме. Разработан программный интерфейс.
Литература
1. Новиков Ф.А. Дискретная математика для программистов – СПб.: Питер, 2002 год
1. Немнюгин С.А. TurboPascal: практикум – СПб.: Питер, 2002 год