Оптимізація на мережах
Нехай S є довільна, частково орієнтована мережа, кожному ребру u якої приписане невід'ємне число c(u) - пропускна спроможність. Потоком у мережі S називається пара (f, w), де w - деяка орієнтація всіх неорієнтованих ребер мережі, а f(u) - задана на множині всіх ребер функція з невід'ємними значеннями, що не перевершують пропускних спроможностей, і така, що в кожній внутрішній вершині a виконується закон Кірхгофа, відповідно до якого сума значень потоку по ребрах, що входить у вершину, дорівнює сумі потоків по ребрах, що виходить із вершини. Іншими словами, для f(u) виконуються умови:
0 £ f(u) £ c(u) для усіх вершин мережі;
![]() |
R(a) = 0 для усіх внутрішніх вершин, де
а G(a) (відповідно G'(a)) - множина всіх ребер, що виходять із a (відповідно вхідних у a) при орієнтації w.
Оскільки сума значень R(a) по усіх вершинах мережі, включаючи полюси, дорівнює нулю (кожне ребро є вихідним для однієї вершини і вхідним для іншої), то R(as) = - R(bs). Значення R = R(as) називається величиною потоку.
Розглянемо задачу визначення максимального значення Rmax потоку через мережу S при заданих значеннях пропускних спроможностей. Відповідь може бути отримана у термінах перетинів мережі.
Перетиноммережі називається множина ребер, при видаленні яких мережа стає незв'язною, причому полюса потрапляють у різні компоненти зв'язності. У мережі на рис. 2.11 прикладами перетинів є {d, e, f}, {b, c, e, g, h}, {d, g, h, i}.
Перетин називається простим, якщо при видаленні будь-якого його ребра, він перестає бути перетином. Так, перетини {d, e, f} і {b, c, e, g, h} - прості, а перетин {d, g, h, i} не є таким. Очевидно, що для кожного ребра простого перетину можна зазначити ланцюг, що проходить через це ребро, але не проходить через інші ребра даного перетину.
![]() |
7 a d h 2
![]() | ![]() |
aS 2 c 4 e 3 g bS
3 b 4 i
1
f
Рис.2.12. Задача максимального потоку
Якщо у зв'язній мережі віддалиться простий перетин, то мережа розпадеться рівно на дві частини: ліву і праву, що містить aS і bS відповідно. Кожне ребро простого перетину зв'язує вершини з різних частин. Будемо називати ребро перетину прямим, якщо воно в мережі не орієнтоване або орієнтоване зліва праворуч, і оберненим у противному випадку. Буде орієнтоване ребро прямим або оберненим, залежить від вибору перетину. Так, у прикладі ребро е в перетинах {d, e, f} і {b, c, e, g, h} - обернене, а в перетині {a, c, e, g, i}- пряме.
Кожному простому перетину W припишемо пропускну спроможність c(W), рівну сумі пропускних спроможностей усіх його прямих ребер. У прикладі на рис.2.12 перетин {d, e, f} має пропускну спроможність 5+1=6, а перетин {b, c, e, g, h} - 3+2+3+2=10.
Теорема про максимальну пропускну спроможність мережі сформульована Фордом і Фалкерсоном так: максимальний розмір потоку Rmax через мережу S дорівнює мінімальній пропускній спроможності cmin її простих перетинів. Ця теорема покладена в основу задачі визначення максимальної пропускної спроможності мережі.
Розглянемо алгоритм Форда - Фалкерсона для розв'язання цієї задачі.
Крок 0.Нехай джерела позначені, але не переглянуті, а всі інші вузли не позначені.
Крок 1. Вибрати довільний позначений, але не переглянутий вузол i.
Крок 2. Переглянути всі дуги e (i, j) із пропускною спроможністю a е > 0, що з'єднують вузол i з ще не позначеними вузлами j. Приписати позначки вузлам j і відзначити дуги e j = e = (i, j). Тепер вузол i позначений та переглянутий, вузли j позначені, але не переглянуті. Якщо при цьому стік виявився позначеним, то необхідний ланцюг знайдений. У противному випадку після перегляду по всіх дугах (i, j) перейти до кроку 3.
Крок 3.Нехай вузол i позначений і переглянутий. Перейти до кроку 1 і повторювати кроки алгоритму доти, поки не залишиться позначених і не переглянутих вузлів. На цьому пошук максимального потоку закінчується.
Розглянемо приклад. Нехай необхідно знайти максимальний потік для графа (рис.2.13).
7.7 I
c e
16 I 9.8 I 12 I 7 I
8.8 I d
s a j
12.1 12 I 5 I
f 11 I
6.2 I 11 I 15 I 20 I
7.5 I
b t
8 I
Рис. 2.13. Заданий граф
Позначено: I - ресурси не використані; R - ресурси використані цілком; IR - ресурси використані частково.
1. Вибираємо один із довільних маршрутів (рис.2.14). Нехай це буде маршрут (s, b), (b, t).
p1 = min {f(s, b), f(b, t)} = min {6.2; 8} = 6.2.
c I e
I
I I d I
I
s a I j
I I I
f
R I I
I
b t
IR
Рис.2.14. Перший маршрут
2. Маршрут (s, a), (a, f), (f, t) наведений на рис.2.15.
p2 = min {f(s, a), f(a, f), f(f, t)} = min {12.1; 12; 15} = 12; PS[AK1] = 18.2.
I
c e
I
I I d I
I
s a I j
IR R I
f
R I I IR I
b t IR
Рис.2.15. Другий маршрут
3. Маршрут (s, a), (a, b), (b, f), (f, t) наведений на рис.2.16.
p3 = min {f(s, a), f(a, b), f(b, f), f(f, t)} = min {0.1; 11; 7.5; 3} = 0.1; PS = 18,3.
I
c e
I
I I d I
I
s a I j
R R I
f
R IR IR I
IR b t
IR
Рис.2.16. Третій маршрут
4. Наступний маршрут (s, c), (c, e), (e, j), (j, t) наведений на рис.2.17.
p4 = min {f(s, c), f(c, e), f(e, j), f(j, t)} = min {16; 7.7; 7; 20} = 7; PS = 25.3.
c IR e
I
IR I d R
IR
s a R j
IR R I
f
R IR IR IR
R b t
R
Рис.2.17. Четвертий маршрут
Таким чином, максимальний потік буде 25.3 одиниць.
Якщо для мережі кожне ребро характеризується деяким числом, що є відстанню між вузлами мережі, то виникає задача визначення найкоротшої відстані між заданими вузлами, тобто початку і стоку.
Розглянемо алгоритм Дейкстри для визначення найкоротшого шляху (ланцюга) з початку в стік.
Крок 0. Вибрати як перспективну множину вузлів множину S c = S 0 і покласти d i = 0 для i ÎS 0 та d i = ¥ для i Ï S 0 .
Крок 1. Вибрати вузол i * Î S c, якому відповідає найменше значення di ( i Î S0 ) . Знайдений в такий спосіб розмір d i відповідає найкоротшому шляху з деякого джерела у вузол i* (довжиною дуги є c e), а дуга e i ( визначена для усіх вузлів i Î S c , крім джерел ) є остання дуга шляху . Якщо i * - стік , то процедура пошуку найкоротшого шляху закінчується .
Крок 2. Переглянути дуги e = ( i *, j ) і замінити оцінку d j на min {d j , d i + c e}. Якщо d j була дорівнена ¥ , увести вузол j у S c. Якщо d j зменшилася, увести позначення e j = e = (i*, j).
Крок 3. Видалити i* із S c і перейти до кроку 1 , якщо множина S c не порожня. На цьому пошук найкоротшого шляху закінчується.
Розглянемо приклад.
Для мережі, показаної на рис.2.18, визначити найкоротший шлях із початку в стік .
7.7
c e
![]() | |||||
![]() | |||||
![]() | |||||
16 9.8 d 12 7
8.8
s a 5 j
Поча- 12.1
ток 12 f 11
6.2 7.5 15 20
b t
8 Стік
Рис. 2.18. Мережа для визначення найкоротшого шляху
1. Фарбуємо вершину s.
Приймемо d(s) = 0;
d(a) = d(b) = d(c) = d(e) =d(f) = d(j) = ¥.
2. Поточна змінна y = s.
d(a) = min { d(a), d(s) + d(s, a)} = min {(; 0 + 12.1} = 12.1;
d(b) = min {d(b), d(s) + d(s, b)} = min {(; 0 + 6.2} = 6.2;
d(c) = min {d(c), d(s) + d(s, c)} = min {(; 0 + 16 } = 16;
d(d) = min {d(d), d(s) + d(s, d)} = min {(; 0 + ( } = ¥;
d(e) = min {d(e), d(s) + d(s, e)} = min {(; 0 + ( } = ¥;
d(f) = min {d(f), d(s) + d(s, f)} = min {(; 0 + ( } = ¥;
d(j) = min {d(j), d(s) + d(s, j)} = min {(; 0 + ( } = ¥;
d(t) = min {d(t), d(s) + d(s, t)} = min {(; 0 + ( } = ¥;
min {d(a), d(b), d(c), d(d), d(e), d(f), d(j), d(t)} =
= min {12.1; 6.2; 16; ¥; ¥; ¥; ¥; ¥} = 6.2; d(b) = 6.2 . Фарбуємо вершину b.
3. Поточна змінна y = b.
d(a) = min {d(a), d(b) + d(b, a)} = min {12.1; 6.2 + ¥} = 12.1;
d(c) = min {d(c), d(b) + d(b, c)} = min {16; 6.2 + ¥} = 16;
d(d) = min {d(d), d(b) + d(b, d)} = min {¥; 6.2 + ¥} = ¥;
d(e) = min {d(e), d(b) + d(b, e) } = min {¥; 6.2 + ¥} = ¥;
d(f) = min {d(f), d(b) + d(b, f) } = min {¥; 6.2 + 7.5} = 13.7;
d(j) = min {d(j), d(b) + d(b, j) } = min {¥; 6.2 + (} = ¥;
d(t) = min {d(t), d(b) + d(b, t) } = min {¥; 6.2 + 8} = 14.2;
min {d(a), d(c), d(d), d(e), d(f0, d(j),d(t)} =
= min {12.1; 16; ¥; ¥; 13.7; ¥; ¥} = 12.1; d(a) = 12.1. Фарбуємо вершину a.
4. Поточна змінна y = a.
d(c) = min {d(c), d(a) + d(a, c)} = min {16; 12.1 + 9.8} = 16;
d(d) = min {d(d), d(a) + d(a, d)} = min {¥; 12.1 + 8.8} = 20.9;
d(e) = min {d(e), d(a) + d(a, e)} = min {¥; 12.1 + ¥} = ¥;
d(f) = min {d(f), d(a) + d(a, f)} = min {13.7; 12.1 + 12} = 13.7;
d(j) = min {d(j), d(a) + d(a, j)} = min {¥; 12.1 +¥} = ¥;
d(t) = min {d(t), d(b)+d(b, t)} = min {¥; 12.1 + ¥, 6.2+8} = 14.2;
min {d(c), d(d), d(e), d(f), d(j), d(t)} =
= min {16; 20.9; ¥; 13.7; ¥; ¥} =13.7; d(f) = 13.7.
Фарбуємо вершину f.
5. Поточна змінна y = f .
d(c) = min {d(c), d(f) + d(f, c)} = min {16; 13.7 + ¥} = 16;
d(d) = min {d(d), d(f) + d(f, d)} = min {20.9; 13.7 + ¥} = 20.9;
d(e) = min {d(e), d(f) + d(f, e)} = min {¥; 13.7 + ¥} = ¥;
d(j) = min {d(j), d(f) + d(f, j)} = min {¥; 13.7 +11} = 24.7;
d(t) = min {d(t), d(f) + d(f, t), d(b)+d(b, t)} = min {¥; 13.7 + 15, 6.2+8} = 14.2;
min {d(c), d(d), d(e), d(j), d(t)} = min {16; 20.9; ¥; 24.7; 14.2} =14.2;
d(t) = 14.2.
Фарбуємо вершину t.
Висновок. Найкоротший шлях з початку s у стік t тільки один, складається з дуг (s, b) і (b, t) та дорівнює 14.2 одиниць.
Розглянуті положення за теорією графів можуть використовуватися при розв'язанні задач моделювання об'єктів із складною внутрішньою структурою. Алгоритми, побудовані з використанням теорії графів, відрізняються високою швидкодією, а моделі об'єктів і процесів отримуються наочними і простими в програмуванні.