Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тезисы по философии-2.1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.11 Mб
Скачать

4. Потоковые алгоритмы

4.1. Определения

Поток определяет способ пересылки некоторых объектов из одного пункта в другой. Потоки возникают, например, при транспортировке продукции от завода до распределительного склада, при движении людей от мест проживания к местам работы, при доставке писем от отправителей к получателям. При всём разнообразии ситуаций, связанных с потоками, проблемы, возникающие при этом, общие. Как то: максимизация суммарного объёма перевозки в некоторой системе из одной точки в другую; минимизация стоимости пересылки через некоторую систему определённого количества предметов из одной точки в другую; минимизация времени перевозок в данной системе.

Применительно к графам поток задает способ пересылки некоторых объектов из одной вершины графа в другую по его дугам. Перемещение по дуге осуществляется в заданном на ней направлении. Вершина, из которой начинается перемещение объектов, называется источником и обозначается s. Вершина, в которой заканчивается перемещение объектов, называется стоком и обозначается t. Объекты, которые перемещаются (или “протекают”) из источника в сток, называются единицами потока или просто единицами. Если количество единиц потока, которое может проходить по дуге (x,y), ограничено, то говорят, что дуга (x,y) имеет ограниченную пропускную способность, обозначается она с(х,у). Через а(х,у) будем обозначать стоимость перемещения единицы потока по дуге (х,у). Граф, в котором каждой дуге приписана некоторая пропускная способность, часто называют сетью.

Предположим, что имеется граф, в котором некоторое количество единиц потока проходит от источника к стоку, и для каждой единицы потока известен маршрут движения. Количество единиц, проходящих по дуге (x,y), называется потоком в данной дуге и обозначается f(x,y). Очевидно, что 0 ≤ f(x,y) ≤ с(х,у).

Дуги графа можно отнести к трём различным категориям:

а) дуги, в которых поток не может ни увеличиваться, ни уменьшаться;

б) дуги, в которых поток может увеличиваться;

в) дуги, в которых поток может уменьшаться.

Множество дуг категории “а” обозначается через N. Множеству N принадлежат, например, дуги, имеющие нулевую пропускную способность или значительную стоимость прохождения потока. Множество дуг категории “б” обозначается через I. Множеству I принадлежат дуги, в которых протекающий поток меньше пропускной способности дуги. Множество дуг категории “в” обозначается через R. Множеству R принадлежат дуги, по которым протекает некоторый поток. Дуги множества I называются увеличивающими, множества Rуменьшающими, а множества  – промежуточными.

Обозначим: i(x,y) – максимальная величина, на которую может быть увеличен поток в дуге (x,y); r(x,y) – максимальная величина, на которую может быть уменьшен поток в дуге (x,y). Очевидно, что   i(x,y) = с(х,у) – f(x,y),  r(x,y) =  f(x,y).

4.2. Алгоритм поиска увеличивающей цепи

Предположим, что мы хотим переслать дополнительные единицы потока из источника в сток. Достичь этого можно тремя способами (если такая возможность вообще существует):

1) Найти путь из источника s в сток t, состоящий из увеличивающих дуг (рис. 4.1).

Рис. 4.1.

Поскольку i(x,y) – максимальная величина, на которую может быть увеличен поток в дуге (x,y), то величина дополнительного потока из вершины s в вершину t не превосходит минимального из значений i(x,y) для дуг указанного пути. То есть из s в t можно переслать дополнительно одну единицу потока.

2) Найти путь из стока t в источник s, состоящий из уменьшающих дуг (рис. 4.2).

Рис. 4.2.

Поскольку r(x,y) – максимальная величина, на которую может быть уменьшен поток в дуге (x,y), то максимальное уменьшение потока из вершины t в вершину s не превосходит минимального из значений r (x,y) для дуг указанного пути. Значит, поток из вершины t в вершину s в указанном пути можно уменьшить только на одну единицу и тем самым на одну единицу увеличить поток из вершины s в вершину t.

3) Найти цепь, соединяющую источник s и сток t, в которой все прямые дуги, имеющие направление из источника в сток, – увеличивающие, а все обратные, имеющие направление из стока в источник, – уменьшающие (рис. 4.3).

Рис. 4.3.

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

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

Процедура алгоритма поиска увеличивающей цепи

Шаг 1. Определить состав множеств N, I, R. Дуги множества N исключить из дальнейшего рассмотрения. Окрасить вершину s.

Шаг 2. Окрашивать дуги и вершины по следующему правилу: при окрашенной вершине х, если , окрасить неокрашенную вершину у и дугу , если , окрасить неокрашенную вершину у и дугу , в других случаях вершину у и соответствующую дугу не окрашивать.

Окрашивать дуги и вершины до тех пор, пока либо не будет окрашена вершина t, либо окраска новых вершин станет невозможна.

Если по окончании процедуры вершина t окрашена, значит, в сети найдена увеличивающая цепь – единственная цепь из s в t, состоящая из окрашенных дуг. В противном случае в сети отсутствуют увеличивающие цепи из s в t.

Пример. Найти увеличивающую цепь из вершины s в вершину t на графе, изображённом на рис. 4.4.

Рис. 4.4.

Буквы N, I, R, приписанные дугам, указывают принадлежность дуг соответствующим множествам.

Результат окрашивания вершин и дуг графа на втором шаге алгоритма поиска увеличивающей цепи приводится в таблице:

Вершины, из которых производится окрашивание

Окрашенные вершины

Окрашенные дуги

s

s

b

(s,b)

b

a

(a,b)

a

c

(a,c)

c

d

(c,d)

e

(c,e)

d

e

t

(e,t)

На этом процедура окрашивания заканчивается, поскольку окрашена вершина t, а значит, найдена увеличивающая цепь из вершины s в вершину t. Восстановление полученной цепи осуществляется в обратном порядке: вершина t была окрашена из вершины e по дуге (e,t), вершина e была окрашена из вершины c по дуге (c,e), и т.д. Таким образом, найдена следующая увеличивающая цепь из вершины s в вершину t:

(s,b), (a,b), (a,c), (c,e), (e,t),

причём, все дуги этой цепи, кроме (a,b), – прямые, (a,b) – обратная.

Обоснование алгоритма поиска увеличивающей цепи

Докажем три утверждения:

1) Если в алгоритме вершина t окрашена, то в исходной сети действительно имеется увеличивающая цепь из s в t.

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

3) Выполнение алгоритма завершается за конечное число шагов.

Доказательство утверждения 1. В силу правил окрашивания окрашенные дуги не могут образовывать циклы, т.е. в результате будет получено дерево из окрашенных дуг, включающее вершину s. Если при этом дерево включает и вершину t, то найдётся цепь, ведущая из s в t, и она будет увеличивающей, т.к. процедура алгоритма гарантирует, что прямые дуги этой цепи – увеличивающие, а обратные – уменьшающие.

Доказательство утверждения 2. Если имеется увеличивающая цепь С из s в t, то каждая из вершин цепи С окрашена, в том числе и вершина t. Если t не может быть окрашена, то не существует ни одной увеличивающие поток цепи из s в t.

Доказательство утверждения 3. Вершины и дуги могут окрашиваться только по одному разу, а их конечное число.

.3. Алгоритм поиска максимального потока

Задача о максимальном потоке состоит в поиске способа пересылки максимально возможного количества единиц потока из источника в сток без превышения пропускных способностей дуг исходной сети. Алгоритм решения этой задачи принадлежит Форду и Фалкерсону.

Для любого потока из источника s в сток t

  • количество единиц потока, выходящих из любой вершины х (x ≠ s, x ≠ t), должно быть равно количеству единиц потока, входящих в эту вершину, т.е.

;                                                                 (1)

  • количество единиц потока, проходящих по дуге, не должно превышать пропускной способности этой дуги:

;                                                                              (2)

  • суммарное количество единиц потока v, выходящих из источника, должно быть равно суммарному числу единиц потока, входящих в сток:

                                                                                         (3)

.                                                                                           (4)

Любой поток из источника s в сток t должен удовлетворять условиям (1) – (4). И наоборот, если задан (или найден) набор величин f(x,y), (x,y)   A, для которого выполняются эти четыре условия, то такой набор представляет собой поток из источника s в сток t.

Процедура алгоритма поиска максимального потока

Шаг 1. Выбрать любой начальный поток из вершины s в вершину t, т.е. любой набор величин f(x,y), удовлетворяющий (1) – (4). (Можно положить f(x,y) = 0, (x,y)   A.)

Шаг 2. Для всех дуг проделать следующее. Если f(x,y) < c(x,y), то положить i(x,y) = c(x,y) – f(x,y) и считать дугу (x,y) I. Если f(x,y) > 0, то положить r(x,y) = f(x,y) и считать (x,y)   R.

Шаг 3. На множествах I и R, сформированных на шаге 2, применить к исходному графу алгоритм поиска увеличивающей цепи (см. разд. 4.2). Если при этом увеличивающую поток цепь найти не удаётся, закончить процедуру алгоритма: текущий поток является максимальным. В противном случае – осуществить максимально возможное увеличение потока вдоль найденной увеличивающей цепи и перейти на шаг 2.

Пример. Найти максимальный поток из источника s в сток t на графе, изображённом на рис. 4.5.

Рис. 4.5.

Задаём начальный поток из вершины s в вершину t нулевым. Определяем для каждой дуги значения величин i(x,y) и r(x,y), т.е. принадлежность множествам I и R.

Формируем основную таблицу, строки которой соответствуют дугам графа. Первый столбец содержит начальные значения величин f(x,y) i(x,y) и r(x,y) для каждой дуги.

f(x,y),i(x,y),r(x,y)

(s,a)

0,  7,  0

(s,c)

0,  4,  0

(s,d)

0,  3,  0

(a,b)

0,  5,  0

(b,c)

0,  4,  0

(b,e)

0,  2,  0

(d,e)

0,  5,  0

(d,f)

0,  2,  0

(e,g)

0,  3,  0

(f,t)

0,  4,  0

(g,t)

0,  7,  0

(t,g)

0,  3,  0

Применим к графу алгоритм поиска увеличивающей цепи, результат работы которого приведён в следующей вспомогательной таблице:

Вершины, из которых производится окрашивание

Окрашенные вершины

Окрашенные дуги

s

s

a

(s,a)

c

(s,c)

d

(s,d)

i(s,d)=3

a

b

(a,b)

c

d

e

(d,e)

f

(d,f)

i(d,f)=2

b

e

g

(e,g)

f

t

(f,t)

i(f,t)=4

Найдена увеличивающая цепь (s,d), (d,f), (f,t), по которой можно переслать из вершины s в вершину t дополнительно 2 единицы потока. В основной таблице появляется второй столбец со значениями величин f(x,y) i(x,y) и r(x,y) для каждой дуги после 1-й итерации алгоритма.

f(x,y),i(x,y),r(x,y)

f(x,y),i(x,y),r(x,y)

(s,a)

0,  7,  0

0,  7,  0

(s,c)

0,  4,  0

0,  4,  0

(s,d)

0,  3,  0

2,  1,  2

(a,b)

0,  5,  0

0,  5,  0

(b,c)

0,  4,  0

0,  4,  0

(b,e)

0,  2,  0

0,  2,  0

(d,e)

0,  5,  0

0,  5,  0

(d,f)

0,  2,  0

2,  0,  2

(e,g)

0,  3,  0

0,  3,  0

(f,t)

0,  4,  0

2,  2,  2

(g,t)

0,  7,  0

0,  7,  0

(t,g)

0,  3,  0

0,  3,  0

Снова применим к графу алгоритм поиска увеличивающей цепи, результат работы которого приведён во второй вспомогательной таблице:

Вершины, из которых производится окрашивание

Окрашенные вершины

Окрашенные дуги

s

s

a

(s,a)

c

(s,c)

d

(s,d)

i(s,d)=1

a

b

(a,b)

c

d

e

(d,e)

i(d,e)=5

b

e

g

(e,g)

i(e,g)=3

g

f

(g,f)

i(g,f)=7

f

t

(f,t)

i(f,t)=2

Найдена увеличивающая цепь (s,d), (d,e), (e,g), (g,f), (f,t), по которой можно переслать из вершины s в вершину t дополнительно 1 единицу потока. В основной таблице появляется третий столбец со значениями величин f(x,y) i(x,y) и r(x,y) для каждой дуги после 2-й итерации алгоритма.

f(x,y),i(x,y),r(x,y)

f(x,y),i(x,y),r(x,y)

f(x,y),i(x,y),r(x,y)

(s,a)

0,  7,  0

0,  7,  0

0,  7,  0

(s,c)

0,  4,  0

0,  4,  0

0,  4,  0

(s,d)

0,  3,  0

2,  1,  2

3,  0,  3

(a,b)

0,  5,  0

0,  5,  0

0,  5,  0

(b,c)

0,  4,  0

0,  4,  0

0,  4,  0

(b,e)

0,  2,  0

0,  2,  0

0,  2,  0

(d,e)

0,  5,  0

0,  5,  0

1,  4,  1

(d,f)

0,  2,  0

2,  0,  2

2,  0,  2

(e,g)

0,  3,  0

0,  3,  0

1,  2,  1

(f,t)

0,  4,  0

2,  2,  2

3,  1,  3

(g,t)

0,  7,  0

0,  7,  0

1,  6,  1

(t,g)

0,  3,  0

0,  3,  0

0,  3,  0

Ещё раз применим к графу алгоритм поиска увеличивающей цепи, результат работы которого приведён в третьей вспомогательной таблице:

Вершины, из которых производится окрашивание

Окрашенные вершины

Окрашенные дуги

s

s

a

(s,a)

i(s,a)=7

c

(s,c)

a

b

(a,b)

i(a,b)=5

c

b

e

(b,e)

i(b,e)=2

e

g

(e,g)

i(e,g)=2

g

f

(g,f)

i(g,f)=6

f

t

(f,t)

i(f,t)=1

Найдена увеличивающая цепь (s,a), (a,b), (b,e), (e,g), (g,f), (f,t), по которой можно переслать из вершины s в вершину t дополнительно 1 единицу потока. В основной таблице появляется четвёртый столбец со значениями величин f(x,y) i(x,y) и r(x,y) для каждой дуги после 3-й итерации алгоритма.

f(x,y),i(x,y),r(x,y)

f(x,y),i(x,y),r(x,y)

f(x,y),i(x,y),r(x,y)

f(x,y),i(x,y),r(x,y)

(s,a)

0,  7,  0

0,  7,  0

0,  7,  0

1,  6,  1

(s,c)

0,  4,  0

0,  4,  0

0,  4,  0

0,  4,  0

(s,d)

0,  3,  0

2,  1,  2

3,  0,  3

3,  0,  3

(a,b)

0,  5,  0

0,  5,  0

0,  5,  0

1,  4,  1

(b,c)

0,  4,  0

0,  4,  0

0,  4,  0

0,  4,  0

(b,e)

0,  2,  0

0,  2,  0

0,  2,  0

1,  1,  1

(d,e)

0,  5,  0

0,  5,  0

1,  4,  1

1,  4,  1

(d,f)

0,  2,  0

2,  0,  2

2,  0,  2

2,  0,  2

(e,g)

0,  3,  0

0,  3,  0

1,  2,  1

2,  1,  2

(f,t)

0,  4,  0

2,  2,  2

3,  1,  3

4,  0,  4

(g,t)

0,  7,  0

0,  7,  0

1,  6,  1

2,  5,  2

(t,g)

0,  3,  0

0,  3,  0

0,  3,  0

0,  3,  0

Снова применим к графу алгоритм поиска увеличивающей цепи, результат работы которого приведён в четвёртой вспомогательной таблице:

Вершины, из которых производится окрашивание

Окрашенные вершины

Окрашенные дуги

s

s

a

(s,a)

c

(s,c)

a

b

(a,b)

c

b

e

(b,e)

e

g

(e,g)

d

(d,e)

g

f

(g,f)

d

f

Увеличивающую цепь найти не удалось, поэтому процедура алгоритма закончена. Максимальный поток из вершины s в вершину t для графа, изображённого на рис. 4.5, зафиксирован в последнем столбце основной таблицы.

Обоснование алгоритма поиска максимального потока

Докажем три утверждения:

1. Алгоритм действительно формирует некоторый поток.

2. Сформированный поток – максимальный.

3. Выполнение алгоритма завершается за конечное число шагов.

Доказательство утверждения 1. Работа алгоритма начинается с рассмотрения некоторого потока. В процессе работы алгоритма при увеличении потока вдоль соответствующей цепи условия (1)–(4) не нарушаются. Следовательно, по окончании алгоритма получен поток из источника s в сток t.

Множество дуг, исключение которых из графа увеличивает число его компонентов связности, называется разрезом. Разрез, который не содержит в качестве собственного подмножества никакого другого разреза, называется простым разрезом.

Любой граф можно рассматривать как некоторую совокупность связных графов. Каждый из этих графов называется компонентом связности исходного графа.

Граф называется связным, если в нем для каждой пары вершин найдется соединяющая их цепь.

Доказательство утверждения 2. Рассмотрим любой простой разрез, отделяющий источник от стока (они оказываются в разных компонентах связности). Обозначим множество вершин компоненты источника Xs, а множество вершин компоненты стока Xt. Каждая дуга разреза либо а) имеет начальную вершину в Xs, а конечную в Xt, либо б) наоборот. Сумма пропускных способностей дуг “а” есть пропускная способность разреза. Поскольку через разрез должны пройти все единицы потока, то, в общем случае, максимальная величина потока из s в t не больше наименьшей величины пропускных способностей разрезов из s в t. Таким образом, чтобы показать, что в алгоритме действительно определяется максимальный поток, достаточно найти разрез, отделяющий s от t, пропускная способность которого равна величине потока, полученного алгоритмом. Алгоритм заканчивает работу, когда при последнем обращении к процедуре поиска увеличивающей цепи завершить процесс не удаётся, при этом вершина s окрашена, а вершина t нет. Рассмотрим разрез, состоящий из дуг, одна концевая вершина которых окрашена, а другая нет. В каждой дуге с окрашенной начальной вершиной и неокрашенной конечной поток равен пропускной способности этой дуги, иначе и конечная вершина была бы окрашена. В каждой дуге с окрашенной конечной вершиной и неокрашенной начальной поток отсутствует, иначе была бы окрашена и начальная. Каждая единица потока должна пройти через разрез по крайней мере один раз.  Но т.к. в дугах “б” разреза поток отсутствует, то через данный разрез каждая единица потока проходит ровно один раз. Поэтому общее количество единиц потока, прошедших через разрез от s к t, в точности равно величине его пропускной способности.

Доказательство утверждения 3. Предположим, что пропускные способности всех дуг и значения начального потока в дугах целочисленные. Рассмотренный алгоритм не завершится за конечное число шагов лишь в случае формирования неограниченного количества увеличивающих цепей. Но при формировании такой цепи значение v полного потока из s в t возрастает на целую положительную величину, а v ограничена сверху пропускной способностью любо разреза, отделяющего s от t. Следовательно, возможно лишь конечное число увеличений потока.

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

Модификация алгоритма поиска максимального потока при нескольких источниках и стоках

Пусть в графе присутствуют n источников  s1, s2,…, sn  и  m стоков t1, t2,…, tm. Чтобы решить задачу о максимальном потоке на таком графе, можно воспользоваться алгоритмом поиска максимального потока для графа с одним источником и одним стоком. Но предварительно необходимо ввести две новые вершины – дополнительный источник S и дополнительный сток T. Затем соединить источник S с каждым из источников s1, s2,…, sn  дугами  (S, s1), (S, s2),…, (S, sn). Каждый из стоков  t1, t2,…, tm соединить со стоком T дугами (t1, T), (t2, T),…, (tm, T). Пропускную способность каждой добавленной дуги считать неограниченной.

Например, для графа с рис. 4.6 расширенный граф изображён на рис. 4.7.

Рис. 4.6.

Рис. 4.7.

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