Раздел 3. Потоки в сетях и родственные задачи

 

Потоки в сетях

 

Полный поток в транспортной сети

 

Теория транспортных сетей возникла при решении задач, связанных с организацией перевозки грузов. Тем не менее понятие потока на транспортной сети, алгоритм нахождения потока наибольшей величины и критерий существования потока, насыщающего выходные дуги сети, оказались полезными для многих других прикладных и теоретических вопросов комбинаторного характера.

Введем основные понятия данной теории.

Транспортной сетью называется орграф D = (V,X) с множеством вершин V = {v1,…,vn}, для которого выполняются условия:

1) существует одна и только одна вершина v1, называемая источником, такая, что Г-1 (v1) = Æ (т.е. ни одна дуга не заходит в v1),

2) существует одна и только одна вершина vn, называемая стоком, такая, что Г(vn) = Æ (т.е. из vn не исходит ни одной дуги),

3) каждой дуге xÎX поставлено в соответствие целое число c (x) ³ 0, называемое пропускной способностью дуги.

Функция j(x), определенная на множестве X дуг транспортной сети D и принимающая целочисленные значения, называется допустимым потоком (или просто потоком) в транспортной сети D, если

1) для любой дуги xÎX величина j(x), называемая потоком по дуге x, удовлетворяет условию 0 £ j(x) £ c(x),

2) для любой промежуточной вершины v сумма потоков по дугам, заходящим в v, равна сумме потоков по дугам, исходящим из v.

Величиной потока j в транспортной сети D называется величина, равная сумме потоков по всем дугам, заходящим в сток, или, что то же самое сумме потоков по всем дугам, исходящим из источника.

Дуга xÎX называется насыщенной, если поток по ней равен ее пропускной способности. Поток j называется полным, если любой путь в сети из источника в сток содержит, по крайней мере, одну насыщенную дугу.

 

А л г о р и т м

построения полного потока в сети

 

Данные: транспортная сеть D, заданная матрицей пропускных способностей дуг.

Результат: полный поток в сети.

1) Полагаем для любой дуги xÎХ j(x) = 0 (начинаем с нулевого потока).

2) Полагаем D* = D.

3) Удаляем из орграфа D* все дуги, являющиеся насыщенными при потоке j в транспортной сети D. Полученный орграф снова обозначим через D*.

4) Ищем в D* простую цепь m из v1 в vn. Если такой цепи нет, то j - искомый полный поток в транспортной сети D. В противном случае переходим к шагу 5.

5) Увеличиваем поток j(x) по каждой дуге x из m на одинаковую величину a>0 такую, что, по крайней мере, одна дуга из m окажется насыщенной, а потоки по всем остальным дугам из m не превышают их пропускных способностей. При этом величина потока j также увеличится на a, а сам поток j в транспортной сети D остается допустимым. После этого перейдем к шагу 3.

 

Максимальный поток

 

Поток j называется максимальным, если его величина принимает максимальное значение по сравнению с другими допустимыми потоками в транспортной сети D. Максимальный поток всегда является полным (обратное, вообще говоря, неверно).

Введем для заданной транспортной сети D и допустимого потока j в этой сети орграф приращений I(D,j), имеющий те же вершины, что и сеть D. Каждой дуге x = (v,w) Î X транспортной сети D в орграфе приращений I(D, j) соответствуют две дуги: x и x* = (w,v) – дуга, противоположная по направлению дуге x. Припишем дугам x и x* орграфа приращений I(D, j) длину l:

 

 

0, если j(x) < c(x),

l(x) =

¥, если j(x) = c(x),

0, если j(x) > 0,

l(x*) =

¥, если j(x) = 0.

 

А л г о р и т м

построения максимального потока

 

Данные: транспортная сеть D, заданная матрицей пропускных способностей дуг.

Результат: максимальный поток в сети.

1) Полагаем i = 0. Пусть j0 – любой допустимый поток в транспортной сети D (например, полный или нулевой).

2) По сети D и потоку ji строим орграф приращений I(D, ji).

3) Находим простую цепь mi, являющуюся минимальным путем из v1 в vn в нагруженном орграфе I(D, ji) (можно использовать любой описанный выше алгоритм). Если длина этой цепи равна ¥, то поток ji максимален и работа алгоритма заканчивается. В противном случае увеличиваем поток вдоль цепи mi на максимально допустимую величину ai > 0, где aiÎZ (прибавляя ее для каждой дуги xÎX, через которую проходит цепь mi, к уже имеющейся величине потока по дуге x, если дуга x входит в mi, и вычитая, если дуга x* входит в mi), такую, что при этом сохраняется условие допустимого потока. В результате меняется поток в транспортной сети D, т.е. от потока ji переходим к потоку ji+1, который является допустимым, и при этом величина его увеличивается на ai. Присваиваем i = i + 1 и переходим к шагу 2.

 

Алгоритм меток для нахождения максимального потока

 

Рассмотрим другой алгоритм построения максимального потока в транспортной сети, использующий метки вершин.

 

Помечивающий алгоритм Форда – Фалкерсона

для нахождения максимального потока

 

Данные: транспортная сеть D, заданная матрицей пропускных способностей дуг.

Результат: максимальный поток в сети.

 

1) Построить произвольный поток φ на транспортной сети D (например, положить φ(u) = 0 для любой дуги u).

2) Просмотреть пути, соединяющие вход сети v1 с выходом vn. Если поток φ полный, то перейти к п.4.

3) В противном случае рассмотреть путь μ, соединяющий вход сети v1 с выходом vn, все дуги которого не насыщены. Построить новый поток φ´:

где . Повторить этот процесс до получения

полного потока φ.

4) Присвоить целочисленные метки вершинам сети D и знаки «+» или «-» дугам по правилам:

· входу v1 присвоить метку 0,

· если вершина vi получила некоторую метку, а y - еще непомеченная вершина, то вершине y Гvi, такой что φ((vi,y))<c((vi,y)) присвоить метку i, а дуге (vi,y) – знак «+»; вершине y Г-1vi, такой, что φ((y,vi))>0, присвоить метку i, а дуге (y,vi) – «-». Остальные непомеченные вершины и дуги метки и знаки не получают;

· повторять процесс, описанный в предыдущем пункте до тех пор, пока не прекратится появление новых отмеченных вершин и дуг. Если в результате выполнения этого пункта вершина vn не получит метки, то поток является максимальным. В противном случае перейти к п.5.

5) Рассмотреть последовательность отмеченных вершин λ=(vn, vi1, vi2,…,v1), каждая из которых имеет метку, равную номеру последующей вершины, и последовательность μ (не обязательно путь), соединяющих последовательные вершины из λ. Построить новый поток φ´:

Перейти к пункту 4.

Пример. Рассмотрим транспортную сеть D и полный поток φ, для которого = 14:

2 (1,+)

7(8) 7(7)

 

0(1,+) 5 (3,-) 6 (4,+)

1 4(5) 3 6(7) 1(1)

 
 

 


3(3) 10(10) 0(3) 13(15)

 

4 (5,+) Рис. 1.

 

Присвоим вершине 1 метку 0, тогда вершине 2 присвоим метку (1,+), т.к. φ((1,2))<c((1,2)). Т.к. φ((2,5))=c((2,5)), то переходим к вершине 3, которой присвоим метку (1,+), затем вершине 5 – (3,-), вершине 4 – (5,+), вершине 6 – метку (4,+). Рассмотрим последовательность вершин λ=(6,4,5,2,1), и построим новый поток, величина которого равна 15.

 

2 (1,+)

7(8) 7(7)

 

0 5 6

1 5 (5) 3 5(7) 1(1)

 


3(3) 10(10) 1(3) 14(15)

 

4 Рис. 2.

Нетрудно заметить, что улучшить данный поток нельзя.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: