Файл: Ху, Т. Целочисленное программирование и потоки в сетях.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 15.10.2024
Просмотров: 209
Скачиваний: 0
|
10.1. |
КРАТЧАЙШИЕ ЦЕПИ |
193 |
|
a Nj — тот |
из узлов Ni |
дерева, на |
котором достигается |
этот |
минимум: |
L'sr —rain (LSi + |
(!&) = Lsj + |
djr. Покажем, что |
тогда |
L sr’ = |
|
i |
|
|
|
|
|
|
|
Lsr, а дуга A jr должна принадлежать искомому дереву. |
|
||||||||
Рассмотрим произвольную цепь из узла |
N s |
в |
узел |
N r. Так |
|||||
как |
узел N s принадлежит |
текущему |
дереву, |
а |
узел |
N r |
ему |
||
не принадлежит, |
то всегда можно найти в рассматриваемой цепи |
||||||||
первый узел N k, |
не принадлежащий дереву |
(в частности, таким |
|||||||
узлом N h может |
оказаться сам узел N r). Из |
определения L'Sk сле |
|||||||
дует, |
что любая |
цепь из |
N s в N r, |
проходящая через узел |
Nk, |
будет не короче, чем Ыи (здесь используется предположение, что
все расстояния d i ^ 0 ; |
в противном случае участок цепи из |
N k |
||
в N r |
может оказаться |
отрицательным). |
А так как L Sk^L'sr,’ |
то |
длина |
рассматриваемой |
цепи из N s в |
N T будет не короче, чем |
L'sr. Но цепь имеет длину, равную в точности L'sr. Следовательно, L'sr — Lsr, и дуга Ajr должна быть включена в число дуг дерева.
(Заметим, что на последующих |
шагах |
алгоритма величина L'sr |
не может стать меньше, чем Lsr-) |
дуг дерева увеличивается |
|
На каждом шаге алгоритма |
число |
на единицу, при этом величины Ь& должны быть пересчитаны для всех узлов, соседних с вновь построенным деревом. Для этого имеющаяся величина L'sk сравнивается с величиной Lsr + drk- Если
Lsr + dru < L'sh, |
то |
параметру |
L'Sk |
присваивается значение Lsr+ |
|||||||
+ dru, если |
же |
L |
s t + dTk^ L'st„ |
то |
L'sk остается без изменения. |
||||||
Символически это записывается в следующем виде: |
|
|
|
||||||||
|
|
|
|
L ’sk : = min {L'sk, |
Lsr+ dTk), |
|
|
(1) |
|||
где символ : = обозначает оператор присвоения. |
|
|
|
||||||||
Теперь можно привести весь алгоритм решения задачи. |
|
||||||||||
Ш аг |
0. |
Положить, |
что узел N s принадлежит дереву; |
Lss = 0; |
|||||||
для соседних с N s узлов Lsh = dsk, |
для |
остальных |
= оо. |
|
|||||||
Ш аг |
1. |
Положить |
Lsr = min L sh’ = |
Lsj + djr, |
где N h— все |
||||||
|
|
|
|
|
|
h |
Дугу AjT включить |
в |
число |
||
узлы, соседние с текущим деревом. |
|||||||||||
дуг дерева. |
|
|
|
|
|
|
|
|
|
|
|
Ш аг |
2. |
Если число дуг дерева равно п — 1, то |
конец. |
Если |
нет, перейти к шагу 3.
Ш аг 3. L'Sk : = m in(Z4, Lsr+ drft). Перейти к шагу 1.
Этот алгоритм может быть осуществлен при помощи расста новки пометок. Каждый узел N h получает пометку вида (L, i). Первая часть пометки —это величина L'Sh или Lsh, а вторая часть указывает соседний с N k узел в кратчайшей цепи из N s в N h. Пометка называется временной, если она имеет вид(А^, i), и постоян-
13 Т . Х у
194 ГЛ. 10. КРАТЧАЙШИЕ ЦЕПИ И ПОТОКИ МИНИМАЛЬНОЙ СТОИМОСТИ
ной, если она имеет |
вид (Lsft, |
г). Вначале каждый узел N h, сосед |
|
ний с узлом N a, получает временную пометку (dsft, s) = |
( L s h , s ) . |
||
Если Lsr = min L'Sh, |
то узел |
N T получает постоянную |
пометку |
ь |
|
|
|
S) = (Bsr, s). |
|
|
|
Подсчитаем, какое число операций сложения и сравнения тре буется для выполнения алгоритма. На шаге 3 нужно выполнить не более п операций сложения и п операций сравнения, чтобы получить временные пометки. На шаге 1 нужно выполнить еще не более п сравнений, чтобы получить постоянную пометку. Таким
образом, требуется самое большее 3п операций, чтобы найти одну постоянную пометку. Так как в сети имеется п узлов, то для нахождения кратчайшей цепи потребуется самое большее 3/г2 опе
раций.
Рассмотрим сеть, изображенную на рис. 10.1, где числа рядом с дугами выражают расстояния. Линии без стрелок обозначают неориентированные дуги; считаем, что у неориентированных дуг
dtj |
= dji. Найдем кратчайшую цепь в этой сети. |
узлы Ад, |
|
|||||||
|
Вначале |
все |
дуги сети не принадлежат дереву: |
N z, |
||||||
N 3—соседние |
с |
узлом |
N s. |
Присваиваем |
временные пометки: |
|||||
(Ыи s) = (4, s) |
узлу N u (3, |
s) —узлу N 2, |
(1, s) — узлу N 3. |
Так |
||||||
как |
min (4, |
3, |
1 ) = 1 , |
то пометка |
(1, s) становится постоянной |
|||||
пометкой узла N 3, |
а дуга А $3 |
становится дугой дерева. Значит, |
||||||||
пока найдена только одна дуга дерева Л53. |
|
|
|
|||||||
|
Теперь |
узлами, соседними |
с деревом, являются N u Лг2, |
|
||||||
N 3. |
Присваиваем им временные пометки: |
|
|
|
||||||
|
Lsi- = m in(Ln, Ls3 + d3i) = min (/Bl + oo) |
= 4 , |
|
|||||||
|
Ls2 - —min (Bs2 , Ls3-\-d32 ) = |
min (3,1 -f-1) |
= 2 , |
|
||||||
|
Ls4: = min(Ls4 , L S3 + |
d3i) = |
min (oo, |
1 -f oo) = oo, |
|
|||||
|
Ls5: = |
min(Ls5, Ls3 + |
d3b) = |
min (oo, |
8 ) |
==8 . |
|
10.1. КРАТЧАЙШИЕ ЦЕПИ |
195 |
Наименьшей из этих пометок является L's2, следовательно, она становится постоянной, а дуга А 32 становится дугой дерева. Теперь текущее дерево состоит из двух дуг. Продолжим вычисле ния:
LA- = |
min (Lsi, Ls2 + <32i) = |
min(4, |
2 + |
2) |
= 4 , |
|||
Ls4: = |
min(Ls'4, Ls2 + |
d2i) = min (oo, |
2 + 5) |
= |
7, |
|||
Ls5i = |
min(Ls5 , b s2 + |
d25) = |
m in(8 , |
2 |
+ |
oo) |
= |
8 . |
Наименьшей из этих пометок является Ls4,’ следовательно, она становится постоянной, а дуга A si становится дугой дерева. Далее,
|
Ls4: =m in(L s4, Lsl + |
di4) = min(7, |
4 + |
2) |
|
= 6 , |
||||
|
Ls6: = |
(L'sb, Lsi + di&) |
= |
min (8 , |
4 + 4) |
|
= 8 . |
|||
Теперь |
Lk становится постоянной |
пометкой, |
а |
дуга A lk—дугой |
||||||
дерева. |
Далее |
|
|
|
|
|
|
|
|
|
|
L st:’ = |
min (LU, |
L s i+ du) = m in(oo, |
6 + |
4) |
= 1 0 , |
||||
|
Lss: = |
min (L55, |
Lsi + |
d45) = min (8 , |
6 + |
oo) |
= 8 . |
Теперь L'sb становится постоянной пометкой, |
а дуга A ia |
или Азь |
|
может стать дугой дерева. Выберем А аа в качестве |
дуги |
дерева. |
|
Тогда |
|
|
|
Lst: = min (Lit, Ls6 + d+) = min (10, |
8 + 1) = |
9. |
|
Следовательно, дуга A at становится дугой дерева, и на этом вычис ления заканчиваются. На рис. 10.1 дуги дерева выделены жир ными линиями, а пометки узлов указаны в скобках.
Описанный выше алгоритм можно использовать для нахожде ния не только кратчайших цепей, но и цепей, удовлетворяющих другим критериям оптимальности. Поэтому интересно определить, при каких критериях оптимальности этот алгоритм приводит к решению. Поставим в соответствие каждой дуге сети А ц произ
вольное число g tj . Пусть Ац, A i2, . . ., |
A vl, A jh — произвольная |
||||||||
последовательность |
дуг, образующая цепь. Обозначим |
через |
|||||||
Gij (gu, . |
. ., |
., |
gPj) |
значение |
критерия |
оптимальности |
на |
цепи |
|
А п , А 12, |
. . |
A pj |
из узла |
N t в узел Л + а через Gih { g n , |
. . ., |
||||
• • ., |
gPj, |
gjk) |
— значение |
критерия |
оптимальности |
на |
цепи |
||
и. |
А 12, |
. . |
|
Apj, |
A jk из |
узла N, в узел N k. |
|
|
|
Если |
в задаче |
минимизации критерия оптимальности выпол- |
|||||||
няется условие |
|
|
|
|
|
||||
|
|
|
|
|
Gu ^ G ik, |
|
|
(2 а) |
|
а в |
задаче |
максимизации — |
|
|
|
||||
|
|
|
|
|
Gu ^ Gm , |
|
|
(26) |
13*
196 ГЛ . 10. КРАТЧАЙШ ИЕ ЦЕПИ И ПОТОКИ МИНИМАЛЬНОЙ СТОИМОСТИ
то для решения задачи можно использовать описанный выше алгоритм.
В частности, если gц — di} и ищется кратчайшая цепь в сети, то
|
&ij (gii> |
• • ч gpj) — gil + gn + |
• • • + gpj, |
(3) |
||
G t k ( g n , |
. . ., g p j , g j k ) = g i i + g n + |
• • • + g p j + g j k ■ |
(4 ) |
|||
Так как |
di} ^ |
0, |
то и з |
(3) и (4) следует |
условие (2а). |
(2). |
Приведем еще |
один |
пример, когда выполняется условие |
||||
Пусть gu |
— это дуговые пропускные способности Ъ1}. Требуется |
найти цепь, через которую можно пропустить наибольший поток
(задача о пути с |
максимальной пропускной способностью [104]). |
|||
В этом случае |
|
|
|
|
G u ( g t u |
• - ч g p j ) = |
m in ( g i U |
g i 2 , . . |
g p J ) , |
G i k { g i h • * |
ч g p j i g j k ) = |
m ill { g i l i |
g l 2 i • * |
•> g p j i g j k ) ' |
Условие (26) здесь выполняется. Для того чтобы применить опи санный выше алгоритм, следует в качестве временной пометки L'sk принять величину макси мального потока, который можно пропустить из N s в N k\ выражение (1 ) следует заме
нить на следующее:
L ’sk' —max[Lsft, min(Lsr, brk)].
В качестве постоянной по метки Lsh следует взять мак симальную из временных пометок L'sh.
Аналогичные изменения в алгоритме следует проводить при решении других задач,
удовлетворяющих условиям (2). Следует отметить, что утвержде ние (2 ) является достаточным (но не необходимым) условием при
менимости описанного выше алгоритма.
В заключение параграфа рассмотрим одно интересное и не совсем очевидное приложение задачи о кратчайшей цепи, а именно задачу нахождения минимального разреза в (s, ^-плоской сети [64].
Сеть называется плоской, если ее можно начертить на плоско сти так, чтобы все ее дуги пересекались только в узлах сети. Неориентированная плоская сеть называется (s, 1)-плоской, если после добавления к ней дуги A st она останется плоской. Напри мер, плоская сеть, изображенная на рис. 1 0 .2 , не является (s, t)-
плоской. Эта же сеть, но без дуги А 23, уже будет (s, ^-плоской. Рассмотрим (s, г)-плоскую сеть, которая получится, если из сети на рис. 10.2 удалить дугу А 23. Пусть числа рядом с дугами
10.1. КРАТЧАЙШИЕ ЦЕПИ |
197 |
выражают их пропускные способности. Требуется найти мини мальный разрез, отделяющий узлы N s и N t.
Эта задача, конечно, может быть решена посредством нахож дения максимального потока с помощью метода расстановки поме ток. Но оказывается, ее можно решить проще: минимальный раз рез в исходной сети соответствует кратчайшей цепи в сети, двой ственной к ней х).
Двойственная сеть строится следующим образом. Сначала чер тится дуга A st, если Bi исходной сети этой дуги не было. Получится
плоская сеть с п узлами. Плоскость чертежа окажется раз деленной на грани (области, ограниченные ребрами и не содержа щие внутри себя ни вершин, ни ребер). Дуга A st будет разделять две грани, одна из которых является внешней. Поместим по одно му узлу в каждую из этих граней и обозначим их через N's и N t’. Аналогично, поместим по одному узлу в каждую из граней, раз деленных дугой A tj, и обозначим их через N\ и N ]. Проведем в двойственной сети дуги Ац, которые связывают узлы N\ и Nj.
*) Задача нахождения максимального потока в (s, г)-плоской сети проще, чем в общем случае, и эффективно решается (за О (п2) действий) без использования двойственной сети (см. [64], стр. 399).
Алгоритм поиска кратчайшей цепи в двойственной сети будет не сложнее (по числу действий) алгоритма нахождения максимального потока в исход ной сети, если число узлов в двойственной сети не превышает (по порядку) числа узлов в исходной цепи. Это действительно так: число узлов в двой ственной сети равно числу граней / в исходной сети, а в плоской сети / ^ ^ 2п — 4 (см., например, [18*]).— Прим, перев.
198 ГЛ. 10. КРАТЧАЙШИЕ ЦЕПИ И ПОТОКИ МИНИМАЛЬНОЙ СТОИМОСТИ
Каждой дуге A tj исходной сети будет соответствовать дуга А\} двойственной сети. Каждому разрезу, разделяющему N s и N t в исходной сети, будет соответствовать некоторая цепь из N's в N't. Положим, что пропускная способность btj дуги A tj равна длине dtj дуги A'ij. В этом случае кратчайшая цепь из N's в Nt будет соответствовать минимальному разрезу, разделяющему N s и N t. Рис. 10.3 иллюстрирует описанное построение.
10.2. Многополюсные кратчайшие цепи (Флойд [63], Ху [111], Мерчленд [158], Уоршелл [209J)
В этом параграфе рассматривается задача нахождения крат чайших цепей между всеми парами узлов сети. Предполагается, как и в § 1 0 .1 , что длины йц могут не удовлетворять неравенству
треугольника и условию симметричности. В отличие от § 10.1
теперь величины dtj могут быть и отрицательными. При этом делается предположение менее ограничительное, чем условие da ^ 0 : сумма длин дуг по любому направленному циклу должна
быть неотрицательна (иначе понятие кратчайшей цепи теряет смысл). Заметим, что для любой неориентированной дуги A iS последнее предположение не менее ограничительно: из него сле дует, что dt] ^ 0 (поскольку неориентированную дугу можно рас
сматривать как пару противоположно направленных дуг, каждая из которых имеет ту же длину, что и исходная неориентированная
Дуга).
Как отмечалось в § 10.1, задача оказалась бы тривиальной, если бы выполнялось неравенство треугольника dtj + djk ^ dth; в этом случае кратчайшей цепью между произвольной парой узлов 7V, и N j была бы сама дуга Ац. В произвольной сети лишь некото рые дуги А и являются кратчайшими цепями из N t в Np, такие дуги будем называть базисными. Заметим, что в § 10.1 все дуги дерева были базисными (обратное неверно).
Предположим, что известна кратчайшая цепь, скажем, из узла N p в узел N q. Тогда эта цепь должна состоять только из базисных дуг, в противном случае она не будет кратчайшей. Если теперь
ввести |
дугу A pq |
с длиной, |
равной |
длине |
рассматриваемой цепи |
из N p |
в N q, то |
эта дуга |
А РЧ будет базисной. |
||
Задачу нахождения кратчайших |
цепей |
между всеми парами |
узлов можно решить, добавив базисные дуги (если таких дуг в сети не было) между всеми парами узлов. При добавлении базисной дуги ей ставится в соответствие длина, равная длине кратчайшей цепи, состоящей из базисных дуг исходной сети.
Рассмотрим следующую операцию, определенную для фикси
рованного узла N р. |
|
dik: = m in(dih, dtj + dJh) (для всех 1 ф к ф ] ) . |
(1 ) |
Эту операцию будем называть тернарной. |
|