- •Передмова
- •Лабораторна робота № 1 Множини. Генерація елементів множини та виконання операцій над множинами
- •1. Теоретичні відомості.
- •2. Завдання для самостійної роботи.
- •Варіанти завдань
- •Контрольні питання
- •Лабораторна робота № 2 Мінімізація зображення множин
- •1. Теоретичні відомості.
- •2. Завдання до самостійної роботи.
- •Контрольні питання
- •Лабораторна робота № 3 Знаходження гамільтонового циклу графа
- •1. Теоретичні відомості.
- •2. Завдання до самостійної роботи.
- •Контрольні питання
- •Лабораторна робота № 4 Побудова мінімального остовного дерева
- •Теоретичні відомості.
- •«Жадібний» алгоритм побудови мінімального остовного дерева
- •2. Завдання до самостійної роботи.
- •Контрольні питання
- •Лабораторна робота № 5 Знаходження максимального потоку транспортної мережі
- •Теоретичні відомості.
- •2. Завдання до самостійної роботи.
- •Контрольні питання
- •Лабораторна робота № 6 Визначення найкоротшого шляху в графі
- •Теоретичні відомості.
- •2. Завдання до самостійної роботи.
- •Контрольні питання
- •Лабораторна робота №7 Використання графів в мережі планування.
- •1. Теоретичні відомості.
- •Завдання до самостійної роботи.
- •Контрольні питання
- •Література
2. Завдання до самостійної роботи.
-
Згенерувати матрицю вагових коефіціентів повного неорієнтованого графа (кількість вершин n=5).
-
Розробити та реалізувати у вигляді програми «жадібний» алгоритм побудови мінімального остовного дерева для заданого неорієнтованого повного графа.
Звіт
-
Постановка задачі.
-
Хід роботи.
-
Результати роботи.
-
Висновки.
Контрольні питання
-
Що розуміється під терміном остовне дерево для заданого графа?
-
Із скількох ребер складається остовне дерево? Обґрунтуйте свою відповідь.
-
На якому алгоритмі базується алгоритм побудови остовного дерева?
-
Чи завжди існує лише один варіант остовного дерева для заданого графа? Обґрунтуйте свою відповідь.
-
Що розуміється під остовним деревом мінімальної довжини?
-
Продемонструйте покрокове виконання «жадібного» алгоритму на власному прикладі.
Лабораторна робота № 5 Знаходження максимального потоку транспортної мережі
Мета роботи: ознайомитися з алгоритмом Форда-Фалкерсона знаходження максимального потоку в мережі.
-
Теоретичні відомості.
Розглянемо орієнтований зв'язний мультиграф G(V,E) без петель. Такий граф называється транспортною мережею, якщо для нього відрізняючою характеристикою є наявність:
- єдиної вершини, такої, що G-1(x0)=;
- єдиної вершини xn, такої, що G(xn)= ;
- відповідність кожній дузі g графа цілого невідємного числа с(g)0; дане число називається пропускною спроможністю дуги.
Вершина s=x0 називається входом мережі (або витоком), а вершина xn = t — виходом (або стоком).
Транспортні мережі вводяться з метою опису транспортування деякої субстанції (природа якої може бути різноманітна і залежить від виду і структури об'єктів, що переміщаються, наприклад, описується переміщення рідин або газу в трубопроводі, автотранспорту в мережі автомагістралей, передача інформації з інформативної мережі і т.д.) і розгляданні задач по оптимальній організації різного виду транспортувань.
Потоком транспортної мережі називається целочисльна функція f(g), що задовольняє властивостям:
1. с(g)0 , де gE;
2. Для множин G+(x) і G-(x) дуг, що відповідно входять у вершину x і виходять із неї, справедлива рівність
Дана властивість називається умовою зберігання потоку: у будь-якій вершині потоки не створюються і не зникають.
3. . Якщо с(q) пропускна спроможність деякої дуги, тобто максимальна кількість що пропускається по дузі q в одиницю часу субстанції, що транспортується, то розмір f(q) відповідає реальній кількості субстанції, що пропускається по дузі q в одиницю часу.
Дивергенцією функції f в вершині v називається число div(f, v), яке визначається таким чином:
div(f, v) = .
Число w(f)=div(f, s) називається величиною потоку f.
Функція, що описує потік у мережі, f(q) є основним предметом вивчення. Особлива увага приділяється при цьому задачі про найбільший потік - по заданій транспортній мережі з відповідними значеннями пропускних спроможностей дуг потрібно визначити максимальний потік. Перед розглядом зазначеної задачі введемо деякі визначення .
Нехай Р –(s,t)-розріз, РХ. Довільний розріз визначається розбиттям множини вершин V на дві підмножини S i T, так що , x0S, xnT, а в Р попадають всі дуги, що з’єднують S i T. Тоді P=P- P+ , де Р+ - дуги від S до T, Р- - дуги від Т до S. Сума потоків через дуги розрізу Р позначається F(P). Сума пропускних спроможностей дуг розрізу називається пропускною спроможністю розрізу і позначається С(Р):
F(P)=,
C(P)=.
Лема 1. w(f) = F(P+)-F(P-).
Лема 2. div(f, s)= — div (f, t)
Лема 3. w(f) F(P).
Лема 4.
Теорема (Форда і Фалкерсона). Максимальний потік в мережі дорівнює мінімальній пропускній спроможності розрізу, тобто існує потік f* , такий що
w(f*) =
Доказ цієї теореми приводить до ефективного алгоритму Форда і Фалкерсона визначення функції f(q), що максимізує потік f.
Дугу g будемо називати насиченою, якщо f(g)=c(g). Потік називається повним, якщо будь-який шлях, що веде з s до t містить хоча б одну насичену дугу.
Якщо вихідний потік буде неповним, то можна визначити такий шлях L, що з'єдну’ вершини s і t, i що не буде містити насичених дуг. Для дуг розглянутого шляху можна обчислити розміри . Збільшивши тепер до різних значень потоків f(g) шляху L найменше з чисел (e), одержимо, що шлях L буде містити, принаймні, одну насичену дугу, а потік стане повним. Якщо тепер аналогічним способом “обробити” інші шляхи, то в результаті утвориться повний потік f.
Тепер розглянемо алгоритм визначення максимального потоку. Нехай існує ненасичений ланцюг <s, t>, який позначимо R. Тоді можна знайти число :
=
В цьому випадку можна збільшити величину потоку на , змінивши потік для всіх дуг ненасиченого ланцюга
При цьому умови потоку виконуються:
0 f (e) c(e), div(v) = 0.
Наступний алгоритм визначає максимальний потік в мережі, яка задана матрицею пропускних спроможностей дуг. Цей алгоритм використовує ту ж саму ідею доказу теореми Форда і Фалкерсона, а саме, спочатку задаються початковим наближенням потоку. Далі визначають множину вершин S, які з’єднані ненасиченими ланцюгами з витоком s. Якщо виявиться, що tS, то це означає, що потік не максимальний і його можна збільшити на . Для визначення ненасичених ланцюгів і одночасного нарахування величини в алгоритмі використовується допоміжна структура даних:
P: array [1..p] of record
s: enum (+,-) {“знак”, тобто напрямок дуги}
n: 1..p {попередня вершина у ненасиченій дузі}
: real {величина можливого збільшення потоку}
end record
Алгоритм знаходження максимального потоку
Вхід:мережа G(V, E) з витоком s і стоком t, що задана матрицею попускних спроможностей C: array[1..p,1..p] of real/
Вихід: матриця максимального потоку F: array [1..p,1..p] of real.
for u,v V do
F[u,v]: =0 {спочатку потік нулевий}
end for
M : {ітерація збільшення потоку}
for v V do
S[v]: =0, N[v]: =0, P[v]: =(, ,) {ініціалізація}
end for
S[s]: = 1, P[s]: =(+, s, ) {так як sS}
repeat
a: = 0 {ознака розширення S}
for vV do
if S[v]=1 & N[v]=0 then
for u G(v) do
if S[u]=0 & F[v, u]<C[v, u] then
S[u]: = 1, P[u]: =(+, v,min(P[v].,C[v, u]-F[v, u])); a:=1
end if
end for
for u G-(v) do
if S[u]=0 & F[v, u]>0 then
S[u]: = 1, P[u]: =(-, v,min(P[v]., F[v, u])); a:=1
end if
end for
N[v]: = 1
end if
end for
if S[t] then
x: =t; : = P[t].
while x s do
if P[x].s= + then
F[P[x].n, x]: = F[P[x].n, x] +
else
F[P[x].n, x]: = F[P[x].n, x] -
end if
x: = P[x].n
end while
goto M
end if
until a=0
Пояснення
В якості першого наближення береться нулевий потік, який по визначенню є допустимим. В основному циклі, що помічений міткою М, виконується спроба збільшити потік. Для цього в циклі repeat розширюється, поки це можливо, множина вершин S, до яких з вершини s проходить ненасичений ланцюг. При цьому, якщо в множину S попадає вершина t, то потік збільшується протягом знайденої ненасиченого ланцюга <s, t> на величину , і починається нова ітерацію з метою збільшити потік. Процес розширення множини S в циклі repeat закінчується, тому що множина вершин скінчена, а відмічені в масиві N вершини повторно не розглядаються. Якщо процес розширення множини S закінчується і при цьому вершина t не попала в множину S, то за теоремою Форда і Фалкерсона знайдений потік F є максимальним і робота алгоритму закінчується.