Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МВ лаб роб дискретна математика.DOC
Скачиваний:
19
Добавлен:
06.11.2018
Размер:
508.42 Кб
Скачать

2. Завдання до самостійної роботи.

  1. Згенерувати матрицю вагових коефіціентів повного неорієнтованого графа (кількість вершин n=5).

  2. Розробити та реалізувати у вигляді програми «жадібний» алгоритм побудови мінімального остовного дерева для заданого неорієнтованого повного графа.

Звіт

  1. Постановка задачі.

  2. Хід роботи.

  3. Результати роботи.

  4. Висновки.

Контрольні питання

  1. Що розуміється під терміном остовне дерево для заданого графа?

  2. Із скількох ребер складається остовне дерево? Обґрунтуйте свою відповідь.

  3. На якому алгоритмі базується алгоритм побудови остовного дерева?

  4. Чи завжди існує лише один варіант остовного дерева для заданого графа? Обґрунтуйте свою відповідь.

  5. Що розуміється під остовним деревом мінімальної довжини?

  6. Продемонструйте покрокове виконання «жадібного» алгоритму на власному прикладі.

Лабораторна робота № 5 Знаходження максимального потоку транспортної мережі

Мета роботи: ознайомитися з алгоритмом Форда-Фалкерсона знаходження максимального потоку в мережі.

  1. Теоретичні відомості.

Розглянемо орієнтований зв'язний мультиграф G(V,E) без петель. Такий граф называється транспортною мережею, якщо для нього відрізняючою характеристикою є наявність:

- єдиної вершини, такої, що G-1(x0)=;

- єдиної вершини xn, такої, що G(xn)= ;

- відповідність кожній дузі g графа цілого невідємного числа с(g)0; дане число називається пропускною спроможністю дуги.

Вершина s=x0 називається входом мережі (або витоком), а вершина xn = t — виходом (або стоком).

Транспортні мережі вводяться з метою опису транспортування деякої субстанції (природа якої може бути різноманітна і залежить від виду і структури об'єктів, що переміщаються, наприклад, описується переміщення рідин або газу в трубопроводі, автотранспорту в мережі автомагістралей, передача інформації з інформативної мережі і т.д.) і розгляданні задач по оптимальній організації різного виду транспортувань.

Потоком транспортної мережі називається целочисльна функція f(g), що задовольняє властивостям:

1. с(g)0 , де gE;

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, так що , x0S, xnT, а в Р попадають всі дуги, що з’єднують 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. Якщо виявиться, що tS, то це означає, що потік не максимальний і його можна збільшити на . Для визначення ненасичених ланцюгів і одночасного нарахування величини  в алгоритмі використовується допоміжна структура даних:

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, ) {так як sS}

repeat

a: = 0 {ознака розширення S}

for vV 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 є максимальним і робота алгоритму закінчується.