Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Поток минимальной стоимости и труднорешаемые задачи. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
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).
eE
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).
eE
С учетом определения функции стоимости имеем:
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) на-
eq
Лемма 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)=
eE
=
eE
=
eE
r(e)f (e)+
r(e)f(e)+sgnq(e)h(q)=
eE
r(e)f (e)+r(e)sgn
r(e)sgnq(e)h(q)=
eE
(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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]