Файл: Ху, Т. Целочисленное программирование и потоки в сетях.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 )

Эту операцию будем называть тернарной.