ФЭА / АИТ / Задача №1 по дисциплине «Моделирование систем» на тему: «Алгоритм Флойда-Уоршелля»
(автор - student, добавлено - 23-06-2013, 17:41)
СКАЧАТЬ:Министерство образования и науки РТAльметьевский государственный нефтяной институт
Кафедра АИТ
Задача №1 по дисциплине «Моделирование систем» на тему: «Алгоритм Флойда-Уоршелля»
Построение математической модели
Цель алгоритма Флойда - определение кратчайшего пути между вершинами взвешенного графа. Этот алгоритм более общий по сравнению с алгоритмом Дейкстры, так как он находит кратчайшие пути между любыми двумя узлами сети. В этом алгоритме сеть представлена в виде квадратной матрицы с n строками и n столбцами. Элемент (i, j) равен расстоянию dij от узла i к узлу j, которое имеет конечное значение, если существует дуга (i, j), и равен бесконечности в противном случае. Постановка задачи: пусть дан непустой взвешенный граф G=(V, E) с произвольными весами ребер (дуг). Требуется найти длины кратчайших путей между всеми парами вершин графа Применительно к прикладной задаче целью разработки приложения является – определение наиболее эффективного маршрута пересылки сообщений между любыми двумя районами. Причем алгоритм может решать подобные задачи для разных критериев, например, критерием может быть – поиск наиболее дешевого пути (каждой дуге ставится в соответствие денежный эквивалент, который необходимо затратить при использовании этой дуги); или поиск наиболее быстрого пути (в этом случае каждой дуге присваивается время, которое будет потрачено при ее использовании); можно таким же образом найти самый надежный путь (каждой дуге ставится в соответствие коэффициент риска передачи сообщения по этой дуге/пути). Подобных задач может возникнуть очень много, а цель этих задач одинакова – нахождение кратчайшего пути из одного состояния в другое (относительно графа – нахождение минимального расстояния между 2-мя вершинами).
Описание математического метода
Основная идея метода Флойда состоит в следующем: пусть есть три узла i, j и k и заданы расстояния между ними (рис. 1). Если выполняется неравенство dij + djk < dik, то целесообразно заменить путь i -> k путем i -> j -> k. Такая замена (условно называемая треугольным оператором) выполняется систематически в процессе выполнения алгоритма Флойда.
Схема 2. Треугольный оператор Алгоритм Флойда требует выполнения следующих действий. Шаг 0. Определяем начальную матрицу расстояния D0 и матрицу последовательности узлов S0. Диагональные элементы обеих матриц помечаются знаком "-", показывающим, что эти элементы в вычислениях не участвуют. Полагаем k :=1.
Схема 3.Первоначальная ситуация Основной шаг k. Задаем строку k и столбец k как ведущую строку и ведущий столбец. Рассматриваем возможность применения треугольного оператора ко всем элементам dij матрицы Dk-1. Если выполняется неравенство dik + dkj < dij, (i <> k, j <> k, i <> j), тогда выполняем следующие действия:
Поясним действия, выполняемые на k-м шаге алгоритма, представив матрицу Dk-1 так, как она показана на рисунке 4. На этом рисунке строка k и столбец k являются ведущими. Строка i - любая строка с номером от 1 до k - 1, а строка p - произвольная строка с номером от k + 1 до n. Аналогично столбец j представляет любой столбец с номером от 1 до k - 1, столбец q - произвольный столбец с номером от k + 1 до n. Треугольный оператор выполняется следующим образом. Если сумма элементов ведущих строки и столбца (показанных в квадратах) меньше элементов, находящихся в пересечении столбца и строки (показанных в кружках), соответствующих рассматриваемым ведущим элементам, то расстояние (элемент в кружке) заменяется на сумму расстояний, представленных ведущими элементами:
Схема 4. Иллюстрация алгоритма Флойда После реализации n шагов алгоритма определение по матрицам Dn и Sn кратчайшего пути между узлами i и j выполняется по следующим правилам. Расстояние между узлами i и j равно элементу dij в матрице Dn. Промежуточные узлы пути от узла i к узлу j определяем по матрице Sn. Пусть sij = k, тогда имеем путь i -> k -> j. Если далее sik = k и skj = j, тогда считаем, что весь путь определен, так как найдены все промежуточные узлы. В противном случае повторяем описанную процедуру для путей от узла i к узлу k и от узла k к узлу j.
Схема 5. Треугольный оператор Расчет математической модели
Составим для поставленной задачи изображенной на рисунке 1 матрицу смежности, получим матрицу D0 схема 6.
Схема 6. Первоначальная матрица Применим к ней алгоритм Флойда, получим следующую матрицу кратчайших путей и матрицу маршрутов схема 7:
Схема 7. Результат работы алгоритма Таким образом, например, кратчайшее расстояние из первой вершины во вторую равно 4. Из шестой в седьмую равно 9, причем проходим через 5-ю вершину, из пятой в первую расстояние равно 10, и проходим через 7-ю вершину, схема 8.
Схема 8. Результат работы алгоритма показан на графе
Путь из 6 в 9 равен 2+7=9.Путь из 1 в 2 равен 4 Программа поиска кратчайшего пути между вершинами и его длины при помощи алгоритма Флойда реализованный в среде turbopascal:
Program Algoritm_Floid; Uses Crt,Graph,Graphs; Const M=19; {Предельное число вершин графа} R=200; {Радиус окружности на которой лежат вершины (центры окружностей)} Type Dmas = Array[1..M,1..M] Of Integer; Var N, {Число вершин графа} I,J, Nac, {Номер начальной вершины} Kon: Integer; {Номер конечной вершины} T, {Матрица, хранящая длины путей} H, {Матрица, хранящая пути} C: Dmas; {Матрица, хранящая длины дуг} Procedure Dlina; {Процедура задания матрицы длин дуг} Begin GotoXY(7,7); Write('Введите число вершин графа: '); Readln(N); {Задание значения числа вершин} If N>M Then Halt; {Если вершин больше чем константа M, то выход из программы} Clrscr; {Очистка экрана} If N>5 Then {Автоматическое задание значений длин дуг} For I:=1 To N Do For J:=1 To N Do If I=J Then C[I,J]:=0 Else C[I,J]:=Random(100)+1 {Генерация текущего значения} Else Begin For I:=1 To N Do Begin Writeln; For J:=1 To N Do If I<>J Then Begin Write('Введите вес дуги [',I,',',J,']:= '); Readln(C[I,J]); End Else If I=J Then C[I,J]:=0; End; End; {Вывод полученной матрицы дуг} Clrscr; Writeln('Матрица длин дуг'); Writeln; Write(' '); TextColor(Green); For I:=1 To N Do Write(' ',Chr(64+I),' '); Writeln; For I:=1 To N Do Begin TextColor(Green); Write(' ',Chr(64+I),' '); TextColor(White); For J:=1 To N Do Write(C[I,J]:3,' '); {Вывод текущего элемента матрицы} Writeln; End; Readln {Задержка экрана} End; Procedure Floid; {Процедура нахождения кратчайших путей и их длин} Var I,J,K: Integer; Begin For I:=1 To N Do For J:=1 To N Do Begin T[I,J]:=C[I,J]; {Начальная установка длин путей} If C[I,J]=100 Then H[I,J]:=0 {Нет дуги из вершины "I" в "J" вершину} Else H[I,J]:=J {Есть дуга из вершины "I" в "J" вершину} End; For I:=1 To N Do Begin For J:=1 To N Do For K:=1 To N Do If (I<>J) And (T[J,I]<>100) And (I<>K) And (T[I,K]<>100) And ((T[J,K]=100) Or (T[J,K]>T[J,I]+T[I,K])) Then Begin H[J,K]:=I; {Запоминаем новый путь} T[J,K]:=T[J,I]+T[I,K] {Запоминаем длину данного нового пути} End; For J:=1 To N Do If T[J,J]<0 Then Break {Нет решения: вершина входит в цикл отрицательной длины} End; {Вывод полученной матрицы путей} Clrscr; Writeln('Матрица путей'); Writeln; Write(' '); TextColor(Green); For I:=1 To N Do Write(' ',Chr(64+I),' '); Writeln; For I:=1 To N Do Begin TextColor(Green); Write(' ',Chr(64+I),' '); TextColor(White); For J:=1 To N Do Write(H[I,J]:3,' '); {Вывод текущего элемента матрицы} Writeln; End; Readln; {Вывод полученной матрицы длин путей} Clrscr; Writeln('Матрица длин путей'); Writeln; Write(' '); TextColor(Green); {Задание цвета текста} For I:=1 To N Do Write(' ',Chr(64+I),' '); Writeln; For I:=1 To N Do Begin TextColor(Green); {Задание цвета текста} Write(' ',Chr(64+I),' '); TextColor(White); For J:=1 To N Do Write(T[I,J]:3,' '); {Вывод текущего элемента матрицы} Writeln; End; Readln; Clrscr; GotoXY(10,10); Write('Введите номер начальной вершины пути: '); Readln(Nac); GotoXY(10,12); Write('Введите номер конечной вершины пути: '); Readln(Kon); Writeln; Write('Длина пути из вершины ',Chr(64+Nac),' в вершину ',Chr(64+Kon),' равна: ',T[Nac,Kon]); Readln End; Procedure Koordinata; {Процедура вывода найденных значений} End. Похожие статьи:
|
|