Поток минимальной стоимости

Материал из testwiki
Перейти к навигации Перейти к поиску

Задача о потоке минимальной стоимости состоит в нахождении самого дешёвого способа передачи потока определённой величины через транспортную сеть.

Определения

Дана транспортная сеть G(V,E) с источником s∈V и стоком t∈V, где рёбра e∈E имеют пропускную способность c(e), поток f(e) и цену a(e). Цена пересылки потока для ребра e равна f(e)⋅a(e). Необходимо найти поток величиной d единиц.

Суть задачи — найти поток f(u, v), минимизирующий его общую стоимость:

∑u,v∈Va(u,v)⋅f(u,v)

Накладываются следующие условия:

Ограничение пропускной способности: 0⩽f(u,v)⩽c(u,v). Поток не может превысить пропускную способность.
Антисимметричность:  f(u,v)=−f(v,u). Поток из u в v должен быть противоположным потоку из v в u.
Сохранение потока:  ∑w∈Vf(u,w)=0.
Необходимый поток: ∑w∈Vf(s,w)=d

Отношение к другим задачам

Другой вариант этой задачи — найти максимальный поток имеющий минимальную цену среди максимальных.

Более общая проблема — циркуляция потока минимальной стоимости, которая может быть использована для решения данной задачи. Ставим нижнюю границу для всех рёбер равную нулю и проводим дополнительное ребро из стока t в источник s с пропускной способностью c(t,s)=d и нижней границей l(t,s)=d.

Примечательно, что для d=1, задача нахождения потока минимальной стоимости соответствует задаче о поиске кратчайшего пути. В случае же, когда стоимость a(e)=0 для всех рёбер графа, задача может быть решена адаптированными алгоритмами поиска максимального потока:

  1. Как только |f|⩾d впервые, останови алгоритм.
  2. Пусть p величина последнего дополнения потока.
  3. Замени последний поток на поток со значением p−(|f|−d).

Существует также и альтернативный вариант решения задачи с нулевой стоимостью рёбер:

  1. Создай новую вершину-источник s′.
  2. Добавь ребро e′=(s′,s) с пропускной способностью c(e′)=d.
  3. Таким образом максимальный поток будет ограничен d.

Решения

  • Задача о потоке минимальной стоимости может быть решена с помощью линейного программирования.
  • Найти любой поток данной величины, после чего избавиться от всех циклов отрицательной стоимости в остаточном графе. Чтобы избавиться от цикла, надо пустить по нему максимально возможный поток. Циклы ищутся алгоритмом Беллмана - Форда. Для доказательства работы алгоритма покажем, что поток f графа G не является потоком минимальной стоимости пока остаточная сеть графа Gf содержит отрицательный цикл C. Пусть f∗ - поток графа G такой, что l(f∗)<l(f) и, следовательно, оба потока отличны друг от друга. Для всех рёбер e∈E обозначим f′(e)=f∗(e)−f(e) и получим f′ - циклический поток. Так как f′ образован из максимум m′<m циклов f'i (1⩽i⩽m′), справедливо следующее: l(f′)=l(f∗)−l(f)=∑1⩽i⩽m′l(f'i), а значит, существует такой j, что l(f'j)<0. Для оптимизиации алгоритма можно выбирать каждую итерацию циклы с минимальной средней стоимостью l‾(C)=l(C)|C|=∑e∈Cl(e)|C|. Для доказательства времени работы алгоритма разобьем ход его выполнения на фазы, каждая из которых будет состоять из отдельных итераций. Пусть f - поток к началу i-той фазы. Фаза i считается завершенной, когда найден поток g такой, что μ(g)⩽(1−1/n)⋅μ(f) или μ(g)⩽0, где μ(f)=−l‾(C). При μ(g)⩽0 алгоритм прекращает работу. Далее пусть μ0 - значение μ к началу первой фазы и μi - значение μ к началу i-той фазы (1⩽i⩽T). Таким образом действительно: μi⩽(1−1/n)⋅μi−1⩽μi−1e1/n, а также μ0⩽L=∑e∈E|l(e)|. Вследствие свойства целочисленности μT−1⩾1/n следует T−1⩽loge1/n(nL)=ln⁡(nL)ln⁡(e1/n)=nln⁡(nL) и T⩽nln⁡(nL)+1. Итерации условно можно разбить на несколько видов: Тип 1 - цикл C содержит только рёбра с негативной стоимостью и Тип 2 - цикл C содержит минимум одно ребро с положительной стоимостью. При каждой итерации первого типа будет "насыщено" и удалено хотя бы одно ребро. При этом все образованные рёбра будут иметь положительную стоимость (так как имеют обратное направление в остаточной сети). Таким образом алгоритм завершится после как минимум m последовательных итераций первого типа. Если же в фазе содержатся более m итераций, после m−1 итераций максимум будет выполнена итерация второго типа. Покажем однако, что такое невозможно: Пусть g - поток первой итерации второго типа. Заметим, что действительно ∀e∈E(Gg):l(e)⩾−μ(f), т.е. нет новых рёбер с отрицательной стоимостью. Пусть C - цикл в Gg с минимальным l‾(C) и H - рёбра с отрицательной стоимостью в C: μ(g)=∑e∈C−l(e)|C|⩽∑e∈H−l(e)|C|⩽|H|⋅μ(f)|C|. Из |H|⩽|C|−1 следует |H|/|C|⩽1−1/|C|⩽1−1/n. Таким образом μ(g)⩽(1−1/n)⋅μ(f). Противоречие - мы уже достигли конца фазы, а значит итераций второго типа не существует и каждая фаза заканчивается через m−1 итераций первого типа. Цикл с минимальным средним весом может быть найден за O(|V||E|). Доказательство: Пусть dk(v) - стоимость самого выгодного пути к v∈V через ровно k рёбер, тогда действительно d0(v)=0 и dk+1(v)=mine=(w,v)∈Ef(dk(w)+l(e)). Выходит, что все значения dk(v) можно подсчитать за O(nm) используя динамическое программирование. Лемма: Значение l‾(C) цикла с минимальной средней стоимостью равно α=minv∈Vmaxj=0n−1(dn(v)−dj(v)n−j). Пусть C - цикл с минимальной средней стоимостью. Если увеличить стоимость всех рёбер на δ, то C останется циклом с минимальной средней стоимостью, однако значение цикла увеличится на δ. таким образом можно увеличить все стоимости рёбер так, что l‾(C)=0. Покажем, что α⩾0: Выеберем любую вершину v и путь P, заканчивающийся в v и имеющий стоимость dn(v). P должен содержать цикл C. Пусть P′ - путь P не содержащий цикла C и имеющий длину j. Тогда в цикле имеется n−j рёбер. Из-за l(C)⩾0 справедливо dn(v)=l(P)=l(C)+l(P′)⩾l(P′)⩾dj(v) и для каждой вершины v существует j∈{1,...,n−1} такой, что dn(v)⩾dj(v). Покажем, что α⩽0: Для этого докажем, что существует вершина w для которой истино dn(w)⩽dj(w) для всех j∈{1,...,n−1}. Пусть v - вершина цикла с минимальной средней стоимостью C, P - кратчайший путь, заканчивающийся на v и не содержащий в себе цикла. пусть p<n количество вершин в P. Также ввёдем вершину w, которая лежит на C на расстоянии n−p вершин от v. Путь от v к w назовём Q. Пусть R - путь из w к v, а S - путь минимальной длины j из источника графа к w. Тогда истино следующее: dn(w)⩽l(P)+l(Q)=dp(v)+l(Q), а также dp(v)⩽dj+r(v)⩽dj(w)+l(R) и из них следует, что dn(w)⩽dj(w)+l(R)+l(Q). Путь Q⊙R имеет стоимость 0, т.к. l(C)=0. Таким образом dn(w)⩽dj(w) для всех j∈{1,...,n−1}. Учитывая лемму, получим α⩽0. Время выполнения такого алгоритам составит O(m2⋅n2⋅log⁡(nL)), так как в процессе выполнения алгоритма пройдут nlog⁡(nL)+1 фаз, в каждой из которых m итераций, требующих O(nm) времени. Основываясь не предидущей оценке времени можно составить и следующую: O(m3⋅n2⋅log⁡(n)).
  • Использовать модификацию алгоритма Форда — Фалкерсона, в которой на каждом шаге выбирается увеличивающий путь минимальной цены. Для выбора пути можно воспользоваться алгоритмом Беллмана-Форда.
  • Улучшение предыдущего алгоритма: используя потенциалы, можно свести задачу к задаче без отрицательных рёбер, после чего вместо алгоритма Беллмана-Форда воспользоваться алгоритмом Дейкстры. Алгоритм Беллмана-Форда придётся применить лишь на самом первом шаге.

Ссылки

См. также

Литература