Алгоритм отмены цикла минимального среднего веса — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Корректность)
(Корректность)
Строка 55: Строка 55:
 
*Теперь покажем, что <tex>\mu^{*} \leqslant -\varepsilon^{*}</tex>.
 
*Теперь покажем, что <tex>\mu^{*} \leqslant -\varepsilon^{*}</tex>.
 
:Поскольку поток <tex>f</tex> не минимален, в остаточной сети существует отрицательный цикл, и тогда <tex>\mu(C)=\mu^{*} < 0</tex>.  
 
:Поскольку поток <tex>f</tex> не минимален, в остаточной сети существует отрицательный цикл, и тогда <tex>\mu(C)=\mu^{*} < 0</tex>.  
:Предположим, что <tex>f</tex> является <tex>\varepsilon</tex>-оптимальным при <tex>\varepsilon > -\mu^{*}</tex> или <tex>-\varepsilon < \mu^{*}</tex>.  
+
:Предположим, что <tex>f</tex> является <tex>\varepsilon</tex>-оптимальным при <tex>\varepsilon > -\mu^{*}</tex>.  
 
:Рассмотрим такое ребро <tex>uv</tex>, входящее в цикл <tex>C</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>.
 
:Рассмотрим такое ребро <tex>uv</tex>, входящее в цикл <tex>C</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>.
 
}}
 
}}

Версия 16:10, 5 января 2017

В статье описывается один из сильно полиномиальных алгоритмов решения задачи о поиске потока минимальной стоимости.

Алгоритм

Приведенный алгоритм основан на идее алгоритма Клейна отмены цикла отрицательного веса. Выбор цикла минимального среднего веса вместо случайного делает алгоритм сильно полиномиальным.

Определение:
Сильно полиномиальными (англ. strongly polynomial) в контексте данной задачи называются алгоритмы, чья сложность полиномиально зависит от [math]V[/math] и [math]E[/math].

Описание

Обозначим как [math]c_{f}(C)[/math] остаточную пропускную способность цикла [math]C[/math] при протекании в сети потока [math]f[/math]. Cтоимость цикла [math]C[/math] обозначим за [math]p(C)[/math], а длину (число входящих в него ребер) — за [math]\texttt{len}(C)[/math].

Определение:
Средним весом (англ. mean weight) цикла будем называть отношение его стоимости к его длине [math]\mu (C)=\dfrac{p(C)}{\texttt{len}(C)}[/math]
  • Шаг 1. Рассмотрим некоторый поток [math]f[/math].
  • Шаг 2. Найдем цикл [math]C[/math], обладающий наименьшим средним весом. Если [math]\mu (C) \geqslant 0[/math], то [math]f[/math] — поток минимальной стоимости и алгоритм завершается.
  • Шаг 3. Отменим цикл [math]C[/math], пустив по нему максимально возможный поток: [math]f = f + c_{f}(C)\cdot f_{C}[/math]. Перейдем к шагу 1.

Сложность

[math]O(VE\cdot VE^{2}\log{V})[/math], при этом [math]O(VE)[/math] времени тратится на поиск цикла минимального среднего веса.

Корректность

Пусть [math]f[/math] — поток минимальной стоимости. Введем на нашей сети функцию потенциалов [math]\varphi[/math].

Определение:
Приведенной стоимостью (англ. reduced cost) ребра назовем следующую величину: [math]p_{\varphi}(uv)=\varphi(u) + p(uv) - \varphi(v)[/math].

Иными словами, приведенная стоимость — это сколько нужно потратить денег, чтобы перевезти единицу жидкости из [math]u[/math] в [math]v[/math]. (Ее нужно купить в [math]u[/math], перевезти из [math]u[/math] в [math]v[/math] и продать в [math]v[/math].)

Лемма:
Если [math]f[/math] — поток минимальной стоимости, то [math]\exists \varphi[/math] такое, что [math]\forall uv: \; c_{f}(uv) \gt 0 \qquad p_{\varphi}(uv) \geqslant 0[/math].
Доказательство:
[math]\triangleright[/math]
Рассмотрим остаточную сеть — граф [math]G_{f}[/math]. В нем нет отрицательных циклов, так как [math]f[/math] — поток минимальной стоимости[1].
Добавим вершину [math]a[/math] и проведем из нее ребро стоимости [math]0[/math] во все вершины графа [math]G_{f}[/math]. В качестве [math]\varphi(u)[/math] выберем стоимость минимального пути из [math]a[/math] в [math]u[/math].
Рассмотрим теперь некоторое ребро [math]uv[/math]. Понятно, что [math]\varphi(v) \leqslant \varphi(u) + p(uv)[/math]. (Здесь сравниваются минимальный путь [math]a \rightsquigarrow v[/math] и путь [math]a \rightsquigarrow u \rightarrow v[/math]). Перенеся [math]\varphi(v)[/math] в другую часть неравенства, получаем [math]0 \leqslant \varphi(u) + p(uv) - \varphi(v)[/math] или [math]0 \leqslant p_{\varphi}(uv)[/math], что и требовалось доказать.
[math]\triangleleft[/math]


Определение:
Будем говорить, что поток [math]f[/math][math]\varepsilon[/math]-оптимальный (англ. [math]\varepsilon[/math]-optimal), если [math]\exists \varphi[/math] такая, что [math]\forall uv: c_{f}(uv) \gt 0 \qquad p_{\varphi}(uv) \geqslant -\varepsilon[/math].


Лемма:
Если стоимости целочисленны и поток [math]f[/math][math]\varepsilon[/math]-оптимальный, где [math]\varepsilon \lt \dfrac{1}{V}[/math], то [math]f[/math] — поток минимальной стоимости.
Доказательство:
[math]\triangleright[/math]
Рассмотрим цикл в остаточной сети [math]C[/math]. Заметим, что [math]p(C)=p_{\varphi}(C)[/math] (для доказательства этого факта достаточно расписать [math]p_{\varphi}(C)[/math] по определению).
Возьмем [math]\varphi[/math] такое, что стоимости всех ребер в [math]C[/math] не меньше [math]-\varepsilon[/math]. Тогда стоимость всего цикла [math]p_{\varphi}(C)\geqslant -V\cdot \varepsilon[/math] (в цикле не больше [math]V[/math] ребер). Таким образом, [math]p_{\varphi}(C) \gt -1[/math], то есть [math]p(C) \gt -1[/math]. Но исходные пропускные способности были целочисленными, поэтому [math]p(C) \geqslant 0[/math], а это означает, что в остаточной сети нет отрицательных циклов, и, соответственно, [math]f[/math] — поток минимальной стоимости.
[math]\triangleleft[/math]

Обозначим за [math]\mu^{*}[/math] минимальную величину среди средних весов циклов для потока [math]f[/math], а за [math]\varepsilon^{*}[/math] минимальное [math]\varepsilon[/math] такое, что поток [math]f[/math][math]\varepsilon[/math]-оптимальный.

Лемма:
Если [math]f[/math] — поток не минимальной стоимости, то [math]\varepsilon^{*}=-\mu^{*}[/math].
Доказательство:
[math]\triangleright[/math]
Пусть [math]C[/math] — цикл минимального среднего веса в остаточной сети.
  • Покажем, что [math]\mu^{*} \geqslant -\varepsilon^{*}[/math].
Поскольку поток [math]f[/math] является [math]\varepsilon^{*}[/math]-оптимальным, верно следующее: [math]p(C) = p_{\varphi}(C) \geqslant -\texttt{len}(C) \cdot \varepsilon^{*}[/math] или [math]\dfrac{p(C)}{\texttt{len}(C)} \geqslant -\varepsilon^{*} [/math], то есть [math]\mu(C)=\mu^{*} \geqslant -\varepsilon^{*}[/math].
  • Теперь покажем, что [math]\mu^{*} \leqslant -\varepsilon^{*}[/math].
Поскольку поток [math]f[/math] не минимален, в остаточной сети существует отрицательный цикл, и тогда [math]\mu(C)=\mu^{*} \lt 0[/math].
Предположим, что [math]f[/math] является [math]\varepsilon[/math]-оптимальным при [math]\varepsilon \gt -\mu^{*}[/math].
Рассмотрим такое ребро [math]uv[/math], входящее в цикл [math]C[/math], что величина [math]p_{\varphi}(uv)[/math] минимальна. Тогда верно следующее: [math]p_{\varphi}(uv) \leqslant \mu^{*}[/math], то есть [math]p_{\varphi}(uv) \lt -\varepsilon[/math], что означает, что [math]f[/math] не является [math]\varepsilon[/math]-оптимальным. Получено противоречие, и, значит, [math]\varepsilon^{*} \leqslant -\mu^{*}[/math].
[math]\triangleleft[/math]
Лемма:
Отмена цикла минимального среднего веса не увеличивает [math]\varepsilon^{*}[/math].
Доказательство:
[math]\triangleright[/math]
Пусть [math]C[/math] — цикл минимального среднего веса, который мы хотим отменить на текущем шаге нашего алгоритма. Перед тем, как мы отменим этот цикл, любое ребро в остаточной сети, в том числе, любое входящее в цикл [math]C[/math] ребро [math]uv[/math] удовлетворяет свойству [math]\varepsilon(f)[/math]-оптимальности: [math]p_{\varphi}(uv) \geqslant -\varepsilon(f)[/math].
По предыдущей лемме, [math]\varepsilon(f)=-\mu(f)[/math], то есть [math]p_{\varphi}(uv) \geqslant \mu(f)[/math]. Но поскольку [math]\mu(f)[/math] — средний вес цикла, то [math]p_{\varphi}(uv) = \mu(f) = -\varepsilon(f)[/math].
По свойству антисимметричности потока, после отмены цикла [math]C[/math], в остаточной сети появятся ребра стоимости [math]\varepsilon[/math]. Таким образом, свойство [math]p_{\varphi}(uv) \geqslant -\varepsilon[/math] все еще выполняется.
[math]\triangleleft[/math]


Определение:
Допустимым графом (англ. admissible graph) будем называть такой подграф остаточной сети, что он включает только ребра отрицательной приведенной стоимости. [math]E=\{uv \in E_{f}\;|\; p_{\varphi}(uv) \lt 0\}[/math]
Лемма:
Последовательность из [math]m[/math] отмен циклов минимального среднего веса уменьшает [math]\varepsilon(f)[/math] в не более чем [math]\left(1-\dfrac{1}{V}\right)^{m}[/math] раз.
Доказательство:
[math]\triangleright[/math]
Рассмотрим последовательность [math]m[/math] отмен циклов минимального среднего веса. Изначально любое ребро [math]uv[/math] удовлетворяет свойству [math]p_{\varphi}(uv) \leqslant -\varepsilon[/math]. Отмена цикла добавляет в остаточную сеть [math]G_{f}[/math] только ребра положительной приведенной стоимости (см. предыдущую лемму) и удаляет из сети [math]G[/math] как минимум одно ребро. Рассмотрим два случая:
  1. Ни один из отмененных циклов не содержал ребер, обладающих неотрицательной приведенной стоимостью. Тогда каждая отмена цикла уменьшает размер допустимого графа [math]E[/math] и после [math]m[/math] отмен граф [math]E[/math] пуст, что означает, что [math]f[/math] — оптимальный поток, то есть [math]\varepsilon(f)=0[/math].
  2. Некоторые из отмененных циклов содержат ребра неотрицательной приведенной стоимости. Пусть [math]C[/math] — первый из таких циклов. Каждое ребро в [math]C[/math] обладает приведенной стоимостью как минимум [math]-\varepsilon[/math], хотя бы одно из ребер [math]C[/math] обладает неотрицательной приведенной стоимостью, количество ребер в [math]C[/math] не превышает [math]V[/math]. Тогда средний вес цикла [math]\mu(C) \geqslant -\left(1-\dfrac{1}{V}\right)\varepsilon[/math]. Тогда непосредственно перед отменой [math]C[/math], [math]\varepsilon(f) \leqslant \left(1-\dfrac{1}{V}\right)\varepsilon[/math] (по лемме). Поскольку мы знаем, что [math]\varepsilon(f)[/math] не увеличивается, доказываемое утверждение верно.
[math]\triangleleft[/math]
Лемма (доказательство оценки времени работы алгоритма):
Пусть [math]k=VE(\lceil \log V + 1 \rceil)[/math]. Разобьем работу алгоритма на группы по [math]k[/math] последовательных итераций. Утверждается, что каждая группа фиксирует поток на независимом ребре [math]uv[/math], то есть итерации из другой группы не меняют величину [math]f(uv)[/math].
Доказательство:
[math]\triangleright[/math]
Оценка следует непосредственно из этого утверждения. Чтобы доказать его, рассмотрим некоторую группу итераций. Пусть [math]f[/math] — поток до первой итерации рассматриваемой группы, а [math]f'[/math] — поток после последней итерации. Также пусть для простоты обозначений [math]\varepsilon = \varepsilon(f)[/math], [math]\varepsilon'=\varepsilon(f')[/math], при этом [math]\varphi'[/math] — функция потенциалов такая, что [math]f'[/math] удовлетворяет свойству [math]\varepsilon'[/math]-оптимальности. Рассмотрим цикл [math]C[/math], отмененный после первой итерации группы. Выбор [math]k[/math] дает нам [math]\varepsilon' \leqslant \varepsilon \left(1-\dfrac{1}{V} \right)^{V(\log V + 1)} \leqslant \dfrac{\varepsilon}{2V}[/math]. Поскольку средний вес цикла [math]C[/math] равен [math]-\varepsilon[/math], некоторое ребро [math]uv[/math] цикла [math]C[/math] должно иметь приведенную стоимость [math]p_{\varphi'}(uv) \leqslant -\varepsilon \leqslant -2V\varepsilon'[/math]. Таким образом, поток на ребре [math]uv[/math] не изменится при итерациях, происходящих после этой группы. Таким образом, каждая группа фиксирует поток на независимом ребре.
[math]\triangleleft[/math]

Алгоритм поиска цикла минимального среднего веса

Наивный способ

Устроим двоичный поиск. Установим нижнюю и верхнюю границы величины среднего веса цикла [math]l[/math] и [math]r[/math] соответственно, вычислим серединное значение [math]m[/math] и отнимем полученную величину [math]m[/math] от всех ребер сети. Если теперь в нашей сети есть отрицательный цикл (этот факт можно проверить при помощи алгоритма Форда-Беллмана), значит существует цикл с меньшим средним весом, чем [math]m[/math]. Тогда продолжим поиск среди значений в диапазоне от [math]l[/math] до [math]m[/math], иначе — от [math]m[/math] до [math]r[/math]. Такой алгоритм будет работать за [math]O(\texttt{log} \dfrac{1}{\varepsilon} \cdot EV)[/math], где [math]\varepsilon[/math] — точность выбора величины среднего веса цикла.

Продвинутый алгоритм

Добавим к нашему графу вершину [math]s[/math] и ребра из нее во все остальные вершины. Запустим алгоритм Форда-Беллмана и попросим его построить нам квадратную матрицу со следующим условием: [math]d[i][u][/math] — длина минимального пути от [math]s[/math] до [math]u[/math] ровно из [math]i[/math] ребер. Тогда длина оптимального цикла [math]\mu^{*}[/math] минимального среднего веса вычисляется как [math]\min\limits_{u} {\max\limits_{k} {\dfrac{d[n][u]-d[k][u]}{n-k}}}[/math].

Достаточно будет доказать это правило для [math]\mu^{*}=0[/math], так как для других [math]\mu^{*}[/math] можно просто отнять эту величину от всех ребер и получить снова случай с [math]\mu^{*}=0[/math].

Чтобы найти цикл после построения матрицы [math]d[k][u][/math], запомним, при каких [math]u[/math] и [math]k[/math] достигается оптимальное значение [math]\mu^{*}[/math], и, используя [math]d[n][u][/math], поднимемся по указателям предков. Как только мы попадем в уже посещенную вершину — мы нашли цикл минимального среднего веса.

Этот алогоритм работает за [math]O(VE)[/math].

См. также

Примечания

Источники информации