Алгоритм отмены цикла минимального среднего веса — различия между версиями
(→Корректность) |
Penguinni (обсуждение | вклад) (→Корректность) |
||
Строка 20: | Строка 20: | ||
{{Лемма | {{Лемма | ||
− | |statement=Если <tex>f</tex> {{---}} поток минимальной стоимости, то <tex>\exists \varphi</tex> такое, что <tex>\forall uv: \; c_{f}(uv) > 0 \qquad p_{\varphi}(uv) \geqslant 0</tex> | + | |statement=Если <tex>f</tex> {{---}} поток минимальной стоимости, то <tex>\exists \varphi</tex> такое, что <tex>\forall uv: \; c_{f}(uv) > 0 \qquad p_{\varphi}(uv) \geqslant 0</tex>. |
|proof= | |proof= | ||
:Рассмотрим [[Дополняющая сеть, дополняющий путь|остаточную сеть]] {{---}} граф <tex>G_{f}</tex>. В нем нет отрицательных циклов, так как <tex>f</tex> {{---}} поток минимальной стоимости<ref>[[Лемма об эквивалентности свойства потока быть минимальной стоимости и отсутствии отрицательных циклов в остаточной сети]]</ref>. | :Рассмотрим [[Дополняющая сеть, дополняющий путь|остаточную сеть]] {{---}} граф <tex>G_{f}</tex>. В нем нет отрицательных циклов, так как <tex>f</tex> {{---}} поток минимальной стоимости<ref>[[Лемма об эквивалентности свойства потока быть минимальной стоимости и отсутствии отрицательных циклов в остаточной сети]]</ref>. | ||
Строка 26: | Строка 26: | ||
:Добавим вершину <tex>a</tex> и проведем из нее ребро стоимости <tex>0</tex> во все вершины графа <tex>G_{f}</tex>. В качестве <tex>\varphi(u)</tex> выберем стоимость минимального пути из <tex>a</tex> в <tex>u</tex>. | :Добавим вершину <tex>a</tex> и проведем из нее ребро стоимости <tex>0</tex> во все вершины графа <tex>G_{f}</tex>. В качестве <tex>\varphi(u)</tex> выберем стоимость минимального пути из <tex>a</tex> в <tex>u</tex>. | ||
− | :Рассмотрим теперь некоторое ребро <tex>uv</tex>. Понятно, что <tex>\varphi(v) \leqslant \varphi(u) + p(uv)</tex>. (Здесь сравниваются минимальный путь <tex>a \rightsquigarrow v</tex> и путь <tex>a \rightsquigarrow u \rightarrow v</tex>. Перенеся <tex>\varphi(v)</tex> в другую часть неравенства, получаем <tex>0 \leqslant \varphi(u) + p(uv) - \varphi(v)</tex> или <tex>0 \leqslant p_{\varphi}(uv)</tex>, что и требовалось доказать.}} | + | :Рассмотрим теперь некоторое ребро <tex>uv</tex>. Понятно, что <tex>\varphi(v) \leqslant \varphi(u) + p(uv)</tex>. (Здесь сравниваются минимальный путь <tex>a \rightsquigarrow v</tex> и путь <tex>a \rightsquigarrow u \rightarrow v</tex>). Перенеся <tex>\varphi(v)</tex> в другую часть неравенства, получаем <tex>0 \leqslant \varphi(u) + p(uv) - \varphi(v)</tex> или <tex>0 \leqslant p_{\varphi}(uv)</tex>, что и требовалось доказать.}} |
{{Определение | {{Определение | ||
|definition=Будем говорить, что поток <tex>f</tex> {{---}} '''<tex>\varepsilon</tex>-оптимальный''' (англ. ''<tex>\varepsilon</tex>-optimal''), если <tex>\exists \varphi</tex> такая, что <tex>\forall uv: c_{f}(uv) > 0 \qquad p_{\varphi}(uv) \geqslant -\varepsilon</tex>.}} | |definition=Будем говорить, что поток <tex>f</tex> {{---}} '''<tex>\varepsilon</tex>-оптимальный''' (англ. ''<tex>\varepsilon</tex>-optimal''), если <tex>\exists \varphi</tex> такая, что <tex>\forall uv: c_{f}(uv) > 0 \qquad p_{\varphi}(uv) \geqslant -\varepsilon</tex>.}} | ||
Строка 35: | Строка 35: | ||
:Рассмотрим цикл в остаточной сети <tex>C</tex>. Заметим, что <tex>p(C)=p_{\varphi}(C)</tex>. | :Рассмотрим цикл в остаточной сети <tex>C</tex>. Заметим, что <tex>p(C)=p_{\varphi}(C)</tex>. | ||
− | :Возьмем <tex>\varphi</tex> такое, | + | :Возьмем <tex>\varphi</tex> такое, что стоимости всех ребер в <tex>C</tex> не меньше <tex>-\varepsilon</tex>. Тогда стоимость всего цикла <tex>p_{\varphi}(C)\geqslant -n\cdot \varepsilon</tex> (в цикле не больше <tex>n</tex> ребер). Таким образом, <tex>p_{\varphi}(C) > -1</tex>, то есть <tex>p(C) > -1</tex>. Но исходные пропускные способности были целочисленными, поэтому <tex>p(C) \geqslant 0</tex>, а это означает, что в остаточной сети нет отрицательных циклов, и, соответственно, <tex>f</tex> {{---}} поток минимальной стоимости.}} |
+ | |||
+ | Обозначим за <tex>\varepsilon(f)</tex> минимальное <tex>\varepsilon</tex> такое, что поток <tex>f</tex> {{---}} <tex>\varepsilon</tex>-оптимальный. | ||
+ | {{Лемма | ||
+ | |statement=Если <tex>f</tex> {{---}} поток не минимальной стоимости, то <tex>\varepsilon(f)=-\mu(f)</tex>. | ||
+ | |proof= | ||
+ | :Рассмотрим в остаточной сети некоторый цикл <tex>C</tex>. | ||
+ | :Поскольку поток <tex>f</tex> является <tex>\varepsilon(f)</tex>-оптимальным, верно следующее: <tex>p(C) = p_{\varphi}(C) \geqslant -\texttt{len}(C) \cdot \varepsilon(f)</tex> или <tex>\dfrac{p(C)}{\texttt{len}(C)} \geqslant -\varepsilon(f) </tex>, то есть <tex>\mu(C) \geqslant -\varepsilon(f)</tex>, а поскольку это верно для любого цикла, то и <tex>\mu(f) \geqslant -\varepsilon(f)</tex>. | ||
}} | }} | ||
Версия 23:49, 4 января 2017
В статье описывается один из сильно полиномиальных алгоритмов решения задачи о поиске потока минимальной стоимости.
Содержание
Алгоритм
Приведенный алгоритм основан на идее алгоритма Клейна отмены цикла отрицательного веса. Выбор цикла минимального среднего веса вместо случайного делает алгоритм сильно полиномиальным.
Определение: |
Сильно полиномиальными (англ. strongly polynomial) в контексте данной задачи называются алгоритмы, чья сложность полиномиально зависит от | и .
Описание
Обозначим как пропускную способность цикла при протекании в сети потока . Cтоимость цикла обозначим за , а длину (число входящих в него ребер) — за .
остаточнуюОпределение: |
Средним весом (англ. mean weight) цикла будем называть отношение его стоимости к его длине |
- Шаг 1. Рассмотрим некоторый поток .
- Шаг 2. Найдем цикл , обладающий наименьшим средним весом. Если , то — поток минимальной стоимости и алгоритм завершается.
- Шаг 3. Отменим цикл , пустив по нему максимально возможный поток: . Перейдем к шагу 1.
Корректность
Пусть потенциалов .
— поток минимальной стоимости. Введем на нашей сети функциюОпределение: |
Приведенной стоимостью (англ. reduced cost) ребра назовем следующую величину: | .
Иными словами, приведенная стоимость — это сколько нужно потратить денег, чтобы перевести единицу жидкости из
в . (Ее нужно купить в , перевезти из в и продать в .)Лемма: |
Если — поток минимальной стоимости, то такое, что . |
Доказательство: |
|
Определение: |
Будем говорить, что поток | — -оптимальный (англ. -optimal), если такая, что .
Лемма: |
Если стоимости целочисленны и поток — -оптимальный, где , то — поток минимальной стоимости. |
Доказательство: |
|
Обозначим за
минимальное такое, что поток — -оптимальный.Лемма: |
Если — поток не минимальной стоимости, то . |
Доказательство: |
|
Сложность
, при этом времени тратится на поиск цикла минимального среднего веса.
Алгоритм поиска цикла минимального среднего веса
Наивный способ
Устроим двоичный поиск. Установим нижнюю и верхнюю границы величины среднего веса цикла и соответственно, вычислим серединное значение и отнимем полученную величину от всех ребер сети. Если теперь в нашей сети есть отрицательный цикл (этот факт можно проверить при помощи алгоритма Форда-Беллмана), значит существует цикл с меньшим средним весом, чем . Тогда продолжим поиск среди значений в диапазоне от до , иначе — от до . Такой алгоритм будет работать за , где — точность выбора величины среднего веса цикла.
Продвинутый алгоритм
Добавим к нашему графу вершину алгоритм Форда-Беллмана и попросим его построить нам квадратную матрицу со следующим условием: — длина минимального пути от до ровно из ребер. Тогда длина оптимального цикла минимального среднего веса вычисляется как .
и ребра из нее во все остальные вершины. ЗапустимДостаточно будет доказать это правило для
, так как для других можно просто отнять эту величину от всех ребер и получить снова случай с .Чтобы найти цикл после построения матрицы
, запомним, при каких и достигается оптимальное значение , и, используя , поднимемся по указателям предков. Как только мы попадем в уже посещенную вершину — мы нашли цикл минимального среднего веса.Этот алогоритм работает за
.См. также
- Использование потенциалов Джонсона при поиске потока минимальной стоимости
- Сведение задачи о назначениях к задаче о потоке минимальной стоимости