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

Материал из Викиконспекты
Версия от 22:32, 4 января 2017; 178.70.223.185 (обсуждение) (Корректность)
Перейти к: навигация, поиск

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

Алгоритм

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

Определение:
Сильно полиномиальными (англ. 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]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]\triangleleft[/math]

Сложность

[math]O(VE\cdot VE^{2}\log{V})[/math], при этом [math]O(VE)[/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].

См. также

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