Кратчайшие пути в ориентированных графах
Министерство образования и науки Российской Федерации
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«САРАТОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИМЕНИ Н.Г.ЧЕРНЫШЕВСКОГО»
Кафедра теоретических основ компьютерной безопасности и криптографии
Кратчайшие пути в ориентированных графах
КУРСОВАЯ РАБОТА
студентки 2 курса 231 группы
специальности 090301 «Компьютерная безопасность»
факультета компьютерных наук и информационных технологий
Чабановой Дарьи Васильевны
Научный руководитель
доцент, к.ф-м.н
Зав. кафедрой
профессор,
к.ф.-м.н. _____________ В.
подпись, дата
Саратов 2013
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
В настоящее время дискретная математика и смежные с ней разделы привлекают большое внимание специалистов различных областей науки и техники, являясь эффективным аппаратом формализации современных инженерных задач, связанных с дискретными объектами. Особое значение с практической точки зрения имеет теория графов, использующаяся при проектировании интегральных схем и схем управления, исследовании автоматов и логических цепей, при системном анализе, автоматизированном управлении производством, при разработке вычислительных и информационных сетей, в схемотехническом и конструкторско-топологическом проектировании.
Целью данной работы было изучение алгоритмов для поиска кратчайших путей в ориентированном графе, написание программы реализации алгоритма Дейкстры.
1 Необходимые определения
Под ориентированным графом (или орграфом) понимается пара , где – конечное непустое множество (вершины графа), а – отношение на множестве ( пара называется дугой орграфа с началом и концом ). Дуги, у которых начало и конец совпадают, называются петлями. Отношение называется отношением смежности. Соответствующую отношению смежности двоичную булеву матрицу называют матрицей смежности орграфа. [1]
Графы с небольшим количеством вершин удобно представлять в виде рисунков: вершины изображаются точками (или кружками, квадратами и т.п), а дуги изображаются стрелками, соединяющими – от начальной к конечной – соответствующие вершины. [1]
Графы используются в качестве функциональных моделей дискретных систем, при этом вершины соответствуют элементам системы, а дуги – связям между элементами. [1]
2 Алгоритмы нахождения
кратчайших путей в ориентированных
графах
2.1 Алгоритм Форда–Беллмана
Алгоритм Форда–Беллмана был впервые разработан в 1969 году. Этот алгоритм не очень быстр, но работает и на графах с отрицательными ребрами. Решим задачу по нахождению кратчайших путей в графе, в котором заведомо нет отрицательных циклов. [3]
Для нахождения кратчайших путей от одной вершины до всех остальных, построим матрицу , элементы которой будут обозначать следующее: – это длина кратчайшего пути из в , содержащего не более рёбер.
Установим что, равно 0 при , или в противном случае.
Теперь рассмотрим все пути из в , содержащие ровно рёбер. Каждый такой путь есть путь из ребра, к которому добавлено последнее ребро. Если про пути длины все данные уже подсчитаны, то определить -й столбец матрицы не составляет труда.[3]
Так выглядит алгоритм поиска длин кратчайших путей в графе без отрицательных циклов:
for
do
for to
do for
if
then [3]
Пример – Алгоритм Форда – Беллмана.
Дан взвешенный ориентированны
Рисунок 1 – Взвешенный ориентированный граф.
Составим матрицу смежности как показано в таблице 1.
Таблица 1 – Матрица смежности.
0 |
7 |
9 |
∞ |
∞ |
14 |
∞ |
0 |
10 |
15 |
∞ |
∞ |
∞ |
∞ |
0 |
11 |
∞ |
2 |
∞ |
∞ |
∞ |
0 |
6 |
∞ |
∞ |
∞ |
∞ |
∞ |
0 |
∞ |
∞ |
∞ |
∞ |
∞ |
9 |
0 |
Присвоим всем элементам массива значение . Перебираем все вершины согласно алгоритму.
; ;
; ;
; ;
; ;
; ;
; ;
В итоге получаем на выходе массив с следующими элементами:
; ; ; ; ; .
2.2 Алгоритм Флойда – Уоршелла
Этот алгоритм был разработан в 1962 году Робертом Флойдом и Стивеном Уоршеллом. Данный алгоритм находит кратчайшие расстояния между всеми парами вершин за . Описание алгоритма: вводим переменную равная кратчайшему пути из вершины до вершины , фиксируем вершину , затем перебираем всевозможные пары вершин и если , то делаем .[2]
Пример – Алгоритм Флойда – Уоршелла.
Дан взвешенный ориентированны
Рисунок 2 – Ориентированный граф.
Шаг 1. Составим матрицу смежности, фиксируем первую вершину и начнем работу алгоритма (см. таблица 2).
Таблица 2 – Шаг 1.
0 |
7 |
9 |
∞ |
∞ |
14 |
∞ |
0 |
10 |
15 |
∞ |
∞ |
∞ |
∞ |
0 |
11 |
∞ |
2 |
∞ |
∞ |
∞ |
0 |
6 |
∞ |
∞ |
∞ |
∞ |
∞ |
0 |
∞ |
∞ |
∞ |
∞ |
∞ |
9 |
0 |
Шаг 2. Фиксируем вторую вершину и продолжаем работу алгоритма (см. таблицу 3).
Таблица 3 – Шаг 2.
0 |
7 |
9 |
22 |
∞ |
14 |
∞ |
0 |
10 |
15 |
∞ |
∞ |
∞ |
∞ |
0 |
11 |
∞ |
2 |
∞ |
∞ |
∞ |
0 |
6 |
∞ |
∞ |
∞ |
∞ |
∞ |
0 |
∞ |
∞ |
∞ |
∞ |
∞ |
9 |
0 |
Шаг 3. Фиксируем третью вершину и продолжаем работу алгоритма (см. таблицу 4).
Таблица 4 – Шаг 3.
0 |
7 |
9 |
20 |
∞ |
11 |
∞ |
0 |
10 |
15 |
∞ |
12 |
∞ |
∞ |
0 |
11 |
∞ |
2 |
∞ |
∞ |
∞ |
0 |
6 |
∞ |
∞ |
∞ |
∞ |
∞ |
0 |
∞ |
∞ |
∞ |
∞ |
∞ |
9 |
0 |
Шаг 4. Фиксируем четвертую вершину и продолжаем работу алгоритма (см. таблицу 5).
Таблица 5 – Шаг 4.
0 |
7 |
9 |
20 |
∞ |
11 |
∞ |
0 |
10 |
15 |
21 |
12 |
∞ |
∞ |
0 |
11 |
17 |
2 |
∞ |
∞ |
∞ |
0 |
6 |
∞ |
∞ |
∞ |
∞ |
∞ |
0 |
∞ |
∞ |
∞ |
∞ |
∞ |
9 |
0 |
Шаг 5. Фиксируем пятую вершину и продолжаем работу алгоритма (см. таблицу 6).
Таблица 6 – Шаг 5.
0 |
7 |
9 |
20 |
∞ |
11 |
∞ |
0 |
10 |
15 |
21 |
12 |
∞ |
∞ |
0 |
11 |
17 |
2 |
∞ |
∞ |
∞ |
0 |
6 |
∞ |
∞ |
∞ |
∞ |
∞ |
0 |
∞ |
∞ |
∞ |
∞ |
∞ |
9 |
0 |
Шаг 6. Фиксируем шестую вершину и продолжаем работу алгоритма (см. таблицу 7).
Таблица 7 –Шаг 6.
0 |
7 |
9 |
20 |
23 |
14 |
∞ |
0 |
10 |
15 |
21 |
12 |
∞ |
∞ |
0 |
11 |
17 |
2 |
∞ |
∞ |
∞ |
0 |
6 |
∞ |
∞ |
∞ |
∞ |
∞ |
0 |
∞ |
∞ |
∞ |
∞ |
∞ |
9 |
0 |
2.3 Алгоритм Дейкстры
Алгоритм Дейкстры позволяет найти кратчайшие пути от данной вершины до всех остальных вершин в графе. Алгоритм состоит из следующих шагов:
- положить для всех вершин (кроме исходной) расстояние равное бесконечности, для исходной присвоить нулю;
- выбрать непомеченную вершину , с минимальным расстоянием. Если такой вершины нет, то завершить работу;
- пометить вершину ;
- для всех непомеченных вершин, смежных с вершиной , попытаться уменьшить расстояние;
- вернуться к шагу 2; [2]
Пример – Алгоритм Дейкстра.
Дан взвешенный ориентированный граф , без петель и дуг отрицательного веса в соответствии с рисунком 3. Найти кратчайшие пути от некоторой вершины графа до всех остальных вершин этого графа. [4]
Рисунок 3 – Граф.
Каждой вершине из сопоставим метку – минимальное известное расстояние от этой вершины до . Алгоритм работает пошагово – на каждом шаге он «посещает» одну вершину и пытается уменьшать метки. Работа алгоритма завершается, когда все вершины посещены.
Шаг 1. Метка самой вершины полагается равной 0, метки остальных вершин – бесконечности. Это отражает то, что расстояния от до других вершин пока неизвестны. Все вершины графа помечаются как не посещённые.
Шаг 2. Если все вершины посещены, алгоритм завершается. В противном случае, из ещё не посещённых вершин выбирается вершина , имеющая минимальную метку. Вершины, в которые ведут рёбра из , назовем соседями этой вершины. Для каждого соседа вершины , кроме отмеченных как посещённые, рассмотрим новую длину пути, равную сумме значений текущей метки и длины ребра, соединяющего с этим соседом. Если полученное значение длины меньше значения метки соседа, заменим значение метки полученным значением длины. Рассмотрев всех соседей, пометим вершину как посещенную и повторим шаг алгоритма.
Рассмотрим выполнение алгоритма на примере графа, показанного на рисунке 4. Пусть требуется найти кратчайшие расстояния от 1-й вершины до всех остальных.
Рисунок 4 –Пример графа.
Кружками обозначены вершины, линиями – пути между ними (ребра графа). В кружках обозначены номера вершин, над ребрами обозначена их «цена» – длина пути. Рядом с каждой вершиной обозначена метка – длина кратчайшего пути в эту вершину из вершины 1(см. рисунок 5).
Рисунок 5 – Метки вершин.
Шаг 3. Минимальную метку имеет вершина 1. Её соседями являются вершины 2, 3 и 6 согласно рисунку 6.
Рисунок 6 – Соседи вершины 1.
Шаг 4. Первый по очереди сосед вершины 1 – вершина 2, потому что длина пути до неё минимальна согласно рисунку 7. Длина пути в неё через вершину 1 равна сумме кратчайшего расстояния до вершины 1, значению её метки, и длины ребра, идущего из 1-й в 2-ю, то есть 0 + 7 = 7. Это меньше текущей метки вершины 2, бесконечности, поэтому новая метка 2-й вершины равна 7.
Рисунок 7 – Вершина 2.
Аналогичную операцию проделываем с двумя другими соседями 1-й вершины – 3-й как показано на рисунке 7 и 6-й согласно рисунку 8.
Рисунок 8 – Действия с соседями.
Все соседи вершины 1 проверены. Текущее минимальное расстояние до вершины 1 считается окончательным и пересмотру не подлежит. Вычеркнем её из графа, чтобы отметить, что эта вершина посещена (см. рисунок 9).
Рисунок 9 – Вычеркивание вершины 1.
Шаг 5. Снова находим «ближайшую» из не посещенных вершин. Это вершина 2 с меткой 7 как указано на рисунке 10.
Рисунок 10 – Помечаем вершину 2.
Снова пытаемся уменьшить метки соседей выбранной вершины, пытаясь пройти в них через 2-ю вершину. Соседями вершины 2 являются вершины 1, 3 и 4.
Первый (по порядку) сосед вершины 2 – вершина 1. Но она уже посещена, поэтому с 1-й вершиной ничего не делаем.
Следующий сосед вершины 2 – вершина 3, так как имеет минимальную метку из вершин, отмеченных как не посещённые. Если идти в неё через 2, то длина такого пути будет равна 17 (7 + 10 = 17). Но текущая метка третьей вершины равна 9<17, поэтому метка не меняется рисунок 11.
Рисунок 11 – Изменение текущей метки.
Ещё один сосед вершины 2 – вершина 4 (см.
рисунок 12). Если идти в неё через 2-ю, то
длина такого пути будет равна сумме кратчайшего
расстояния до 2-й вершины и расстояния
между вершинами 2 и 4, то есть . Поскольку , устанавливаем метку вершины 4 равной
22.
Рисунок 12 – Метка вершины 4.
Все соседи вершины 2 просмотрены, замораживаем расстояние до неё и помечаем её как посещенную (см. рисунок 13).
Рисунок 13 – Посещенная вершина 2.
Повторяем алгоритм, выбрав вершину 3 рисунок 14. После её «обработки» получим такие результаты (см. рисунок 15):
Рисунок 14 – Вершина 3.
Дальнейшие шаги рисунок 15. Повторяем алгоритм для оставшихся вершин (см. рисунок 16).
Рисунок 15 – Посещенная вершина 3.
Рисунок 16 – Повторение алгоритма.
Рисунок 17 – Завершение алгоритма.
Завершение выполнения алгоритма (см. рисунок 17). Алгоритм заканчивает работу, когда нельзя больше обработать ни одной вершины (см.рисунок 17). В данном примере все вершины зачеркнуты, однако ошибочно полагать, что так будет в любом примере - некоторые вершины могут остаться не зачеркнутыми, если до них нельзя добраться. Результат работы алгоритма виден на последнем рисунке: кратчайший путь от вершины 1 до 2-й составляет 7, до 3-й – 9, до 4-й – 20, до 5-й – 20, до 6-й – 11.
Доказательство корректности алгоритма Дейкстры.
Пусть – длина кратчайшего пути из вершины
в вершину . Докажем по индукции, что в
момент посещения любой вершины , .
Первой посещается вершина . В этот момент .
Пускай мы выбрали для посещения вершину .
Докажем, что в этот момент . Для начала отметим, что для любой
вершины , всегда выполняется (алгоритм не может
найти путь короче, чем кратчайший из всех
существующих ). Пусть – кратчайший
путь из в , – первая не посещённая вершина
на , – предшествующая ей (следовательно,
посещённая). Поскольку путь кратчайший, его часть, ведущая из
через в , тоже кратчайшая, следовательно
. По предположению индукции, в момент
посещения вершины выполнялось , следовательно, вершина
y тогда получила метку не больше чем .
Следовательно, . С другой стороны, поскольку
сейчас мы выбрали вершину , её метка минимальна среди не посещённых,
то есть . Комбинируя это с
, имеем , что и требовалось доказать.
Поскольку алгоритм заканчивает работу, когда все вершины посещены, в этот момент для всех вершин.
3 Программная реализация алгоритма Дейкстры
В приложении А к курсовой работе представлена реализация алгоритма Дейкстра на языке программирования С++. В этом разделе приведена подробная инструкция к программе, которая находит кратчайшие пути в ориентированном графе от заданной вершины до всех остальных. При запуске программы в открытом окне требуется ввести количество вершин в графе (см.рисунок 18).
Рисунок 18 – Введите вершины.
Далее требуется ввести матрицу смежности графа (см. рисунок 19).
Рисунок 19 – Введите матрицу смежности.
Введите начальную вершину, из которой требуется найти кратчайший путь (см. рисунок 20).
Рисунок 20 – Введите начальную вершину графа.
Далее на экран выводится кратчайшие пути от заданной начальной вершины до всех остальных вершин (см. рисунок 21).
Рисунок 21 – Вывод результата.
В случае отсутствия решения или некорректно введенных данных, программа выдаст сообщение: «Маршрут недоступен» (см. рисунок 22).
Рисунок 22 – Ошибка.
ЗАКЛЮЧЕНИЕ
Обширное применение теория графов находит в современной вычислительной технике и кибернетике: в теоретическом программировании, при проектировании ЭВМ, баз данных, систем логического управления. В приложениях часто приходится рассматривать графы с ориентированными ребрами. Примерами таких графов являются сети автомобильных дорог с односторонним движением или схемы программ для ЭВМ.
Так в работе были рассмотрены алгоритмы для поиска кратчайших путей в ориентированном графе, реализована программа алгоритма Дейкстры для поиска кратчайших путей в ориентированном графе, от заданной вершины до всех остальных. Таким образом, поставленные задачи были полностью решены.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
- Богомолов А.М., Салий В.Н. Алгебраические основы теории дискретных систем. – М.: Наука. Физматлит, 1997. – 368 с. – ISBN 5-02-015033-9.
- Лекции по теории графов / Емеличев В.А., Мельников О.И., Сарванов В.И., Тышкевич Р.И. – М.: Наука. Гл. ред. физ.- мат. лит., 1990. – 384 с. – ISBN 5-02-013992-0.
- Томас Х. Кормен., Чарльз И. Лейзерсон., Алгоритмы: построение и анализ. Учебное пособие, 2-е изд., — М.: Вильямс, 2006. —1296 с. — ISBN 0-07-013151-1
- Алгоритм Дейкстра [Электронный
ресурс] // Википедия свободная энциклопедия
[Электронный ресурс] : полнотекстовая
ВСЭ с картинками. URL: http://ru.wikipedia.org/wiki/
Алгоритм_Дейкстры (дата обращения: 12.05.2013). Загл. с экрана. Яз.рус
Приложение А.
Листинг программы
#include <cmath>
#include<clocale>
#include <iostream>
using namespace std;
const int V=100;
//алгоритм Дейкстры
void Dijkstra(int GR[V][V], int st,int n)
{
int distance[V], count, index, i, u, m=st+1;
bool visited[V];
for (i=0; i<n; i++)
{
distance[i]=INT_MAX; visited[i]=false;
}
distance[st]=0;
for (count=0; count<n-1; count++)
{
int min=INT_MAX;
for (i=0; i<n; i++)
if (!visited[i] && distance[i]<=min)
{
min=distance[i]; index=i;
}
u=index;
visited[u]=true;
for (i=0; i<n; i++)
if (!visited[i] && GR[u][i] && distance[u]!=INT_MAX &&
distance[u]+GR[u][i]<distance[
distance[i]=distance[u]+GR[u][
}
cout<<"Стоимость пути из начальной вершины до остальных:\t\n";
for (i=0; i<n; i++) if (distance[i]!=INT_MAX)
cout<<m<<" > "<<i+1<<" = "<<distance[i]<<endl;
else cout<<m<<" > "<<i+1<<" = "<<"маршрут недоступен"<<endl;
}
//главная функция
void main()
{
setlocale(LC_ALL, "Rus");
int start; int GR[V][V]; int n; cin>>n;
for(int i=0; i<n;i++){
for(int j=0; j<n;j++){
cin>>GR[i][j];}}
cout<<"Начальная вершина >> "; cin>>start;
Dijkstra(GR, start-1,n);
system("pause>>void");}

- КР - Аудит системы найма ОАО ММК
- Краудсорсинг и управление знаниями в компании
- Крахмал, сахар, мед, кондитерские товары
- Крахмал, сахар, мед, кондитерские товары
- Крах советской государственной системы СССР в годы перестройки 1985-1991 годы
- Крашение дисперсными красителями
- Креализованные рекламные тексты
- Краткосрочные активы
- Краткосрочные активы: товарно-материальные запасы
- Краткосрочные кредиты: порядок организации и учета
- Краткосрочные формы банковского кредитования и особенности их использования в России
- Краткосрочный банковский кредит
- Краткосрочный прогноз изменения курса доллара по отношению к рублю
- Краткосрочный прогноз мировых цен на нефть