Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Поток минимальной стоимости и труднорешаемые задачи. Учебно-методическое пособие
.pdf
1.4. Задача о потоке минимальной стоимости 31
из v, не меняется; аналогично с потоком, входящим в вершину
∗
v из s
.
Поскольку f
∗
— поток, то и f — поток, причем поток допу-
стимый.
1.4. Задача о потоке минимальной
стоимости
Постановка задачи. Заданы сеть G =(V, E, c, r) с двумя
весовыми функциями на ребрах и число k. Функция
c : E → R, — как обычно, ограничения по пропускной спо-
собности ребер, а функция r : E → R — стоимость прохожде-
ния единицы потока по ребру e. Обе функции неотрицательны.
Требуется найти поток f, такой, что:
1) f = k;
2) cтоимость потока (обозначаем как r(f )) минимальна среди всех потоков величины k, где стоимость потока определяется как
r(f )=
Приведем небольшой пример
(см. рис. 1.10). Здесь функция
пропускных способностей c =1
на каждом ребре, стоимость прохождения единицы потока
r(e)f (e).
e∈E
r(s, 2) = r(1,t)=10,
на остальных r =1(на рис. 1.10
пропускная способность и стоимость указаны через запятую)
и, наконец, k =1. Решаем зада-
чу о потоке минимальной стоимости величины 1.
Рис. 1.10. Пример потока

32 Глава 1. Потоки в сетях
Легко видеть, что максимальный поток в этой сети равен 2
(одна единица течет поверху и еще одна снизу, а поток на ребре
(1,2) равен нулю), но нам нужен поток величины 1.
Пусть поток величины 1 проходит по верхним ребрам,
а на остальных 0. Тогда стоимость этого потока равна 11. Конечно, это не минимальный по стоимости поток. Несложно показать, что поток f такой, что f(s, 1) = f(1, 2) = f(2,t)=1,
стоимость которого равна 3, является решением задачи о потоке минимальной стоимости величины 1.
Ниже приведен другой пример задачи о потоке минимальной стоимости. Это знаменитая транспортная задача из линейного программирования. При изложении этой задачи мы будем
использовать стандартные для линейного программирования
обозначения.
Даны:
• число n,i =1, 2,...,n — поставщики продукции;
• число m,j =1, 2,...,m — потребители продукции;
• числа α(i) — предложение i-го поставщика;
• числа β(j) — спрос j-го потребителя;
• числа c(i, j) — стоимость доставки одной единицы продукции от i-го поставщика j-му потребителю;
• задача сбалансирована:
n
i=1
α(i)=
m
j=1
β(j).
Требуется развезти всю продукцию от поставщиков к потребителям с учетом спроса и предложения, затратив наименьшую
сумму денежных единиц.
То есть то, что дано, мы сформулировали на математическом языке, а то, что требуется, — на обыденном. Впрочем,
это легко поправимо, а именно: обозначим x(i, j) — количество
продукции поставляемого i-тым поставщиком j-му потребителю. Требуется найти x(i, j) так, чтобы выполнялись условия:

1.4. Задача о потоке минимальной стоимости 33
1) x(i, j) 0;
m
2) для каждого i выполняется α(i)=
x(i, j); т. е. от каж-
j=1
дого поставщика вывозится вся продукция ;
n
3) для каждого j выполняется β(j)=
x(i, j); т. е. каждо-
i=1
му потребителю привозится ровно столько продукции,
сколько ему требуется;
n
m
4)
i=1
c(i, j)x(i, j) → min.
j=1
Отметим, что в последней строке сумма никуда не стремится: просто это принятое обозначение того, что соответствующая сумма принимает минимальное значение среди всех сумм,
удовлетворяющих предыдущим условиям.
Для решения транспортной задачи имеются стандартные
алгоритмы линейного программирования, здесь мы покажем,
что эта задача является частным случаем задачи о потоке минимальной стоимости.
Построим сетевую модель:
∗
• Положим G =(V, E,c
,r) следующим образом:
V = {s}∪{i : i =1, 2,...,n}∪{j : j =1, 2,...,m}∪{t}.
То есть множество вершин в этой сети образуют все
поставщики, все потребители и две новые вершины источник и сток сети.
• Множество ребер
E = {(s, i):i =1, 2,...,n}∪
∪{(i, j):i =1, 2,...,n; j =1, 2,...,m}∪
∪{(j, t):j =1, 2,...,m};
т. е. ребра строятся так: от источника к каждому поставщику, от каждого поставщика к каждому потребителю и от каждого потребителя к стоку.

34 Глава 1. Потоки в сетях
• Определим пропускные способности ребер. Здесь придет-
∗
ся использовать обозначения c
, чтобы не путать с поста-
новкой транспортной задачи.
∗
(s, i)=α(i); c∗(j, t)=β(j); c∗(i, j)=+∞;
c
r(s, i)=r(j, t)=0;r(i, j)=c(i, j);
(здесь уже функция c из транспортной задачи)
k =
n
i=1
α(i)=
m
j=1
β(j),
поскольку задача сбалансирована (суммарный спрос равен суммарному предложению).
Рис. 1.11. Сеть для транспортной задачи
На рис. 1.11 проведены ребра и их пропускные способности
только из первого поставщика.
Теорема 1.7. Решение задачи о потоке минимальной стоимости величины k однозначно определяет решение транспортной задачи.

1.4. Задача о потоке минимальной стоимости 35
Вновь докажем только содержательную часть, хотя эту теорему можно сформулировать в обе стороны.
Пусть f — поток величины k минимальной стоимости.
Положим x(i, j)=f (i, j). Тогда условие 1 решения транспортной задачи выполняется, так как значение потока на каждом
ребре неотрицательно.
Условие 2 выполняется, так как величина потока равна k,
n
т. е . k =
α(i) и, следовательно, на каждом ребре (s, i) выпол-
i=1
няется равенство f(s, i)=α(i). Это означает, что втекающий
в каждую вершину i поток равен α(i), но тогда и вытекающий
из вершины i поток равен α(i), т. е. справедливо равенство:
m
α(i)=
f(i, j).
j=1
Иначе говоря,
m
α(i)=
x(i, j),
j=1
что и означает справедливость условия 2.
Справедливость условия 3 проверяется точно так же.
Наконец,
r(f )=
r(e)f (e).
e∈E
С учетом определения функции стоимости имеем:
r(f )=
n
i=1
m
r(i, j)f (i, j)=
j=1
n
i=1
m
c(i, j)x(i, j),
j=1
что завершает доказательство.

36 Глава 1. Потоки в сетях
1.4.1. Прямой алгоритм решения задачи о потоке
минимальной стоимости
Пусть q — некоторый цикл. Напомним, что
⎧
⎪
+1, если ребро e входит в q как прямое;
⎨
(e)=
sgn
q
Определение. Положим r(q)=
зывается стоимостью цикла q.
Справедлив полный аналог леммы 2 из параграфа 2.
0,eне входит в q;
⎪
⎩
−1, если ребро e входит в q как обратное.
r(e)sgnq(e); число r(q) на-
e∈q
Лемма 3 (новая). Пусть f — поток, q — некоторый f -кор-
∗
ректирующий цикл отрицательной стоимости, f
∗
поток, полученный из f по формуле f
(e)=f(e)+sgnq(e)h(q).
— новый
Тогда:
∗
1) величины потоков f и f
2) стоимость f
То, что f
∗
меньше стоимости потока f.
∗
является потоком в сети G, проверяется точ-
совпадают;
но так же, как и в доказательстве леммы 2. Покажем, что f
является потоком той же величины, но меньшей стоимости.
∗
Вначале докажем равенство f
= f . Пусть вершина s
не входит в цикл q. Тогда в вершине s ничего не происходит
∗
и, следовательно, f
= f∗(s+) = f(s+) = f .
Пусть теперь вершина s входит в цикл q. Но ребра из s только выходят, значит, пришли в s по обратному ребру, а ушли
по прямому ребру. Но тогда на обратном ребре поток уменьшится на число h(q), а на прямом увеличится на то же самое
число. Заметим, что так будет при каждом вхождении вершины s в цикл q. Значит, величина потока, вытекающего из вершины s, не меняется. Отсюда получаем, что величины потоков
∗
и f совпадают.
f
∗

1.4. Задача о потоке минимальной стоимости 37
∗
Найдем стоимость потока f
.
r(f
∗
)=
r(e)f∗(e)=
e∈E
=
e∈E
=
e∈E
r(e)f (e)+
r(e)f(e)+sgnq(e)h(q)=
e∈E
r(e)f (e)+r(e)sgn
r(e)sgnq(e)h(q)=
e∈E
(e)h(q)=
q
= r(f )+h(q)r(q) <r(f ),
так как r(q) < 0.
Эта лемма фактически подсказывает алгоритм построения
потока заданной величины минимальной стоимости. Вначале
надо построить поток заданной величины, затем каждый раз
уменьшать стоимость, найдя корректирующий цикл отрицательной стоимости.
А если корректирующих циклов отрицательной стоимости
нет? Итак, необходима теорема, которая является полным аналогом теоремы Форда — Фалкерсона.
Теорема 1.8. Поток f величины k является минимальным
по стоимости среди всех потоков величины k тогда и только тогда, когда в сети G не существует f-корректирующего
цикла отрицательной стоимости.
В одну сторону это перефразировка леммы 2, в другую мы
по ряду причин не будем доказывать. Примем эту теорему без
доказательства.
Теперь можно сформулировать алгоритм решения задачи
о потоке заданной величины минимальной стоимости.

38 Глава 1. Потоки в сетях
Algorithm 5: Прямой алгоритм решения задачи о построении потока минимальной стоимости
1 Построить поток f величины k;
2 Искать f -корректирующий цикл q отрицательной
стоимости;
3 if такой цикл построен then
4 изменить поток f по формуле, указанной в лемме 3
и перейти на шаг 2
5 else
6 СТОП. Поток f: минимальный по стоимости.
7 end
Как искать f-корректирующий цикл отрицательной стоимости?
Метод. Поиск контура в подходяще построенной сети.
Годится небольшая модификация алгоритма Флойда для
вычисления расстояний между всеми парами вершин.
Пусть f — поток в сети G. Построим вспомогательную сеть
∗
=(V∗,E∗,c∗) (она в большинстве книг называется остаточ-
G
ной сетью).
Положим:
∗
= V ;
• V
∗
•ВE
добавляем только те ребра, которые могут входить
в исходной сети в f-корректирующий цикл, а именно:
– пусть ребро e ∈ E, тогда, если f(e) <c(e), то добав-
∗
ляем e в E
гаем c
, сохраняя ориентацию ребра e, и пола-
∗
(e)=r(e);
– если 0 <f(e), то у ребра e меняем ориентацию на про-
тивоположную и добавляем противоположное ребро
∗
, обозначаем измененное ребро как −e и полага-
в E
∗
(−e)=−r(e);
ем c
– если выполняются оба условия, т. е. 0 <f(e) <c(e),
∗
то добавляем в E
оба ребра как прямое и обратное
со стоимостью, как в случаях 1) и 2).

1.4. Задача о потоке минимальной стоимости 39
∗
В сети G
применим алгоритм Флойда (см. [1, с. 265]) для
вычисления расстояний между всеми парами вершин. Как только алгоритм Флойда найдет вершину i такую, что расстояние
от i до i меньше нуля, значит он нашел контур отрицательной
∗
длины в G
, но по найденному контуру однозначно строится
f-корректирующий цикл в исходной сети G.
Полноты ради приведем здесь алгоритм Флойда.
Algorithm 6: Алгоритм Флойда (он же Флойда —
Уоршалла, или просто Уоршалла). Вычисление расстояний между всеми парами вершин в сети.
1 Пусть в сети G =(V, E, c) все вершины пронумерованы
натуральными числами от 1 до n, причем вес
несуществующего ребра равен +∞;
2 Положим d
(i, j)=min{расстояний среди всех путей
k
от i до j, содержащих не более k ребер};
3 Последовательно вычисляем для всех k,i, j от 1 до n,
используя формулы:
4 d
(i, j)=c(i, j),
1
5 d
(i, j)=min{dk(i, j),dk(i, k +1)+dk(k +1,j)}.
k+1
Этот алгоритм работает, когда в сети нет контуров отрица-
тельной длины, а нам ведь нужен как раз такой контур!
Контур отрицательной длины существует тогда и только
тогда, когда найдена вершина i такая, что d
(i, i) < 0.
k
Легкое доказательство мы опускаем.
Разберем пример (см. рис. 1.12).
Пусть c(s, 1) = 2, а на остальных ребрах тождественно равна 1, т. е. пропускная способность любого другого ребра равна
единице. Стоимость прохождения единицы потока по любому
ребру равна 1, кроме ребра (1, 2),гдеr(1, 2) = 2. Число k =1.
Значения исходного потока f приведены на рис. 1.12, a.
Тогда f =1,аr(f )=4.
Рассмотрим цикл q = s, 2, 1,s, иначе говоря, состоящий
из ребер (s, 2); (1, 2); (s, 1). Здесь ребро (s, 2) — прямое, а ребра

40 Глава 1. Потоки в сетях
a
b
Рис. 1.12. Изменение потока вдоль корректирующего цикла:
a — исходный поток; b — измененный поток
(1, 2) и (s,1) — обратные. Для этого цикла имеем
h(q)=1,r(q)=−2.
∗
Пусть поток f
Новый поток f
получен из f по формуле
∗
(e)=f(e)+sgnq(e)h(q).
f
∗
изображен на рис. 1.12, b.
Заметим, что величина
∗
потока f
по-прежнему равна 1, а вот стоимость уменьшилась и стала равной 2. Это
не случайный факт.
Как алгоритм Флойда най-
дет этот цикл?
Построим вспомогатель-
∗
ную сеть G
=(V∗,E∗,c∗)
(см. рис. 1.13).
Здесь ДВА контура от-
Рис. 1.13. Остаточная сеть
для потока f
рицательной стоимости, первый: s, 2, 1,s, второй: t, 2, 1,t.
Алгоритм Флойда, если все
циклы в нем проводятся по порядку номеров, найдет контур
s, 2, 1,s и расстояние
(s, s)=−2 < 0.
d
3
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
