Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Teoria_igr_i_issled_operatsy.doc
Скачиваний:
170
Добавлен:
07.06.2015
Размер:
5.21 Mб
Скачать

7.2. Задача о максимальном потоке в сети.

Пусть задан ориентированный граф G=E,V,H, в котором направление каждой дугиvVозначает направление движения потока (например, поток автомобилей), пропускная способность каждой дуги равнаdv. На множестве вершинEвыделены две вершиныник. Вершинанявляется источником потока,к– стоком. Требуется определить максимальный поток, который может быть пропущен из вершинынвк.

Обозначим через xvвеличину потока, движущегося по дугеv. Очевидно, что

0 xv dv , vV

(7.13)

В каждой вершине iE\{н,к} объем потока входящего равен объему потока выходящего, т.е. справедливо равенство

или

(7.14)

Соответственно для вершин н ик выполняется

(7.15)

(7.16)

Величина Qявляется величиной потока, который выходит из вершиныни входит в вершинук.

Задача. Определить

Q max

(77.5)

при ограничениях (7.13) – (7.16).

Величины (Q, xv ,vV) удовлетворяющие ограничениям (7.13) – (7.16) будем называть потоком в сети, и если они максимизируют величинуQ, то максимальным потоком. Нетрудно видеть, что значенияQ=0, xv=0, vV, являются потоком в сети. Задача (7.13) – (7.16) является задачей линейного программирования и ее можно решить алгоритмами симплекс-метода.

Разобьем множество вершины Eна две непересекающиеся частиE1иE2таким образом, чтобынE1, кE2. РазрезомR(E1,E2), разделяющимникбудем называть множествоR(E1,E2)V такое, что для каждой дугиvR(E1,E2) либоh1(v)E1 иh2(v)E2, либоh1(v)E2 иh2(v)E1. Так на следующем рисунке множествоE1={1,4,7}, эти вершины имеют темную заливку.E2={2,3,5,6,8,9}. РазрезомR(E1,E2) являются дуги, через которые прошла пунктирная линия.

Разобьем множество R(E1,E2) на две части следующим образом:

R+(E1,E2)={vR(E1,E2)| h1(v)E1 и h2(v)E2}

R(E1,E2)={vR(E1,E2)| h2(v)E1 и h1(v)E2}

Элементы множества R+(E1,E2) будем называть прямыми дугами, они ведут из множестваE1, вE2. Элементы множестваR(E1,E2) – обратными дугами, они ведут из множестваE2, вE1. Потоком через разрез будем называть величину

.

Пропускной способностью разреза будем называть величину

.

Очевидно, что 0X(E1,E2)D(E1,E2).

Справедлива следующая теорема.

Теорема 1. (О максимальном потоке и минимальном разрезе).

В любой сети величина максимального потока Qиз источника нв стоккравна минимальной пропускной способностиD(E1,E2) среди всех разрезовR(E1,E2), разделяющих вершиныник.

Разрез , на которомQ=, будем называтьограничивающим. На ограничивающем разрезе выполняется

Пусть (Q,xv,vV)некоторый поток в сети, и последовательность н=i0v1i1 v2i2,...,vKiK=к, является цепью, соединяющих вершиныник. Зададим на этой цепи направление движения от вершинынкк. Дугаvjиз этой цепи называется прямой, если ее направление совпадает с направлением движения отнкк, и обратной в противном случае. Эту цепь будем называтьцепью увеличения потока, если для прямых дугvцепи (dvxv)>0 и для обратныхxv>0. По этой цепи можно пропустить дополнительный потокqизнкквеличинойq=min(q1,q2), гдеq1=min(dv– xv), минимум берется по всем прямым дугам цепи, q2=min(xv), минимум берется по всем обратным дугам цепи.

Теорема 2. Поток (Q, xv,vV), максимальный тогда и только тогда, когда не существует пути увеличения потока.

Предлагаемый алгоритм решения задачи о максимальном потоке в сети основан на поиске цепи увеличения потока из нвк. Этот поиск в свою очередь основан на процессе расстановки пометок вершин, аналогичный алгоритму Дейкстры.

Каждой вершине iприпишем пометкуPi=[gi,vi,], гдеgi– величина дополнительного потока, поступившего в вершинуi,vi – дуга, по которой поступил поток, – знак «+», если поток поступил по дугеvi , направленной вi (по прямой дуге; – знак «–», если поток поступил по дугеvi , направленной отi (по обратной дуге),

Будем говорить, что вершина i

1. Не помечена, если до нее не дошел дополнительный поток. Эта пометка будет иметь вид Pi=[0,–,],

2. Помечена, но не просмотрена, если до нее поток дошел, но не пропущен дальше, пометка будет иметь вид Pi=[gi,vi,], гдеgi>0.

3. Помечена и просмотрена, если до нее поток дошел и пропущен дальше, пометка будет иметь вид .

Алгоритм.

П.0. Для всехvVполагаемxv=0, полагаем Q=0.

П.1. Все вершины делаем непомеченными. Вершинунделаем помеченной, но не просмотренной с пометкойPн=[,–,–]. Это означает, что в эту вершину поступает поток неограниченного объема.

П.2. Ищем помеченную, но не просмотренную вершину. Если такой нет, то найденный потокQ,xv,vV, максимальный и алгоритм заканчивает работу. Если такая вершина нашлась,i– ее номер, то переходим к П.3.

П.3 (просмотр вершиныi).

a) для всехвыполнить:

           положить j=h2(v),

           если вершина jне помечена и (dvxv)>0, то пометить ее с пометкойPj=[q,v,+], гдеq=min(qi, (dvxv)), еслиj=к, то перерейти к П4;

b) для всехвыполнить:

           положить j=h1(v),

           если вершина jне помечена иxv>0, то пометить ее с пометкойPj=[q,v,–], гдеq=min(qi xv), еслиj=к, то перерейти к П4;

c) пометить вершинуiкак просмотреннуюи перейти к П.2.

П.4(пропуск дополнительного потока).

d) Положитьj=к,q=gк;

e) Положитьv=vj ,

     если =«+», то выполнить: {положить xv=xv+q,i=h1(v), еслиi=н, то перейти к П.1, иначе положитьj=iи перейти кe) }

     если =«–», то выполнить: {положить xv=xvq,i=h2(v), еслиi=н, то перейти к П.1, иначе положитьj=iи перейти кe) }

В результате выполнения этого алгоритма будет получен поток (Q, xv,vV). Для поиска разреза с минимальной пропускной способностью следует поступить так. На последнем этапе работы алгоритма в П.2 часть вершин будет помечена и просмотрена, эти вершины включим в множество. Разрез будет искомым.

Пример. Для графа, приведенного на следующем рисунке, найти максимальный поток, который будет пропущен из 1–ой вершины в 6–ю. Величины пропускных способностей указаны около дуг.

На нулевом шаге в качестве начального потока может быть взят любой (допустимый). Пусть это будет поток, величины которого в затемненных квадратиках..

Для этого случая Q=4, потоки по дугам приведены в таблице

Дуга

v1

v2

v3

v4

v5

v6

v7

v8

v9

v10

поток

 1

 0

 3

 1

 0

 1

Шаг 1.

вершина

1

2

3

4

5

6

пометка

[,–,]

[0,–,]

[0,–,]

[0,–,]

[0,–,]

[0,–,]

Шаг 2.Просматриваем вершину 1. Выходящие дугиv1,v2,v3, но только дляv2(dv–xv)>0, поэтом вершина 4 получает пометку [2,v2,+]. Входящих дуг нет, поэтому дополнительно помеченных вершин нет. Вершина 1 получается помеченной и просмотренной.

вершина

1

2

3

4

5

6

пометка

[,–,]

[0,–,]

[0,–,]

[2,v2,+]

[0,–,]

[0,–,]

Шаг 3. Помеченная не просмотреная вершина 4, из нее вершина 5 получает пометку [2,v8,+], и вершина 2 получает пометку [1,v4, –]. Вершина 4 получается помеченной и просмотренной.

вершина

1

2

3

4

5

6

пометка

[,–,]

[1,v4,-]

[0,–,]

[2,v2,+]

[2,v8,+]

[0,–,]

Шаг 4. Просматриваем вершину 2. Из нее помечается вершина 6, она получает пометку [1,v6,+].

вершина

1

2

3

4

5

6

пометка

[,–,]

[1,v4,-]

[0,–,]

[2,v2,+]

[2,v8,+]

[1,v6,+]

Эта вершина концевая, поэтому дополнительный поток, который придет в эту вершину q=1. Переходим к восстановлению цепи, по которой может быть пропущен поток и изменению потоков.

Шаг 5 (начало восстановления цепи пропуска дополнительного потока).

Полагаем Q=Q+q=4+1=5.

В вершину 6 дополнительный поток поступил по дуге v6, направление дуги прямое (смотри пометку этой вершины), поэтому полагаем. Поток поступил из вершиныj=h1(v6)=2, переходим к анализу этой вершины.

Шаг 6. В вершину 2 дополнительный поток поступил по дугеv4, направление дуги обратное (смотри пометку вершины 2), поэтому полагаем. Поток поступил из вершиныj=h2(v4)=4, переходим к анализу этой вершины.

Шаг 7. В вершину 4 дополнительный поток поступил по дугеv2, направление дуги прямое, поэтому полагаем. Поток поступил из вершиныj=h1(v2)=1 – начальная вершина, цепь восстановления потока получена, изменения значений потоков вносим в таблицу

Дуга

v1

v2

v3

v4

v5

v6

v7

v8

v9

v10

поток

 1

1

 3

0

3

 0

 1

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

Шаг 1.

вершина

1

2

3

4

5

6

пометка

[,–,]

[0,–,]

[0,–,]

[0,–,]

[0,–,]

[0,–,]

Шаг 2.Просматривая вершину 1,получим

вершина

1

2

3

4

5

6

пометка

[,–,]

[0,–,]

[0,–,]

[1,v2,+]

[0,–,]

[0,–,]

Шаг 3. Просматривая вершину 4 получим

вершина

1

2

3

4

5

6

пометка

[,–,]

[0,–,]

[0,–,]

[1,v2,+]

[1,v8,+]

[0,–,]

Шаг 4. Просматривая вершину5получим

вершина

1

2

3

4

5

6

пометка

[,–,]

[0,–,]

[1,v7,–]

[1,v2,+]

[1,v8,+]

[0,–,]

Шаг 4. Просматривая вершину3получим

вершина

1

2

3

4

5

6

пометка

[,–,]

[0,–,]

[1,v7,–]

[1,v2,+]

[1,v8,+]

[0,–,]

Все вершины, которые были помечены, просмотрены, однако вершина 6 не достигнута. Получен максимальный поток.

Ответ:Q=5, значения потоков по дугам приведены в таблице:

Дуга

v1

v2

v3

v4

v5

v6

v7

v8

v9

v10

поток

 1

1

 3

0

3

 0

 1

Покажем, как можно получить разрез, на котором максимальный поток совпадает с его пропускной способностью. Вершины, просмотренные на шаге 4 образуют множество E1={1,3,4,5},E2=E\E1={2,6}. Выделим на графе вершины изE1={1,3,4,5} толщиной окружности и заливкой

Дуги между выделенными и невыдененными вершинами образуют искомый разрез. На графе они также выделены, и по ним проведена пунктирная линия. Из рисунка видно, что дуга v4разреза обратная, остальные дуги этого разреза прямые. Просчитаем пропускную способность этого разреза и поток по нему . Эти величины совпадают, на прямых дугах поток совпадает с ее пропускной способностью, на обратных дугах поток равен 0.

Рассчитаем пропускную способность некоторого произвольного разреза и поток по нему, например, по разрезу, изображенному на следующем рисунке

D({1,2,3},{4,5,6}=

X({1,2,3},{4,5,6}=,

0X({1,2,3},{4,5,6}D({1,2,3},{4,5,6}. Можно показать (это следует из условия сохранения потока в вершинах), что величина потока не зависит от разреза.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]