Алгоритм отмены цикла минимального среднего веса — различия между версиями
Penguinni (обсуждение | вклад) (→Источники информации) |
Penguinni (обсуждение | вклад) (→Корректность) |
||
Строка 32: | Строка 32: | ||
:Рассмотрим теперь некоторое ребро <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>.}} | ||
Строка 39: | Строка 40: | ||
|statement=Если стоимости целочисленны и поток <tex>f</tex> {{---}} <tex>\varepsilon</tex>-оптимальный, где <tex>\varepsilon < \dfrac{1}{V}</tex>, то <tex>f</tex> {{---}} поток минимальной стоимости. | |statement=Если стоимости целочисленны и поток <tex>f</tex> {{---}} <tex>\varepsilon</tex>-оптимальный, где <tex>\varepsilon < \dfrac{1}{V}</tex>, то <tex>f</tex> {{---}} поток минимальной стоимости. | ||
|proof= | |proof= | ||
− | :Рассмотрим цикл в остаточной сети <tex>C</tex>. Заметим, что <tex>p(C)=p_{\varphi}(C)</tex>. | + | :Рассмотрим цикл в остаточной сети <tex>C</tex>. Заметим, что <tex>p(C)=p_{\varphi}(C)</tex> (для доказательства этого факта достаточно расписать <tex>p_{\varphi}(C)</tex> по определению). |
:Возьмем <tex>\varphi</tex> такое, что стоимости всех ребер в <tex>C</tex> не меньше <tex>-\varepsilon</tex>. Тогда стоимость всего цикла <tex>p_{\varphi}(C)\geqslant -V\cdot \varepsilon</tex> (в цикле не больше <tex>V</tex> ребер). Таким образом, <tex>p_{\varphi}(C) > -1</tex>, то есть <tex>p(C) > -1</tex>. Но исходные пропускные способности были целочисленными, поэтому <tex>p(C) \geqslant 0</tex>, а это означает, что в остаточной сети нет отрицательных циклов, и, соответственно, <tex>f</tex> {{---}} поток минимальной стоимости.}} | :Возьмем <tex>\varphi</tex> такое, что стоимости всех ребер в <tex>C</tex> не меньше <tex>-\varepsilon</tex>. Тогда стоимость всего цикла <tex>p_{\varphi}(C)\geqslant -V\cdot \varepsilon</tex> (в цикле не больше <tex>V</tex> ребер). Таким образом, <tex>p_{\varphi}(C) > -1</tex>, то есть <tex>p(C) > -1</tex>. Но исходные пропускные способности были целочисленными, поэтому <tex>p(C) \geqslant 0</tex>, а это означает, что в остаточной сети нет отрицательных циклов, и, соответственно, <tex>f</tex> {{---}} поток минимальной стоимости.}} | ||
− | Обозначим за <tex>\mu | + | Обозначим за <tex>\mu^{*}</tex> минимальную величину среди средних весов циклов для потока <tex>f</tex>, а за <tex>\varepsilon^{*}</tex> минимальное <tex>\varepsilon</tex> такое, что поток <tex>f</tex> {{---}} <tex>\varepsilon</tex>-оптимальный. |
{{Лемма | {{Лемма | ||
|id=lemma3 | |id=lemma3 | ||
− | |statement=Если <tex>f</tex> {{---}} поток не минимальной стоимости, то <tex>\varepsilon | + | |statement=Если <tex>f</tex> {{---}} поток не минимальной стоимости, то <tex>\varepsilon^{*}=-\mu^{*}</tex>. |
|proof= | |proof= | ||
− | *Покажем, что <tex>\mu | + | :Пусть <tex>C</tex> {{---}} цикл минимального среднего веса в остаточной сети. |
− | + | *Покажем, что <tex>\mu^{*} \geqslant -\varepsilon^{*}</tex>. | |
− | :Поскольку поток <tex>f</tex> является <tex>\varepsilon | + | :Поскольку поток <tex>f</tex> является <tex>\varepsilon^{*}</tex>-оптимальным, верно следующее: <tex>p(C) = p_{\varphi}(C) \geqslant -\texttt{len}(C) \cdot \varepsilon^{*}</tex> или <tex>\dfrac{p(C)}{\texttt{len}(C)} \geqslant -\varepsilon^{*} </tex>, то есть <tex>\mu^{*} \geqslant -\varepsilon^{*}</tex>. |
− | *Теперь покажем, что <tex>\mu | + | *Теперь покажем, что <tex>\mu^{*} \leqslant -\varepsilon^{*}</tex>. |
− | : | + | :Поскольку поток <tex>f</tex> не минимален, в остаточной сети существует отрицательный цикл, и тогда <tex>\mu(C)=\mu^{*} < 0</tex>. |
− | :Предположим, что существуют <tex>\varphi</tex> и <tex>\varepsilon</tex> такие, что <tex>\varepsilon > -\mu | + | :Предположим, что существуют <tex>\varphi</tex> и <tex>\varepsilon</tex> такие, что <tex>\varepsilon > -\mu^{*}</tex> или <tex>-\varepsilon < \mu^{*}</tex>. |
− | :Рассмотрим такое ребро <tex>uv</tex>, входящее в цикл, что величина <tex>p_{\varphi}(uv)</tex> минимальна. Тогда верно следующее: <tex>p_{\varphi}(uv) \leqslant \mu | + | :Рассмотрим такое ребро <tex>uv</tex>, входящее в цикл, что величина <tex>p_{\varphi}(uv)</tex> минимальна. Тогда верно следующее: <tex>p_{\varphi}(uv) \leqslant \mu^{*}</tex>, то есть <tex>p_{\varphi}(uv) < -\varepsilon</tex>, что означает, что <tex>f</tex> не является <tex>\varepsilon</tex>-оптимальным. Получено противоречие, и, значит, <tex>\varepsilon^{*} \leqslant -\mu^{*}</tex>. |
}} | }} | ||
{{Лемма | {{Лемма | ||
|id=lemma4 | |id=lemma4 | ||
− | |statement=Отмена цикла минимального среднего веса не увеличивает <tex>\varepsilon | + | |statement=Отмена цикла минимального среднего веса не увеличивает <tex>\varepsilon^{*}</tex>. |
|proof= | |proof= | ||
:Пусть <tex>C</tex> {{---}} цикл минимального среднего веса, который мы хотим отменить на текущем шаге нашего алгоритма. Перед тем, как мы отменим этот цикл, любое ребро в остаточной сети, в том числе, любое входящее в цикл <tex>C</tex> ребро <tex>uv</tex> удовлетворяет свойству <tex>\varepsilon(f)</tex>-оптимальности: <tex>p_{\varphi}(uv) \geqslant -\varepsilon(f)</tex>. | :Пусть <tex>C</tex> {{---}} цикл минимального среднего веса, который мы хотим отменить на текущем шаге нашего алгоритма. Перед тем, как мы отменим этот цикл, любое ребро в остаточной сети, в том числе, любое входящее в цикл <tex>C</tex> ребро <tex>uv</tex> удовлетворяет свойству <tex>\varepsilon(f)</tex>-оптимальности: <tex>p_{\varphi}(uv) \geqslant -\varepsilon(f)</tex>. |
Версия 15:59, 5 января 2017
В статье описывается один из сильно полиномиальных алгоритмов решения задачи о поиске потока минимальной стоимости.
Содержание
Алгоритм
Приведенный алгоритм основан на идее алгоритма Клейна отмены цикла отрицательного веса. Выбор цикла минимального среднего веса вместо случайного делает алгоритм сильно полиномиальным.
Определение: |
Сильно полиномиальными (англ. strongly polynomial) в контексте данной задачи называются алгоритмы, чья сложность полиномиально зависит от | и .
Описание
Обозначим как пропускную способность цикла при протекании в сети потока . Cтоимость цикла обозначим за , а длину (число входящих в него ребер) — за .
остаточнуюОпределение: |
Средним весом (англ. mean weight) цикла будем называть отношение его стоимости к его длине |
- Шаг 1. Рассмотрим некоторый поток .
- Шаг 2. Найдем цикл , обладающий наименьшим средним весом. Если , то — поток минимальной стоимости и алгоритм завершается.
- Шаг 3. Отменим цикл , пустив по нему максимально возможный поток: . Перейдем к шагу 1.
Сложность
, при этом времени тратится на поиск цикла минимального среднего веса.
Корректность
Пусть потенциалов .
— поток минимальной стоимости. Введем на нашей сети функциюОпределение: |
Приведенной стоимостью (англ. reduced cost) ребра назовем следующую величину: | .
Иными словами, приведенная стоимость — это сколько нужно потратить денег, чтобы перевезти единицу жидкости из
в . (Ее нужно купить в , перевезти из в и продать в .)Лемма: |
Если — поток минимальной стоимости, то такое, что . |
Доказательство: |
|
Определение: |
Будем говорить, что поток | — -оптимальный (англ. -optimal), если такая, что .
Лемма: |
Если стоимости целочисленны и поток — -оптимальный, где , то — поток минимальной стоимости. |
Доказательство: |
|
Обозначим за
минимальную величину среди средних весов циклов для потока , а за минимальное такое, что поток — -оптимальный.Лемма: |
Если — поток не минимальной стоимости, то . |
Доказательство: |
|
Лемма: |
Отмена цикла минимального среднего веса не увеличивает . |
Доказательство: |
|
Определение: |
Допустимым графом (англ. admissible graph) будем называть такой подграф остаточной сети, что он включает только ребра отрицательной приведенной стоимости. |
Лемма: |
Последовательность из отмен циклов минимального среднего веса уменьшает в не более чем раз. |
Доказательство: |
|
Лемма (доказательство оценки времени работы алгоритма): |
Пусть . Разобьем работу алгоритма на группы по последовательных итераций. Утверждается, что каждая группа фиксирует поток на независимом ребре , то есть итерации из другой группы не меняют величину . |
Доказательство: |
Оценка следует непосредственно из этого утверждения. Чтобы доказать его, рассмотрим некоторую группу итераций. Пусть | — поток до первой итерации рассматриваемой группы, а — поток после последней итерации. Также пусть для простоты обозначений , , при этом — функция потенциалов такая, что удовлетворяет свойству -оптимальности. Рассмотрим цикл , отмененный после первой итерации группы. Выбор дает нам . Поскольку средний вес цикла равен , некоторое ребро цикла должно иметь приведенную стоимость . Таким образом, поток на ребре не изменится при итерациях, происходящих после этой группы. Таким образом, каждая группа фиксирует поток на независимом ребре.
Алгоритм поиска цикла минимального среднего веса
Наивный способ
Устроим двоичный поиск. Установим нижнюю и верхнюю границы величины среднего веса цикла и соответственно, вычислим серединное значение и отнимем полученную величину от всех ребер сети. Если теперь в нашей сети есть отрицательный цикл (этот факт можно проверить при помощи алгоритма Форда-Беллмана), значит существует цикл с меньшим средним весом, чем . Тогда продолжим поиск среди значений в диапазоне от до , иначе — от до . Такой алгоритм будет работать за , где — точность выбора величины среднего веса цикла.
Продвинутый алгоритм
Добавим к нашему графу вершину алгоритм Форда-Беллмана и попросим его построить нам квадратную матрицу со следующим условием: — длина минимального пути от до ровно из ребер. Тогда длина оптимального цикла минимального среднего веса вычисляется как .
и ребра из нее во все остальные вершины. ЗапустимДостаточно будет доказать это правило для
, так как для других можно просто отнять эту величину от всех ребер и получить снова случай с .Чтобы найти цикл после построения матрицы
, запомним, при каких и достигается оптимальное значение , и, используя , поднимемся по указателям предков. Как только мы попадем в уже посещенную вершину — мы нашли цикл минимального среднего веса.Этот алогоритм работает за
.См. также
- Использование потенциалов Джонсона при поиске потока минимальной стоимости
- Сведение задачи о назначениях к задаче о потоке минимальной стоимости