Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 500101.doc
Скачиваний:
13
Добавлен:
30.04.2022
Размер:
8.38 Mб
Скачать

6.3. Упражнения

Определить кратчайшие пути между всеми парами вершин графов с использованием алгоритма Флойда

а б

в г

Рис. 20

7. Определение максимального потока в транспортной сети

7.1. Теоретические сведения

Рассмотрим граф G=(X,U), называемый в дальнейшем сетью. Пусть каждой дуге (xi, xj) сопоставлено положительное число cij , называемое пропускной способностью дуги. В сети выделяют два специальных узла, один из них называют источником (обозначим его через s), другой – стоком (обозначим его через t). Множество неотрицательных чисел fij , определенных на дугах (xi,xj), называют потоками в дугах, если выполняются следующие условия:

Линейные ограничения отражают тот факт, что поток, втекающий в вершину, равен потоку, вытекающему из нее, за исключением вершин, являющихся источником и стоком. При этом поток в каждой дуге не должен превышать ее пропускной способности. Величина v, равная сумме потоков по всем дугам, исходящим из источника s, или сумме потоков по всем дугам, заходящим в вершину t, называется величиной потока в сети:

Задача о максимальном потоке состоит в нахождении такого множества потоков по дугам, чтобы величина потокаv в сети была максимальной при условии отсутствия превышения пропускных способностей дуг.

Для определения максимального потока в сети можно воспользоваться алгоритмом Форда-Фалкерсона. Идея алгоритма состоит в следующем. Выбирается некоторый начальный поток из s в t и осуществляется поиск увеличивающего пути. Если увеличивающий путь найти не удаётся, выполнение алгоритма заканчивается, и текущий поток из s в t является максимальным. Если увеличивающий путь найден, то поток вдоль данного пути увеличивается до максимально возможного значения. Затем выполняется поиск нового увеличивающего пути, и т.д.

Вершина может находиться в одном из трёх состояний: вершине приписана пометка и вершина просмотрена (т.е. она имеет пометку и все смежные с ней вершины «обработаны»); пометка приписана, но вершина не просмотрена (т.е. она имеет пометку, но не все смежные с ней вершины обработаны); вершина не имеет пометки. Пометка произвольной вершины xi состоит из двух частей и имеет один из двух видов: (+xj, ) или (xj, ). Часть +xj пометки первого типа означает, что поток допускает увеличение вдоль дуги (xj, xi). Часть xj пометки другого типа означает, что поток может быть уменьшен вдоль дуги (xi, xj). В обоих случаях  задаёт максимальную величину дополнительного потока, который может протекать от s к xi.

Алгоритм Форда-Фалкерсона включает следующие шаги: а. Расстановка пометок

Шаг 1. Присвоить вершине s пометку (+s, (s) = ∞). Вершине s присвоена пометка и она просмотрена, все остальные вершины без пометок.

Шаг 2. Взять некоторую непросмотренную вершину с пометкой; пусть её пометка будет (xk, (xi)).

(I) Каждой непомеченной вершине xj  Г (xi), для которой fij < cij, присвоить пометку (+xi, (xj)), где (xj) = min [(xi), cij  fij ].

(II) Каждой непомеченной вершине xj  Г-1(xi), для которой fji > 0, присвоить пометку (xi, (xj)), где (xj) = min [(xi), fji ]. Теперь вершина xi и помечена, и просмотрена, а вершины xj, пометки которым присвоены в (I) и (II), являются непросмотренными.) Обозначить каким-либо способом, что вершина xi просмотрена.

Шаг 3. Повторять шаг 2 до тех пор, пока либо вершина t будет помечена , и тогда перейти к шагу 4, либо t будет не помечена и никаких других пометок нельзя будет расставить; в этом случае алгоритм заканчивает работу с максимальной величиной потока.

Б. Увеличение потока

Шаг 4. Положить x = t и перейти к шагу 5.

Шаг 5. (I) Если пометка в вершине x имеет вид (+z, (x)), то изменить поток вдоль дуги (z, x) с f(z, x) на f(z, x) + (t).

(II) Если пометка в вершине x имеет вид (z, (x)), то изменить поток вдоль дуги (x, z) с f(x, z) на f(x, z)  (t).

Шаг 6. Если z = s, то стереть все пометки и вернуться к шагу 1, чтобы вновь начать расставлять пометки, но используя уже улучшенный поток, найденный на шаге 5. Если z  s, то положить x = z и вернуться к шагу 5.

7.2. Пример. Найти максимальный поток от x1 к x9 для графа

Рис. 21

Решение. В качестве начального возьмем поток с нулевыми значениями на всех дугах. Алгоритм работает следующим образом.

Шаг 1. Припишем вершине x1 пометку (+x1, ∞).

Шаг 2. (I) Множество вершин { xj | xj  Г (x1), f1j < c1j , xj не помечена} есть {x2, x4}, вершине x2 приписывается пометка (+x1, min [∞, 14 - 0]), т.е. (+x1, 14), вершине x4 приписывается (+x1, min [∞, 23 - 0]), т.е. (+x1, 23).

(II) Множество вершин { xj | xj  Г-1 (x1), fj1 > 0, xj непомечена} является пустым. Итак, x1 помечена и просмотрена, x2 и x4 помечены и не просмотрены, а все остальные вершины не помечены. Повторяем шаг 2 и первой просматриваем вершину x2.

(I) Множество { xj | xj  Г (x2), f2j < c2j , xj не помечена} есть x3, и для x3 пометкой будет (+x2, min [14, 10 - 0]) = (+x2, 10).

(II) Множество вершин { xj | xj  Г-1 (x2), fj2 > 0, xj не помечена} является пустым. Теперь вершины x1 и x2 помечены и просмотрены, а x3 и x4 помечены, но не просмотрены.

Беря для просмотра x3 и повторяя шаг 2, придем к следующим пометкам:

для x5 пометкой будет (+x3, min [10, 12 - 0]) = (+x3, 10),

для x8 пометкой будет (+x3, min [10, 18 - 0]) = (+x3, 18).

Выбирая для просмотра x4, найдем, что никаких пометок расставить нельзя.

Продолжая просмотр с x5, получим следующие пометки:

пометка для x6 будет (+x5, min [10, 25 - 0]) = (+x5, 10),

пометка для x7 будет (+x5, min [10, 4 - 0]) = (+x5, 4),

пометка для x9 будет (+x7, min [4, 15 - 0]) = (+x7, 4).

Переходя к шагам 4 и 5, получим:

x = x9; f7, 9 = 0 + 4 = 4;

x = x7; f5, 7 = 4;

x = x5; f3, 5 = 4;

x = x3; f2, 3 = 4;

x = x2; f1, 2 = 4.

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

Стирая пометки у вершин и возвращаясь к шагу 1 для второй итерации, получим следующие новые пометки вершин (помеченные, но не просмотренные вершины просматриваются в порядке возрастания их номеров):

Шаг 3.

Пометкой для x1 будет (+x1, ∞),

пометкой для x2 будет (+x1, min [∞, 14 - 4]) = (+x1, 10),

пометкой для x4 будет (+x1, min [∞, 23 - 0] = (+x1, 23);

теперь вершина x1 помечена и просмотрена.

Пометкой для x3 будет (+x2, min [10, 10 - 4]) = (+x2, 6),

теперь вершина x2 помечена и просмотрена.

Пометкой для x5 будет (+x3, min [6, 12 - 4]) = (+x3, 6),

Пометкой для x8 будет (+x3, min [6, 18 - 0]) = (+x3, 6);

теперь вершина x3 помечена и просмотрена; вершина x4 также помечена и просмотрена.

Пометкой для x6 будет (+x5, min [6, 25 - 0]) = (+x5, 6),

теперь вершина x5 помечена и просмотрена.

Пометкой для x7 будет (+x6, min [6, 7 - 0]) = (+x6, 6),

теперь вершина x6 помечена и просмотрена.

Пометкой для x9 будет (+x7, min [6, 15 - 4]) = (+x7, 6).

Шаги 4 и 5.

Новые потоки увеличились следующим образом:

f7, 9 = 4 + 6 = 10; f6, 7 = 0 + 6 = 6; f5, 6 = 0 + 6 = 6;

f3, 5 = 4 + 6 = 10; f2, 3 = 4 + 6 = 10; f1, 2 = 4 + 6 =10;

все остальные значения потока не изменились.

Новый вид потока и пометки вершин до стирания показаны на рис.23.

Продолжая дальше, получаем после каждого прохода алгоритма потоки и пометки, изображенные последовательно на рисунках 24  26. Алгоритм заканчивает работу, когда вершина не может быть помечена.

Поток на рис.27. является поэтому максимальным потоком со значением 29.

Рис.22. Потоки и пометки после первой итерации.

Рис. 23. Потоки и пометки после второй итерации

.

Рис. 24. Потоки и пометки после третьей итерации

Рис. 25. Потоки и пометки после четвертой итерации

Рис. 26. Потоки и пометки после пятой итерации

Рис. 27. Потоки и пометки после шестой итерации