- Поток минимальной стоимости
- Критерий оптимальности
- Отмена циклов
- Дополняющие пути
- Потенциалы Джонсона
- Итоговый алгоритм
- Реализация
- Асимптотика
- Поток минимальной стоимости (min-cost-flow). Алгоритм увеличивающих путей
- Описание
- Простейший случай
- Реализация
- Задача минимальной стоимости потока — Minimum-cost flow problem
- Содержание
- Определение
- Отношение к другим проблемам
- Решения
- заявка
- Двудольное соответствие минимального веса
Поток минимальной стоимости
Рассмотрим ориентированный граф \(G = (V, E)\) с истоком \(s\) и стоком \(t\) , в котором у каждого ребра \((u, v)\) задана целая стоимость \(w_
Заметим, что рёбра отрицательной стоимости по условию возможны. Мы дополнительно предполагаем, что циклов отрицательного веса нет.
Модифицируем сеть, добавив стандартным образом обратные рёбра, позволяющие «отменять» операции: для каждого ребра \((u, v)\) добавим \((v, u)\) , для которого \(c_
Критерий оптимальности
Если в остаточной сети нет циклов отрицательного веса, то поток оптимален (и наоборот).
Доказательство:
\(\rightarrow\) Рассмотрим произвольный неоптимальный поток \(f\) и оптимальный поток \(f^*\) . Рассмотрим разность \(f^*-f\) . Она является циркуляцией, а любая циркуляция может быть разложена на сумму простых циклов. Хотя бы один из этих циклов будет иметь отрицательную стоимость, так как стоимость \(f^*\) меньше стоимости \(f\) , что противоречит предположению.
\(\leftarrow\) Пусть цикл существует, тогда мы можем пропустить поток по этому циклу и получить поток меньшей стоимости.
Отмена циклов
Этот критерий сразу даёт нам относительно простой алгоритм: найдем какой-нибудь максимальный поток и будем «отменять» циклы отрицательного веса в остаточной цепи, пока такие циклы существуют. Искать цикл нам придётся не более \(mUC\) раз где \(U\) — величина потока, \(C\) — максимальная пропускная способность ребра. Этой величиной ограничен модуль минимальной стоимости ответа, а каждый отмененный цикл уменьшает ответ хотя бы на единицу.
Если искать цикл алгоритмом Форда-Беллмана, то асимптотика алгоритма составит \(O(m^2nUC)\) (предполагая, что какой-нибудь максимальный поток мы уже нашли).
Дополняющие пути
Вспомним общий алгоритм поиска максимального потока, основанный на теореме Форда-Фалкерсона: найти какой-нибудь дополняющий путь, пропустить по нему поток и модифицировать сеть, снова найти дополняющий путь и так далее, пока путь из истока в сток существует. Что будет, если мы каждый раз будем искать не произвольный путь, а путь минимальной стоимости? Утверждается, что такой алгоритм найдет максимальный поток минимальной стоимости.
Утверждение. Алгоритм не создает в остаточной сети циклов отрицательного веса.
Изначально в остаточной сети нет циклов отрицательного веса. Мы нашли минимальный путь из \(s\) в \(t\) и модифицировали сеть, возможно добавив какие-то обратные рёбра. Могли ли из-за этих рёбер появиться циклы отрицательного веса? Пусть какое-нибудь обратное ребро \((v, u)\) находится в цикле отрицательного веса. Тогда есть путь Из \(u\) в \(v\) стоимости меньше, чем \(w_
Для поиска дополняющего пути можно использовать алгоритм Форда-Беллмана. Асимптотика в данном случае составит \(O(nmU)\) — искать каждый дополняющий путь мы будем не более \(U\) раз.
Почему мы не использовали алгоритм Дейкстры? Проблема в рёбрах отрицательного веса. Даже если в исходном графе их нет, они могут в процессе алгоритма появиться как обратные. Покажем, как изменить веса рёбер так, чтобы они стали неотрицательными, но информация о кратчайших путях не утратилась: это можно сделать, если дать каждой вершине так называемый «потенциал», который будет учитываться при пересчете стоимостей ребер.
Потенциалы Джонсона
Потенциалом вершины \(v\) будем называть расстояние \(d_v\) от вершины \(s\) . Рассмотрим граф из всех достижимых вершин и тех же рёбер, только с изменёнными весами:
Утверждение 1. Веса всех рёбер графа неотрицательные.
Доказательство. Пусть вес какого-то ребра \((u, v)\) отрицателен, то есть \(w_
Аналогично можно показать, что рёбра на кратчайших путях из \(s\) имеют нулевую стоимость. Заметим, что стоимость обратных рёбер на кратчайших путях тоже будет нулевой: \[ w_
Утверждение 2. Кратчайшие пути между любыми вершинами остались кратчайшими.
Доказательство. Распишем новую стоимость пути из \(a\) в \(z\) .
\[ \begin
Получаем, что стоимость всех путей из \(a\) в \(z\) лишь изменилась на константу.
Более того, если мы добавим или удалим некоторые рёбра из графа, потенциалы тоже никак не повлияют на кратчайшие пути.
Заметьте, что в доказательстве мы не использовали то, что \(d_v\) — кратчайшие расстояния. Это вообще могут быть произвольные числа.
Утверждение 3. Когда мы проталкиваем поток вдоль кратчайшего пути, удаляя ребра и возможно добавляя обратные, веса в изменённом графе тоже остались корректными (все рёбра неотрицательного веса и все кратчайшие пути остались кратчайшими).
Доказательство. Все добавленные обратные рёбра на кратчайшем пути будут иметь нулевую стомость (утверждение 1), а добавления или удаления рёбер на кратчайшие пути не повлияли (утверждение 2).
Итоговый алгоритм
- Модифицируем сеть, добавив обратные рёбра.
- Если в исходном графе есть рёбра отрицательного веса (но нет циклов отрицательного веса), то посчитать изначальные потенциалы (расстояния) алгоритмом Форда-Беллмана. Иначе достаточно положить потенциалы изначально равными нулю.
- Пока максимальный поток не найден:
-
- Посчитать алгоритмом Дейкстры кратчайшие расстояния от \(s\) , используя для веса формулу с потенциалами, записать их в \(d\) .
-
- Протолкнуть максимально возможный поток вдоль кратчайшего пути \(s \leadsto t\) , обновить остаточную сеть.
Реализация
Ниже приведено решение задачи о назначениях (паросочетание минимального веса). Для нахождения дополняющего пути используется алгоритм Дейкстры для плотных графов (без приоритетной очереди — каждую итерацию ищется минимум за \(O(n)\) ).
- cost , cap — параметры сети
- pot — потенциалы
- par — предок вершины в алгоритме Дейкстры (нужен для проталкивания потока)
- d — временный массив для алгоритма Дейкстры, куда будут записаны новые расстояния
Асимптотика
В общем случае, алгоритм работает за \(O(U m \log n)\) или \(O(U n^2)\) в случае плотных графов.
В наиболее популярных задачах рёбра обычно с единичной пропускной способностью, и \(U \leq n\) или \(U \leq m\) . Например, в задаче о назначениях \(U = n\) , и алгоритм работает за \(O(n^3)\) , что совпадает с асимптотикой венгерского алгоритма.
Источник
Поток минимальной стоимости (min-cost-flow). Алгоритм увеличивающих путей
Дана сеть G, состоящая из N вершин и M рёбер. У каждого ребра (вообще говоря, ориентированному, но по этому поводу см. ниже) указана пропускная способность (целое неотрицательное число) и стоимость единицы потока вдоль этого ребра (некоторое целое число). В графе указан исток S и сток T. Даётся некоторая величина K потока, требуется найти поток этой величины, причём среди всех потоков этой величины выбрать поток с наименьшей стоимостью («задача min-cost-flow»).
Иногда задачу ставят немного по-другому: требуется найти максимальный поток наименьшей стоимости («задача min-cost-max-flow»).
Обе эти задачи достаточно эффективно решаются описанным ниже алгоритмом увеличивающих путей.
Описание
Простейший случай
Рассмотрим для начала простейший случай, когда граф — ориентированный, и между любой парой вершин не более одного ребра (если есть ребро (i,j), то ребра (j,i) быть не должно).
Пусть Uij — пропускная способность ребра (i,j), если это ребро существует. Пусть Cij — стоимость единицы потока вдоль ребра (i,j). Пусть Fij — величина потока вдоль ребра (i,j), изначально все величины потоков равны нулю.
Модифицируем сеть следующим образом: для каждого ребра (i,j) добавим в сеть так называемое обратное ребро (j,i) с пропускной способностью Uji = 0 и стоимостью Cji = — Cij. Поскольку, по нашему предположению, ребра (j,i) до этого в сети не было, то модифицированная таким образом сеть по-прежнему не будет мультиграфом. Кроме того, на всём протяжении работы алгоритма будем поддерживать верным условие: Fji = — Fij.
Определим остаточную сеть для некоторого зафиксированного потока F следующим образом (собственно, так же, как и в алгоритме Форда-Фалкерсона): остаточной сети принадлежат только ненасыщенные рёбра (т.е. у которых Fij 3 M), правда, алгоритм Дейкстры придётся модифицировать, чтобы он работал на графах с отрицательными весами (это называется алгоритм Дейкстры с потенциалами).
Вместо этого можно использовать алгоритм Левита, который, хотя и асимптотически намного хуже, но на практике работает очень быстро (примерно за то же время, что и алгоритм Дейкстры).
Реализация
Здесь приведена реализация алгоритма min-cost-flow, базирующаяся на алгоритме Левита.
На вход алгоритма подаётся сеть (неориентированный мультиграф) с N вершинами и M рёбрами, и K — величина потока, который нужно найти. Алгоритм находит поток величины K минимальной стоимости, если такой существует. Иначе он находит поток максимальной величины минимальной стоимости.
В программе есть специальная функция для добавления ориентированного ребра. Если нужно добавить неориентированное ребро, то эту функцию нужно вызывать для каждого ребра (i,j) дважды: от (i,j) и от (j,i).
Источник
Задача минимальной стоимости потока — Minimum-cost flow problem
Задача потока с минимальными затратами ( MCFP ) — это проблема оптимизации и принятия решений для поиска наиболее дешевого из возможных способов отправки определенного количества потока через сеть потоков . Типичное применение этой проблемы включает поиск наилучшего маршрута доставки от завода до склада, где дорожная сеть связана с определенной пропускной способностью и стоимостью. Проблема потока с минимальными затратами является одной из наиболее фундаментальных среди всех проблем потока и циркуляции, поскольку большинство других таких проблем можно представить как задачу потока с минимальной стоимостью, а также то, что ее можно эффективно решить с помощью симплексного алгоритма сети .
Содержание
- 1 Определение
- 2 Отношение к другим проблемам
- 3 Решения
- 4 Применение
- 4.1 Двудольное сопоставление с минимальным весом
- 5 См. Также
- 6 Ссылки
- 7 Внешние ссылки
Определение
Потоковая сеть — это ориентированный граф с исходной вершиной и вершиной- приемником , где каждое ребро имеет пропускную способность , поток и стоимость , при этом большинство алгоритмов потока с минимальной стоимостью поддерживают ребра с отрицательной стоимостью. Стоимость отправки этого потока по ребру составляет . Проблема требует, чтобы поток был отправлен от источника к приемнику . г знак равно ( V , E ) <\ Displaystyle G = (V, E)> s ∈ V <\ displaystyle s \ in V>
т ∈ V <\ displaystyle t \ in V>
( ты , v ) ∈ E <\ displaystyle (u, v) \ in E>
0>»> c ( ты , v ) > 0 <\ Displaystyle с (и, v)>0>
0″> ж ( ты , v ) ≥ 0 <\ Displaystyle е (и, v) \ geq 0>
а ( ты , v ) <\ Displaystyle а (и, v)>
( ты , v ) <\ Displaystyle (и, v)>
ж ( ты , v ) ⋅ а ( ты , v ) <\ Displaystyle е (и, v) \ cdot а (и, v)>
d <\ displaystyle d>
s <\ displaystyle s>
т <\ displaystyle t>
Определение проблемы — минимизировать общую стоимость потока по всем ребрам:
∑ ( ты , v ) ∈ E а ( ты , v ) ⋅ ж ( ты , v ) <\ Displaystyle \ сумма _ <(и, v) \ в Е>а (и, v) \ CDOT F (и, v)>