Использование потенциалов Джонсона при поиске потока минимальной стоимости — различия между версиями
Строка 17: | Строка 17: | ||
== Использование потенциалов Джонсона == | == Использование потенциалов Джонсона == | ||
Возьмём значения потенциалов в вершинах равными минимальному по цене расстоянию от стока до них или <tex>+\infty</tex>, если она недостижима. Так как <tex>\,c_{ij} + p_i</tex> — это длина какого-то пути до вершины <tex>\,j</tex>, а <tex>\,p_j</tex> — длина минимального пути, то <tex>c_{p_{ij}} \geqslant 0</tex>, что от нас и требовалось. | Возьмём значения потенциалов в вершинах равными минимальному по цене расстоянию от стока до них или <tex>+\infty</tex>, если она недостижима. Так как <tex>\,c_{ij} + p_i</tex> — это длина какого-то пути до вершины <tex>\,j</tex>, а <tex>\,p_j</tex> — длина минимального пути, то <tex>c_{p_{ij}} \geqslant 0</tex>, что от нас и требовалось. | ||
− | Значения потенциалов найдём с помощью [[Алгоритм Форда-Беллмана|алгоритма Форда-Беллмана]]. Таким образом, нам его придётся запустить всего один раз, а не на каждом шаге алгоритма. | + | Значения потенциалов найдём с помощью [[Алгоритм Форда-Беллмана|алгоритма Форда-Беллмана]]. Таким образом, нам его придётся запустить всего один раз, а не на каждом шаге алгоритма. Однако, после добавления потока вдоль кратчайшего увеличивающего пути в сети могут появиться новые ребра, равно как и исчезнуть старые, и будет необходимо пересчитать потенциалы, чтобы они оставались корректными, то есть <tex>p_v</tex> - длина кратчайшего пути от истока в вершину <tex>v</tex> в новой сети. |
+ | |||
+ | Для начала докажем, что в сети с корректными потенциалами <tex>w_p(u, v) = 0</tex> для любого ребра <tex>(u, v)</tex>, лежащего на пути <tex>s \leadsto t</tex>. | ||
==Реализация== | ==Реализация== |
Версия 18:15, 5 мая 2018
Метод интересен прежде всего тем, что задачу о назначениях можно свести к задаче о поиске потока минимальной стоимости, и тогда эффективность решения задачи о назначениях будет определяться именно асимптотикой работы этого алгоритма.
Мотивация
Зачем нужно использовать потенциалы Джонсона?
Идея аналогична идее, использующейся в алгоритме Джонсона.
При поиске потока минимальной стоимости методом дополнения вдоль путей минимальной стоимости нам требуется находить минимальный по стоимости поток из истока в сток. Это реализуется с помощью алгоритмов поиска кратчайшего пути в графе. Поскольку стоимость некоторых рёбер может быть отрицательной, нам приходится использовать алгоритм Форда-Беллмана. Однако гораздо эффективней было бы применить алгоритм Дейкстры для этой же цели, так как у него гораздо лучше асимптотика. Для этого нам надо перевзвесить рёбра графа.
Определение: |
Пусть дана транспортная сеть | , где — множество вершин графа, а — множество рёбер. Введем в каждой вершине потенциал . Тогда остаточная стоимость ребра определяется как
Заметим, что сумма остаточных стоимостей ребер вдоль любого пути отличается от суммы стоимостей вдоль того же самого пути на разность между потенциалом первой и последней вершины.
Использование потенциалов Джонсона
Возьмём значения потенциалов в вершинах равными минимальному по цене расстоянию от стока до них или алгоритма Форда-Беллмана. Таким образом, нам его придётся запустить всего один раз, а не на каждом шаге алгоритма. Однако, после добавления потока вдоль кратчайшего увеличивающего пути в сети могут появиться новые ребра, равно как и исчезнуть старые, и будет необходимо пересчитать потенциалы, чтобы они оставались корректными, то есть - длина кратчайшего пути от истока в вершину в новой сети.
, если она недостижима. Так как — это длина какого-то пути до вершины , а — длина минимального пути, то , что от нас и требовалось. Значения потенциалов найдём с помощьюДля начала докажем, что в сети с корректными потенциалами
для любого ребра , лежащего на пути .Реализация
Модифицируем псевдокод из статьи про поиск потока минимальной стоимости методом дополнения вдоль путей минимальной стоимости: НЕ ЧИТАЙТЕ, В РЕАЛИЗАЦИИ НАПИСАНА ПОЛНАЯ ЧУШЬ, после второй итерации, скорее всего, появятся ребра отрицательного веса
for{ } Запустим алгоритм Форда-Беллмана, в результате для каждой вершины: — расстояние , если за длину ребра принимается его стоимость. for { } while (существует путь в остаточной сети ) { Найти — кратчайший в смысле стоимости путь с помощью алгоритма Дейкстры дополнить поток вдоль }
Асимптотика
Пусть все пропускные способности целочисленны. Метод целиком работает за , где — время одной итерации.
Время, затраченное на одну итерацию, определяется скоростью поиска кратчайшего пути. Если для этой цели использовать алгоритм Дейкстры с Фиббоначевыми кучами, то поиск мы осуществим за .
Не стоит так же забывать, что для расчёта потенциалов мы один раз запустили Алгоритм Форда-Беллмана. В результате получим время работы
.Это лучше, чем алгоритма Форда-Беллмана для поиска кратчайшего пути на каждой итерации.
, что получается при использовании
В применении к задаче о назначениях: пусть у нас есть назначений. Построим специальным образом граф. Искомый поток в нём имеет имеет мощность . Количество вершин — , рёбер — . Итого получаем асимптотику .
Литература
- Andrew V. Goldberg An Efficient implementation of a scaling minimum-cost flow algorithm - Journal of Algorithms, 1997