Скачиваний:
37
Добавлен:
30.05.2020
Размер:
3.32 Mб
Скачать

води можна через неї пропустити? Саме на це запитання і дає відповідь метод, який розглядатиметься далі.

І ще дамо відповідь на таке запитання: чому потоки у мере­ жах розглядаються в теорії графів? Це пов'язано з тим, що

будь-яку мережу можна представити у вигляді зв'язного зва­ женого орієнтованого графа, де «вага» кожного ребра вказува­ тиме його пропускну спроможність, а орієнтація - напрям ру­ ху цим ребром.

Будь-якою мережею рухається потік. У мережі виділяються дві вершини: виток і стік. Вважається, що потік рухається ме­ режею, починаючи з вершини-витоку, проходячи ребрами че­ рез інші вершини, і надходить до вершини-стоку. Потік у ме­ режі визначається такими властивостями: величина потоку будь-яким ребром не перевищує його пропускної спромож­ ності; для будь-якої вершини, крім витоку і стоку, вхідний потік дорівнює вихідному. Вважається також, що для верши­ ни-витоку вхідний потік безмежний, а для вершини-стоку вихідний потік нікуди далі не розподіляється.

Задача про максимальний потік полягає у наступному: для даної мережі з витоком і стоком знайти потік максималь­ ного значення.

Які задачі можна віднести до потокових? Це не обов'язково може бути рух води трубами мережі. Замість води можна досліджувати рух інформації, що певним чином вимірюється і спрямована від одного пункту до іншого; грошових мас, що пе­ реміщуються від одного банку до іншого, враховуючи при цьо­ му потужність цих банків; рух транспорту з певним об'ємом си­ ровини поміж підприємствами, що її переробляють, враховую­ чи потужність цих підприємств і якість доріг, якими рухаєть­ ся транспорт. Різні, на перший погляд, задачі врешті-решт постають як графи, ребра яких мають певну «вагу» і напрям. Розв'язок цих задач можна одержати, визначивши максималь­ но можливу прохідність ребер заданих графів, враховуючи їх пропускну спроможність.

Алгоритм Форда-Фалкерсона побудови максимального потоку в мережі

Розглянута вище задача насправді є однією із класичних задач теорії графів і має алгоритм розв'язання. Він був запро­ понований різними авторами - Фордом та Фалкерсоном, однак базується на однаковій методиці розв'язання, яку можна визначити як «техніку міток».

Перш ніж розпочати її розгляд, звернемося до класичної постановки цієї задачі. Для кращого розуміння алгоритму

132

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

Отже, нехай задано зв'язний орієнтований зважений граф, в якому вершина s (витік) є початковою, а вершина t (стік) - кінцевою. При цьому кожному ребру мережі (графа) приписа­ на деяка пропускна спроможність С[і, j], що визначає макси­ мальне значення потоку, який може протікати заданим ребром (мал. 78).

>

Мал. 78

Висловлюючись «мовою водогону», під пропускною спро­ можністю ребра розумітимемо діаметр труби.

Для подальшого пояснення введемо поняття розрізу в ме­ режі. Підійдемо до цього поняття такою послідовністю мірку­ вань. Об'єднаємо дві мережі з малюнка 77 в одну таким чином, як зображено на малюнку 79, використавши для цього мову графів.

Якщо окремо кожною мережею, зображеною на малюнку 77, можна було прогнати по 10 л води, то, об'єднавши їх таким чи­ ном, як зображено на малюнку 79, 20 л! Цей висновок є інтуїтивно очевидним. Зважаючи на те, що у верхній частині мережі й у нижній є ребра з пропускною спроможністю 20 л, то слушним буде запитання: а які ребра гальмують проходження води заданою системою? Відповідь така: у верхній частині та­ ким ребром є центральне (1,2) з пропускною спроможністю 10 л, а в нижній - два крайніх (s,3), (4,£) також по 10 л.

Модифікуємо мережу, зображену на малюнку 79, а, так, як зображено на малюнку 79, б. Пропускна спроможність мережі

 

ю

а)

20

б)

 

Мал. 79

133

при цьому не зміниться, оскільки у верхній та нижній части­ нах залишилися «гальмуючі» ребра «вагою» 10. При цьому у верхній частині мережі у трубі біля витоку залишається 10 л невикористаної води, а у нижній частині мережі в останній трубі перед стоком труба наполовину порожня. Шкода, по­ тужність деяких труб знову не повністю реалізована. Чи мож­ на щось зробити? Висновок напрошується сам по собі: додати ще одне ребро, з'єднавши вершини 1 і 4. Для цього достатньо труби з пропускною спроможністю 10 л (мал. 80). Тепер у вер­ шині 1 вода буде перерозподілятися: половина піде трубою у вершину 2, а інша половина донаситить трубу, що виходить

звершини 4, злившись з 10 л води, що прийшли з вершини 3. Тепер до стоку мережі t буде надходити вже ЗО л води: 10 л

зверхньої частини і 20 л з нижньої.

ж \ ^У

1 0 -

Мал. 80

Проаналізуємо мережі, зображені на малюнках 79, б і 80 та визначимо, як можна отримати максимально можливу про­ пускну спроможність усієї мережі.

Мережа на малюнку 79, б складається з двох гілок, і мінімальними ребрами у кожній з них є ребра (1,2) і (3,4) (або (s,3)) «вагою» 10. їхня сума і визначає максимально можливу спроможність цієї мережі 20. А що являють собою ці ребра? Вони мають такі дві властивості: по-перше, сума їхніх «ваг» визначає максимальну спроможність, по-друге, якщо ми їх приберемо з мережі, то жодна краплина води не зможе потрапити з витоку s до стоку t.

На малюнку 80 до цієї мережі додано ще ребро (1,4) «ва­ гою» 10. Це дало змогу перегнати додаткові 10 л води з верши­ ни 1 у вершину 4 і збільшити пропускну спроможність мережі. У цій мережі вона становить ЗО. Якщо у мережі, зображеній на малюнку 80, вилучити ті самі два ребра, що й у мережі, зобра­ женій на малюнку 79, б, то вода все одно поступатиме з вито­ ку s до стоку t через ребро (1,4) і дасть змогу пропустити 10 л води. Для того щоб припинити подачу води, необхідно прибра­ ти ще й ребро (1,4) «вагою» 10. Сума «ваг» вилучених ребер із мережі, представленій на малюнку 80, становить ЗО, що збігається з її максимальною пропускною спроможністю. Слід

134

зауважити, що ребра (s,l) і (s,3) мають таку саму властивість. Однак вилучення не лише цих ребер припинить подачу води з витоку до стоку. Таких ребер є більше, наприклад (2,t) і (4,і). Але сума їх «ваг» становить 40, що більше максимальної про­ пускної спроможності нашої мережі.

Отже, зробимо висновок: максимальна пропускна спро­ можність мережі дорівнює мінімальній сумі пропускних спро­ можностей ребер, вилучення яких з мережі призводить до роз­ риву всіх шляхів, що ведуть з s до t. При цьому граф, що опи­ сує мережу, стає незв'язним.

Будь-яка множина ребер, вилучення яких призводить до втрати зв'язності мережі, називається розрізом. Зрозуміло, що пропускна спроможність будь-якого розрізу дорівнює сумі пропускних спроможностей ребер, що його утворюють. Розріз з

мінімальною пропускною спроможністю називають мінімаль­ ним розрізом мережі.

Визначимо максимальну пропускну спроможність мережі, зображеної на малюнку 78. Сукупність яких ребер є критич­ ною щодо зв'язності заданого графа? На перший погляд таки­ ми є ребра (2,і) і (4,t). Цей розріз мережі дорівнює 22. Однак при детальному аналізі знайдеться ще один розріз, значення якого є меншим. Це сукупність ребер (s,l) і (3,4). Вилучення цих ребер із мережі не дасть змоги подати жодної краплі води до стоку системи. Такий розріз є мінімальним зі значенням 20, що і визначає остаточне значення максимального потоку в за­ даній мережі. Наведений приклад є цікавим тому, що мінімаль­ ний розріз утворюють ребра, які не мають спільних вершин, як у мережі, зображеній на малюнку 80, або ж візуально легко визначаються, як у мережах, зображених на малюнку 79.

Тепер перейдемо до алгоритму Форда-Фалкерсона. Він ба­ зується на твердженні, що можна сформувати різні варіанти потоків з s до t, однак усі вони не будуть перевищувати про­ пускної спроможності мінімального розрізу. Причому знай­ деться хоча б один, який дорівнюватиме йому, і саме він буде максимальним, а тому найкращим.

З малюнка 80 видно, що потоками з s до t можуть бути такі:

-(s,l,2,t) з пропускною спроможністю 10;

-(s,3,4,/) з пропускною спроможністю 10;

-(s,l,2,f), (s,3,4,f) з пропускною спроможністю 20;

-(s,3,4,f), (s,l,4,t) з пропускною спроможністю 20;

-(s,l,2,t), (s,3,4,i), (s,l,4,f)3 пропускною спроможністю ЗО. Як бачимо, дійсно, пропускні спроможності всіх потоків ме­

режі не перевищують значення її мінімального розрізу. Серед них існує такий, який йому дорівнює і, відповідно, є розв'яз­ ком поставленої задачі.

135

Яким же може бути алгоритм визначення максимального потоку в мережі?

Найпростішим є варіант використання повного перебору всіх можливих варіантів вилучення ребер заданого графа: по одному, по два, по три і т. д. При цьому необхідно виконувати перевірку незв'язності отриманого графа і за цієї умови визна­ чати сумарну пропускну спроможність вилучених ребер. Ре­ зультуючою максимальною пропускною спроможністю мережі буде мінімальне значення суми пропускних спроможностей ви­ лучених ребер, що призводять до незв'язності заданого графа.

Для реалізації наведеного алгоритму можна використати алгоритм повної вибірки, який розглядався у розділі «Елемен­ ти комбінаторики в алгоритмічних задачах» і алгоритм пошу­ ку в ширину для визначення зв'язності графа.

Не будемо детально зупинятися на цьому алгоритмі з двох причин: по-перше, він не є оптимальним з точки зору часу його виконання і може бути застосований лише для невеликих ме­ реж; по-друге, він дає лише часткову відповідь на поставлену задачу, а саме визначає тільки значення максимального пото­ ку. У разі, якщо необхідно визначити, якою буде оптимальна насиченість кожного ребра мережі під час проходження води від витоку до стоку, описаний алгоритм не допоможе.

Для повного розв'язання задачі про максимальний потік пе­ рейдемо до метода Форда-Фалкерсона, що використовує запро­ поновану «техніку міток». Цей метод є ітераційним. Пояснимо новий термін.

Ітерація (або крок) полягає у тому, що спочатку підбираєть­ ся будь-який, можливо і не найкращий, розв'язок поставленої задачі. Найчастіше для цього використовується жадібний підхід, тобто підбирається будь-який розв'язок, що не супере­ чить умові задачі. На кожному із наступних кроків (ітерацій) робиться спроба покращити варіант розв'язку, визначений на попередньому кроці (ітерації). Ітераційний процес завершуєть­ ся тоді, коли ще кращий варіант визначити неможливо.

Метод ітерацій досить часто використовується як у матема­ тиці, так і під час розробки алгоритмів. Можна навести при­ клади ітераційних алгоритмів наближеного розв'язування задач знаходження розв'язку системи лінійних рівнянь, значень інтегралу тощо.

Перейдемо до розгляду алгоритму побудови максимального потоку в мережі, і метод ітерацій стане зрозумілим.

Порушимо цього разу послідовність викладення матеріалу: спочатку розглянемо ідею самого алгоритму на конкретному прикладі, а потім сформулюємо сам алгоритм.

Нехай задана мережа у вигляді орієнтованого зваженого графа (мал. 81, а), де виток позначимо вершиною з номером 1

136

(s = 1), а стік - вершиною з номером 6 (t = 6). Мережа задається таблицею пропускних спроможностей кожного ребра С[і, j], де (і,;') - орієнтоване ребро, початок якого знаходиться у вершині і, а кінець - у вершині j (мал. 81, б).

Ж

 

2

3

4

5

6

0

15

ЗО

0

0

0

 

 

 

 

 

 

0

0

0

10

20

0

 

0

5

0

5

0

0

 

 

 

 

 

 

 

 

0

0

0

0

0

0

 

 

 

 

 

 

 

 

0

0

0

3

0

12

б)

0

0

0

0

0

0

Мал. 81

Уважно придивившись до заданої мережі, можна помітити, що вона відрізняється від мережі, зображеної на малюнку 78, лише тим, що ребро (2,3) замінене на ребро (3,2). Пізніше, коли розглядатимемо алгоритм відшукання максимального потоку, ці зміни дадуть можливість дослідити всі особливості алгоритму Форда-Фалкерсона. Але для контролю коректності отриманого результату доведеться визначити значення максимального пото­ ку вже зараз. Для нашого прикладу він становить 22, оскільки визначається мінімальним розрізом, що утворюється ребрами (5,6) і (4,6). Нагадаємо, що для мережі, зображеній на малюн­ ку 78, вона становила 20. Отже, лише зміна напряму одного реб­ ра призвела до зміни значення максимального потоку в ній.

Для одержання максимального потоку в заданій мережі ми покроково насичуватимемо її водою, поки не дійдемо до макси­ мально можливого. У зв'язку з цим необхідно ще мати інфор­ мацію про поточну насиченість кожного ребра. Вона містити­ меться у таблиці F[i, j], значення елементів якої на початковому етапі дорівнюватиме 0. Поточне значення заповнення кожного ребра F[i, j] перед дужками з відповідним початковим заданим значенням С[і, j] (мал. 82).

^@-0(20)-<5Х

:<£>

 

Ч %

\

X

GX%Ч

^ .ov

0(5)

%,

0(3)

 

0(5)^4

Мал. 82

І ще одна інформація буде потрібна під час виконання алго­ ритму: для кожної вершини визначатимемо, з якої вершини і скільки води можна подати до неї на поточному кроці. Ця мітка

137

вказуватиметься лише для вершин, що розглядатимуться на по­ точному кроці виконання алгоритму, тобто на даній ітерації.

Щодо самих вершин введемо для них вже традиційний ста­ тус: «відвідана», «побачена», «нова». Це дасть нам змогу конт­ ролювати перегляд і відвідування вершин під час кожної іте­ рації. Така термінологія наводить на думку, що для визначення послідовності ребер мережі, якими буде проходити потік, вико­ ристовуватиметься алгоритм пошуку в ширину. І це справді так.

Щодо кожного ребра, то нас буде цікавити питання стану йо­ го насиченості: чи воно вже максимально насичене, або ж має можливість донасичуватися, тобто у нього є певний резерв по­ току. Цю характеристику можна отримати порівнянням двох параметрів - заданою С[і, /] і поточною F[i, j\ пропускною спро­ можністю кожного ребра.

Наприкінці зазначимо ще один момент, який враховувати­ меться під час виконання алгоритму побудови максимального потоку. Коли у деяку вершину і приходить потік, то він не обов'язково продовжує переміщатися лише одним з ребер, що виходить із цієї вершини. Його можна перерозподіляти різни­ ми ребрами, що виходять з неї. На перший погляд це очевидно, але при виконанні алгоритму така особливість не повинна бути втраченою, тобто можливий перегляд перерозподілу наявної кількості води, що виходить з поточної вершини різними реб­ рами. Це можна буде побачити на одному з кроків виконання алгоритму, що і є його характерною особливістю.

Насичення потоку в мережі здійснюватимемо поетапно, за допомогою ітерацій. Скільки ітерацій (кроків) нам знадобиться для розв'язання задачі, стане зрозумілим, коли завершиться процес насичення і більше ніяких змін неможливо буде зроби­ ти. Отже, визначаємо ітерації.

Перша ітерація

Позначимо вершину 1 міткою [0, °°]. Це означає, що пропуск­ на спроможність цієї вершини не обмежена і вода поступає у цю вершину «нізвідки» (мал. 83, а). Визначимо вершину 1 як відвідану, позначимо її на малюнку темним кольором і занесе­ мо у послідовність як ту, з якої будемо дивитись далі на інші вершини. Далі будемо дивитись з вершини 1, позначивши її для цього стрілочкою.

Які ребра виходять з вершини 1? Це ребра (1,2) та (1,3). Вер­ шини 2 і 3 нові, але їх вже можна побачити, і, окрім цього, відо­ мо, який потік можна до них пропустити: до вершини 2 ребро (1,2) дає змогу пропустити 15 одиниць води, а до вершини З ребро (1,3) - ЗО одиниць. Позначимо їх відповідно мітками [1,15] та [1,30], де перше число - номер вершини, з якої іде

138

потік, друге - числове значення потоку, який можна передати цим ребром (мал. 83, б). До послідовності перегляду вершин до­ пишемо вершини 2 і 3, вказавши індексами номери вершин - предків, з яких вони «побачені», та на малюнку виділимо світ­ ло-сірим кольором. Нагадаємо, що поки дивимося на інші вер­ шини мережі з вершини 1.

[1,15]

Д У 0 ( 2 0 ) - ( 5 ^ (if)-0(20) */ІГ)г

ь

0(3)

0(5)-^(4j

а)

б)

1о 2, З,

Мал. 83 Оскільки з вершини 1 інших вершин не видно, то можна пе­

реходити у наступну видиму вершину для того, щоб продовжи­ ти огляд далі. Такою вершиною у послідовності, що нами бу­ дується, є вершина 2. З неї «видно» вершини 4 і 5. Обидві ці вершини є новими, тому дописуємо їх до послідовності і помі­ чаємо як «видимі», а вершину 2 - як «відвідану» (мал. 84, а). Перефарбуємо вершину 2 у темно-сірий колір, а вершини 5 і 4 - у світло-сірий. Який об'єм води можна отримати у кожній з вершин 4 і 5, враховуючи те, що попадає вона туди з верши­ ни 2? У вершині 2 накопичиться води 15 одиниць, а це означає, що якщо ми підемо шляхом на вершину 5, то вся вона пройде, ще й залишиться резерв 5 одиниць. Тому біля вершини 5 поста­ вимо мітку [2,15]. А от якщо будемо рухатися у напрямі верши­ ни 4, то більше ніж 10 одиниць води пропустити не зможемо. Тому і мітка у вершині 4 буде такою: [2,10] (мал. 84, а).

 

[1,15]

 

[2,15]

 

 

[1,15]

[2,15]

 

 

(Ш-0(20)

 

 

^-0(20)-W?X

 

^

t\

I> / ,\

 

 

 

З®

 

0(5)

^

0(3)

[0ж.

0(5)

^ 0(3)

 

 

 

\JL^

Ж1

\і>^'

 

 

 

 

 

 

 

о(5)-»~(4;

 

 

[1,30]

 

[2,10]

 

 

[1,30]

[2,10]

 

 

 

 

 

 

І,'

 

а)

1о 2,

3,

42 5

 

б)

1,12^14,15,1

 

 

Т

 

 

 

Мал. 84

 

 

 

 

 

 

 

 

 

 

 

Вибираємо наступну в черзі, якою фактично є послідовність, вершину 3. З неї видно вершини 2 і 4. Але обидві ці вершини

139

відмічено як «видимі», тому дописувати їх у послідовність немає сенсу. Саме тому малюнок 84, б не містить інших відмінностей, окрім того, що огляд нових невидимих вершин проводимо з вершини 3.

Переходимо до вершини 4, позначивши її темним кольором (мал. 85, а). З неї можна потрапити лише у вершину 6. Ця вер­ шина «невидима», тому дописуємо її до послідовності і надаємо статус «видимої». Окрім цього, потрапивши у неї з вершини 4, можна передати ребром (4,6) 10 одиниць води, а саме стільки у цій вершині і було! Мітку [4,10], що засвідчує цей факт, по­ ставимо біля вершини 6. Процес проходження мережею від ви­ току до стоку завершено, і при цьому до вершини 6 надійшло 10 одиниць води.

Підіб'ємо підсумок першої ітерації: 1) знайдено перший варіант проходження мережі шляхом (1,2), (2,4), (4,6); 2) зна­ чення потоку знайденим шляхом дорівнює 10 одиницям.

Позначимо отриманий результат на малюнку 85, б виділени­ ми ребрами. Біля ребер, що утворюють прохідний шлях, який носить назву доповнюючого шляху, від витоку 1 до стоку 6 у цій ітерації, проставимо мітки, котрі визначають кількість води, яку можна пропустити кожним ребром, і у дужках відповідну пропускну спроможність. Біля вершини-стоку 6 вказано поточ­ не значення максимального потоку в мережі на даній ітерації.

[1,15]

[2,15]

( 2 У 0(20) н т

 

-0(20)*-(,')

 

©с

5(0) Vg, 0(3)

 

10

2,

3,

42

52

64

2,

42

64

а)

б)

 

 

Мал. 85

Друга ітерація

Перша ітерація завершилася результативно: знайшовся до­ повнюючий шлях від витоку 1 до стоку 6, яким було передано мережею 10 одиниць води. Варто спробувати збільшити потік.

Для цього почнемо процес прогону води з початку, врахову­ ючи результати попереднього кроку.

Отже, ставимо мітку [0, °°] у вершині 1 (мал. 86, а). Чи мож­ на з неї «побачити» вершини 2 і 3? Так, до верпіини 2 можна подати ще 5 одиниць води, а ребро (1,3) взагалі ще порожнє. Та-

140

ким чином вершина 2 отримує мітку [1,5], а вершина 3 - [1,30] (мал. 86, б).

хгч

 

 

[1.5]

 

г

rv: ~^<і\

(1Г)-0(20)-*/5}

 

( І У 0(20)^(5).

 

 

;©«:

 

 

% V-ч

5(0) % ,

0(3)

0(5)

%

0(3)

[о>°°] ><?„

 

& [о.«] % ,

 

\L>*

 

 

 

 

 

 

2>--о(5)н2г

 

 

 

[1,30]

 

 

а)

 

б)

1. 2,

З,

' .

 

 

Мал. 86

Ж

 

 

 

 

 

 

 

Перейдемо у наступну «видиму» вершину 2 і подивимось з неї на решту вершин мережі. На попередній ітерації з неї мож­ на було перейти до вершин 4 і 5, а тепер вершина 4 нам недо­ ступна, оскільки ребро (2,4) максимально наповнене і значення його пропускної спроможності збігається зі значенням його наповнюваності. Таким чином, до послідовності переглянутих і видимих вершин можна дописати лише вершину 5, позначив­ ши її міткою [2,5] (мал. 87, а). Чому не 20, адже пропускна спроможність ребра (2,5) має саме таку потужність? Однак у вершину 2 прийде лише 5 одиниць води, тому і у вершині 5 більше води не з'явиться.

Наступним кроком у цій ітерації буде перехід до вершини 3. З неї можна «побачити» вершину 4, яку у цій ітерації ще не бу­ ло «видно». Зафарбуємо цю вершину як «видиму» і позначимо міткою [3,5] (мал. 87, б). Тепер є зрозумілим визначення пото­ ку величиною 5 у вершині 3. Це спричинене тим, що хоча у вер­ шину 3 приходить ЗО одиниць води, однак ребро (3,4) може пропустити з них лише 5.

[1,5]

 

 

[2,5]

 

 

[1,5]

 

[2,5]

 

 

^ - 0 ( 2 0 ) ^ ( 5

^

 

А - С0(20) * Ґ 5

 

 

**ч\

TX,s w^^tN

 

 

 

•с

 

 

3®«№%

0(5)

\^

0(3)

( б )

 

 

 

 

 

 

 

 

 

о ( 5 ) ~^(їХ

 

 

 

 

 

 

 

 

 

 

[1,30]

 

[3,5]

 

 

а)

2,

з,

52

 

 

 

1» 2,

3,

5, 4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Мал. 87

 

Переходячи у вершину 5, дописуємо до послідовності нову «видиму» з неї вершину 6 і позначаємо її міткою [5,5] (мал. 88, а).

141

Соседние файлы в папке Методи побудови алгоритмів та їх аналіз