Для графа, представленного на рис. 1.1, а, будут получены следующие векторы:
D 1 0 |
|
|
|
|
т; |
Ind 1 ; |
|
|
|
|
|
D 2 0 |
3 |
3 |
|
|
|
12 т; |
Ind 1 |
2 ; |
|
|
|
D 3 0 |
3 |
3 |
8 |
12 |
|
12 т; |
Ind 1 |
2 |
3 ; |
|
|
D 4 0 |
3 |
3 |
8 |
7 |
12 т; |
Ind 1 |
2 |
3 |
5 ; |
|
|
D 5 0 |
3 |
3 |
8 |
7 |
9 т; |
Ind 1 |
2 |
3 |
5 |
4 ; |
|
D 6 0 |
3 |
3 |
8 |
7 |
9 т; |
Ind 1 |
2 |
3 |
5 |
4 6 . |
|
Для графа, представленного на рис. 1.1, б, последовательность векторов имеет вид
D 1 0 |
|
|
|
|
т; |
Ind 1 ; |
|
|
|
|
|
D 2 0 |
3 |
|
8 |
|
|
т; |
Ind 1 |
2 ; |
|
|
|
D 3 0 |
3 |
5 |
8 |
11 |
|
т; |
Ind 1 |
2 |
3 ; |
|
|
D 4 0 |
3 |
5 |
7 |
11 |
|
т; |
Ind 1 |
2 |
3 |
5 ; |
|
D 5 0 |
3 |
5 |
7 |
8 |
13 т; |
Ind 1 |
2 |
3 |
5 |
4 ; |
|
D 6 0 |
3 |
5 |
7 |
8 |
10 т; |
Ind 1 |
2 |
3 |
5 |
4 6 . |
|
Деревья с минимальными путями, полученные в ходе выполнения алгоритма Дейкстры, представлены на рис. 2.1.
а |
б |
Рис. 2.1
11
По результатам выполнения алгоритма Дейкстры можно убедиться, что итоговые векторы D совпадают с последними столбцами матриц минимальных путей алгоритма Форда–Беллмана, поэтому можно восстановить последовательность вершин минимального пути аналогично (1.3). Следует отметить, что в векторе D не определено количество ребер, образующих минимальный путь, поэтому для восстановления вершин нужно использовать цикл с неопределенным числом итераций.
2.3. Алгоритм Флойда
Алгоритм Флойда, в отличие от рассмотренных ранее, определяет минимальные пути между всеми парами вершин в графе. Фактически алгоритм Флойда осуществляет последовательный перебор всех вершин, проверяя, проходит ли через вершину путь, более короткий, чем прочие пути.
Аналогичная задача может быть решена многократным применением алгоритма Форда–Беллмана или Дейкстры (последовательно задавая вершины графа как стартовые для поиска), однако реализация подобной процедуры потребовала бы значительных вычислительных затрат.
Реализация алгоритма Флойда сводится к формированию матрицы всех минимальных путей. Для неориентированного графа матрица будет симметричной, что позволяет сократить вычислительные затраты, заполняя только значения из верхнего (нижнего) треугольника матрицы.
Имея матрицу всех минимальных путей M, несложно восстановить порядок следования вершин любого пути. Исходной для алгоритма Флойда, как и раньше, является матрица весов (длин) L.
Рассмотрим алгоритм для общего случая (ориентированного графа с неотрицательными весами). Требуется выполнить следующие действия:
1. Проинициализировать матрицу M:
M 1 L .
2. Пересчитать элементы матрицы для следующих итераций по выражениям |
|||
m k |
min m k 1 , m k 1 m k 1 ; |
||
ij |
ij |
ik |
kj |
i 1, , n , j 1, , n , k 2, , n ,
где n – количество вершин графа (порядок матриц L, M).
3. Для двух заданных вершин восстановить последовательность прохождения вершин, соответствующую минимальному пути, по соотношениям, аналогичным (1.3).
12
Матрицы минимальных путей, полученные с помощью алгоритма Флойда для графов, приведенных на рис. 1.1, имеют вид
|
0 |
3 |
3 |
8 |
7 |
9 |
|
|
0 |
3 |
5 |
7 |
8 |
10 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
0 |
9 |
5 |
9 |
9 |
|
|
|
3 |
0 |
2 |
4 |
5 |
7 |
|
|
|
2 |
5 |
0 |
10 4 |
6 |
|
|
|
5 |
2 |
0 |
2 |
3 |
5 |
|
|
M1 |
|
|
|
|
|
|
|
; |
M 2 |
|
|
|
|
|
|
|
. |
|
12 15 15 0 |
19 |
4 |
|
|
|
7 |
4 |
2 |
0 |
1 |
3 |
|
||||
|
10 13 13 7 |
0 |
2 |
|
|
|
8 |
5 |
3 |
1 |
0 |
2 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
11 11 16 15 |
0 |
|
|
10 |
7 |
5 |
3 |
2 |
0 |
|
||||
У неориентированного графа матрица M 2 симметричная. Легко убедиться, что первая строка матриц по значениям идентична вектору D алгоритма Дейкстры или последним столбцом матрицы алгоритма Форда–Беллмана. Значит, по выражениям, аналогичным (1.3), можно восстановить порядок следования вершин, соответствующих минимальной длине пути. Более того, можно восстановить подобную последовательность для любых двух пар вершин, объединив их в матрицу, или таблицу, путей:
|
0 |
|
2 |
3 |
2 4 |
|
|
3 5 |
3 5 6 |
|
|||
|
1 |
|
|
1 3 |
4 |
|
|
5 |
4 6 |
|
|
||
|
1 |
1 2 |
|
1 2 4 |
|
|
5 |
5 6 |
|
|
|||
|
0 |
|
|
|
|
||||||||
W1 |
6 1 |
6 1 2 |
6 1 3 |
0 |
6 1 3 5 |
6 |
|
|
; |
||||
|
|
|
|
||||||||||
|
|
6 1 2 |
6 1 3 |
4 |
|
|
|
6 |
|
|
|||
6 1 |
|
|
0 |
|
|
|
|||||||
|
1 |
1 2 |
1 3 |
1 2 4 |
|
1 3 5 |
0 |
|
|
|
|||
|
|
|
|
|
|||||||||
|
0 |
2 |
2 3 |
2 3 4 |
2 3 4 5 |
2 3 4 5 6 |
|
|
|||||
|
|
0 |
3 |
3 4 |
3 4 5 |
|
3 4 5 6 |
|
|
|
|||
|
|
|
|
|
4 |
4 5 |
|
|
4 5 6 |
|
|
|
|
|
|
|
0 |
|
|
|
|
|
|||||
W2 |
|
|
|
|
0 |
5 |
|
|
5 6 |
. |
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
6 |
|
|
|
||
|
|
|
|
|
0 |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
|
|
|
|
|
Элементами матриц wij являются индексы вершин, через которые нужно
пройти от вершины i до вершины j (индекс i-й вершины можно не указывать, так как он задан номером строки матрицы W). Для неориентированного графа достаточно заполнить только верхнюю треугольную область, так как матрица минимальных путей симметрична, пути взаимно обратны. Для ориентированных графов матрицы маршрутов нужно определять полностью.
13
Достоинством алгоритма Флойда является его простота, недостатком – время выполнения.
Алгоритм поиска минимального пути для поставленной задачи выбирает разработчик. Допускается использовать другие алгоритмы или модификации рассмотренных ранее, однако необходимо соблюдать свойство массовости – алгоритм должен решать задачу для разных наборов исходных данных.
3. РАЗРАБОТКА БЛОК-СХЕМЫ АЛГОРИТМА
При проектировании алгоритмов используют специальные графические элементы, называемые графическими блоками. Результатом алгоритмизации решения задачи становится блок-схема алгоритма, состоящая из некоторой последовательности таких графических блоков.
Блок-схема – это последовательность блоков, предписывающих выполнение определенных операций, а также связей между этими блоками. Внутри блоков указывается информация об операциях, подлежащих выполнению. Конфигурация и размеры блоков, а также порядок графического оформления блок-схем регламентированы нормативными документами ГОСТ 19002–80 и ГОСТ 19003–80 «Схемы алгоритмов и программ». Наиболее часто используемые блоки, элементы связей между ними и краткое пояснение к реализации блоков представлены в [3].
При соединении блоков следует использовать только горизонтальные и вертикальные линии потоков. Горизонтальные линии, имеющие направление справа налево, и вертикальные потоки, направленные снизу вверх, обязательно должны быть помечены стрелками. Прочие потоки допускается оставлять непомеченными. Линии потоков должны быть параллельны линиям внешней рамки или границам листа.
При проектировании алгоритмов применяются следующие общие правила:
–в начале алгоритма должны находиться блоки ввода значений исходных данных;
–после ввода значений исходных данных могут следовать блоки обработки данных либо вызова подпрограмм, если алгоритм предусматривает обработку данных в модулях;
–в конце алгоритма должны располагаться блоки вывода значений выходных данных;
14
– в алгоритме должны присутствовать только по одному блоку начала и окончания [4].
Примечание. При оформлении информации о выполняемых операциях следует избегать конструкций, операторов и функций языка программирования.
4. ОСНОВНЫЕ КОНСТРУКЦИИ ЯЗЫКА MATLAB
4.1. Условия и циклы
Условные операторы необходимы для организации принятия решения в ходе выполнения программы.
Условный оператор if в общем случае проверяет несколько условий и записывается следующим образом:
if условие1 операторы1
elseif условие2
операторы2 elseif условие3
операторы3
….. else
операторы4 end
Операторы после else выполняются в случае, если все вышеперечисленные условия – ложные. Альтернативные ветви не являются обязательными частями оператора.
Оператор множественного выбора switch выбирает одну альтернативу из нескольких по равенству переменной выбора одному из выборки значений:
switch (переменная_выбора) case значение1,
операторы1
case { значение2, значение3, значение4,...} операторы2
...
otherwise,
операторы
end
15