Содержание

Слайд 2

Определения Связный граф – это граф, в котором существует цепь между

Определения

Связный граф – это граф, в котором существует цепь между каждой

парой вершин.
k-cвязный граф – это граф, который можно разбить на k связных частей.
Полный граф – это граф, в котором проведены все возможные ребра (n вершин → n(n-1)/2 ребер).
Слайд 3

Описание графа Матрица смежности – это матрица, элемент M[i][j] которой равен

Описание графа

Матрица смежности – это матрица, элемент M[i][j] которой равен 1,

если существует ребро из вершины i в вершину j, и равен 0, если такого ребра нет.

Список смежности

Слайд 4

Весовая матрица Весовая матрица – это матрица, элемент W[i,j] которой равен

Весовая матрица

Весовая матрица – это матрица, элемент W[i,j] которой равен весу

ребра из вершины i в вершину j (если оно есть), или равен ∞, если такого ребра нет.
Слайд 5

Задача Прима-Краскала Задача: соединить N городов телефонной сетью так, чтобы длина

Задача Прима-Краскала

Задача: соединить N городов телефонной сетью так, чтобы длина телефонных

линий была минимальная.

Та же задача: дан связный граф с N вершинами, веса ребер заданы весовой матрицей W. Нужно найти набор ребер, соединяющий все вершины графа (остовное дерево) и имеющий наименьший вес.

Слайд 6

Жадный алгоритм Жадный алгоритм – это многошаговый алгоритм, в котором на

Жадный алгоритм

Жадный алгоритм – это многошаговый алгоритм, в котором на каждом

шаге принимается решение, лучшее в данный момент.

Шаг в задаче Прима-Краскала – это выбор еще невыбранного ребра и добавление его к решению.

Слайд 7

Реализация алгоритма Прима-Краскала Проблема: как проверить, что 1) ребро не выбрано,

Реализация алгоритма Прима-Краскала

Проблема: как проверить, что 1) ребро не выбрано, и

2) ребро не образует цикла с выбранными ребрами.
Решение: присвоить каждой вершине свой цвет и перекрашивать вершины при добавлении ребра.

3

2

4

5

Алгоритм:
покрасить все вершины в разные цвета;
сделать N-1 раз в цикле:
выбрать ребро (i,j) минимальной длины из всех ребер, соединяющих вершины разного цвета;
перекрасить все вершины, имеющие цвет j, в цвет i.
вывести найденные ребра.

4

Слайд 8

Реализация алгоритма Прима-Краскала Структура «ребро»: type rebro = record i, j:

Реализация алгоритма Прима-Краскала

Структура «ребро»:

type rebro = record
i, j: integer; {

номера вершин }
end;

const N = 5;
var W: array[1..N,1..N] of integer;
Color: array[1..N] of integer;
i, j, k, min, col_i, col_j: integer;
Reb: array[1..N-1] of rebro;
begin
... { здесь надо ввести матрицу W }
for i:=1 to N do { раскрасить в разные цвета }
Color[i] := i;
... { основной алгоритм – заполнение массива Reb }
... { вывести найденные ребра (массив Reb)}
end.

Основная программа:

весовая матрица

цвета вершин

Слайд 9

Реализация алгоритма Прима-Краскала for k:=1 to N-1 do begin min :=

Реализация алгоритма Прима-Краскала

for k:=1 to N-1 do begin
min := MaxInt;

for i:=1 to N do
for j:=i+1 to N do
if (Color[i] <> Color[j]) and
(W[i,j] < min) then begin
min := W[i,j];
Reb[k].i := i;
Reb[k].j := j;
col_i := Color[i];
col_j := Color[j];
end;
for i:=1 to N do
if Color[i] = col_j then
Color[i] := col_i;
end;

Основной алгоритм:

нужно выбрать всего N-1 ребер

цикл по всем парам вершин

учитываем только пары с разным цветом вершин

запоминаем ребро и цвета вершин

перекрашиваем вершины цвета col_j

Слайд 10

Сложность алгоритма Основной цикл: O(N3) for k:=1 to N-1 do begin

Сложность алгоритма

Основной цикл:

O(N3)

for k:=1 to N-1 do begin
...
for

i:=1 to N do
for j:=i+1 to N do
...
end;

три вложенных цикла, в каждом число шагов <=N

растет не быстрее, чем N3

Требуемая память:

var W: array[1..N,1..N] of integer;
Color: array[1..N] of integer;
Reb: array[1..N-1] of rebro;

O(N2)

Количество операций:

Слайд 11

Кратчайшие пути (алгоритм Дейкстры) Задача: задана сеть дорог между городами, часть

Кратчайшие пути (алгоритм Дейкстры)

Задача: задана сеть дорог между городами, часть которых

могут иметь одностороннее движение. Найти кратчайшие расстояния от заданного города до всех остальных городов.

Та же задача: дан связный граф с N вершинами, веса ребер заданы матрицей W. Найти кратчайшие расстояния от заданной вершины до всех остальных.

присвоить всем вершинам метку ∞;
среди нерассмотренных вершин найти вершину j с наименьшей меткой;
для каждой необработанной вершины i: если путь к вершине i через вершину j меньше существующей метки, заменить метку на новое расстояние;
если остались необработанны вершины, перейти к шагу 2;
метка = минимальное расстояние.

Алгоритм Дейкстры (E.W. Dijkstra, 1959)

Слайд 12

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

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

Слайд 13

Реализация алгоритма Дейкстры Массивы: массив a, такой что a[i]=1, если вершина

Реализация алгоритма Дейкстры

Массивы:
массив a, такой что a[i]=1, если вершина уже рассмотрена,

и a[i]=0, если нет.
массив b, такой что b[i] – длина текущего кратчайшего пути из заданной вершины x в вершину i;
массив c, такой что c[i] – номер вершины, из которой нужно идти в вершину i в текущем кратчайшем пути.
Инициализация:
заполнить массив a нулями (вершины не обработаны);
записать в b[i] значение W[x][i];
заполнить массив c значением x;
записать a[x]=1.
Слайд 14

Реализация алгоритма Дейкстры Основной цикл: если все вершины рассмотрены, то стоп.

Реализация алгоритма Дейкстры

Основной цикл:
если все вершины рассмотрены, то стоп.
среди всех нерассмотренных

вершин (a[i]=0) найти вершину j, для которой b[i] – минимальное;
записать a[j]:=1;
для всех вершин k: если путь в вершину k через вершину j короче, чем найденный ранее кратчайший путь, запомнить его: записать b[k]:=b[j]+W[j,k] и c[k]=j.

Шаг 1:

Слайд 15

Реализация алгоритма Дейкстры Шаг 2: Шаг 3:

Реализация алгоритма Дейкстры

Шаг 2:

Шаг 3:

Слайд 16

Как вывести маршрут? Результат работа алгоритма Дейкстры: длины путей Маршрут из

Как вывести маршрут?

Результат работа алгоритма Дейкстры:

длины путей

Маршрут из вершины 0 в

вершину 4:

4

5

2

0

Сложность алгоритма Дейкстры:

O(N2)

два вложенных цикла по N шагов

Вывод маршрута в вершину i (использование массива c):
установить z:=i;
пока c[i]<>x присвоить z:=c[z] и вывести z.

Слайд 17

Алгоритм Флойда-Уоршелла Задача: задана сеть дорог между городами, часть которых могут

Алгоритм Флойда-Уоршелла

Задача: задана сеть дорог между городами, часть которых могут иметь

одностороннее движение. Найти все кратчайшие расстояния, от каждого города до всех остальных городов.

for k: =1 to N
for i: = 1 to N
for j: = 1 to N
if W[i,j] > W[i,k] + W[k,j] then
W[i,j] := W[i,k] + W[k,j];

Если из вершины i в вершину j короче ехать через вершину k, мы едем через вершину k!

Слайд 18

Алгоритм Флойда-Уоршелла Версия с запоминанием маршрута: for i:= 1 to N

Алгоритм Флойда-Уоршелла

Версия с запоминанием маршрута:

for i:= 1 to N
for j

:= 1 to N
c[i,j] := i;
...
for k: =1 to N
for i: = 1 to N
for j: = 1 to N
if W[i,j] > W[i,k] + W[k,j] then begin
W[i,j] := W[i,k] + W[k,j];
c[i,j] := c[k,j];
end;

i–ая строка строится так же, как массив c в алгоритме Дейкстры

в конце цикла c[i,j] – предпоследняя вершина в кратчайшем маршруте из вершины i в вершину j

c[i,j] := c[k,j];

O(N3)

Слайд 19

Задача коммивояжера Задача коммивояжера. Коммивояжер (бродячий торговец) должен выйти из первого

Задача коммивояжера

Задача коммивояжера. Коммивояжер (бродячий торговец) должен выйти из первого города

и, посетив по разу в неизвестном порядке города 2,3,...N, вернуться обратно в первый город. В каком порядке надо обходить города, чтобы замкнутый путь (тур) коммивояжера был кратчайшим?

Точные методы:
простой перебор;
метод ветвей и границ;
метод Литтла;

Приближенные методы:
метод случайных перестановок (Matlab);
генетические алгоритмы;
метод муравьиных колоний;

большое время счета для больших N

O(N!)

не гарантируется оптимальное решение