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

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

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

Определения

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

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

u,vVa(u,v)f(u,v)

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

Ограничение пропускной способности: 0f(u,v)c(u,v). Поток не может превысить пропускную способность.
Антисимметричность:  f(u,v)=f(v,u). Поток из u в v должен быть противоположным потоку из v в u.
Сохранение потока:  wVf(u,w)=0.
Необходимый поток: wVf(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) и, следовательно, оба потока отличны друг от друга. Для всех рёбер eE обозначим f(e)=f*(e)f(e) и получим f - циклический поток. Так как f образован из максимум m<m циклов f'i (1im), справедливо следующее: l(f)=l(f*)l(f)=1iml(f'i), а значит, существует такой j, что l(f'j)<0. Для оптимизиации алгоритма можно выбирать каждую итерацию циклы с минимальной средней стоимостью l(C)=l(C)|C|=eCl(e)|C|. Для доказательства времени работы алгоритма разобьем ход его выполнения на фазы, каждая из которых будет состоять из отдельных итераций. Пусть f - поток к началу i-той фазы. Фаза i считается завершенной, когда найден поток g такой, что μ(g)(11/n)μ(f) или μ(g)0, где μ(f)=l(C). При μ(g)0 алгоритм прекращает работу. Далее пусть μ0 - значение μ к началу первой фазы и μi - значение μ к началу i-той фазы (1iT). Таким образом действительно: μi(11/n)μi1μi1e1/n, а также μ0L=eE|l(e)|. Вследствие свойства целочисленности μT11/n следует T1loge1/n(nL)=ln(nL)ln(e1/n)=nln(nL) и Tnln(nL)+1. Итерации условно можно разбить на несколько видов: Тип 1 - цикл C содержит только рёбра с негативной стоимостью и Тип 2 - цикл C содержит минимум одно ребро с положительной стоимостью. При каждой итерации первого типа будет "насыщено" и удалено хотя бы одно ребро. При этом все образованные рёбра будут иметь положительную стоимость (так как имеют обратное направление в остаточной сети). Таким образом алгоритм завершится после как минимум m последовательных итераций первого типа. Если же в фазе содержатся более m итераций, после m1 итераций максимум будет выполнена итерация второго типа. Покажем однако, что такое невозможно: Пусть g - поток первой итерации второго типа. Заметим, что действительно eE(Gg):l(e)μ(f), т.е. нет новых рёбер с отрицательной стоимостью. Пусть C - цикл в Gg с минимальным l(C) и H - рёбра с отрицательной стоимостью в C: μ(g)=eCl(e)|C|eHl(e)|C||H|μ(f)|C|. Из |H||C|1 следует |H|/|C|11/|C|11/n. Таким образом μ(g)(11/n)μ(f). Противоречие - мы уже достигли конца фазы, а значит итераций второго типа не существует и каждая фаза заканчивается через m1 итераций первого типа. Цикл с минимальным средним весом может быть найден за O(|V||E|). Доказательство: Пусть dk(v) - стоимость самого выгодного пути к vV через ровно k рёбер, тогда действительно d0(v)=0 и dk+1(v)=mine=(w,v)Ef(dk(w)+l(e)). Выходит, что все значения dk(v) можно подсчитать за O(nm) используя динамическое программирование. Лемма: Значение l(C) цикла с минимальной средней стоимостью равно α=minvVmaxj=0n1(dn(v)dj(v)nj). Пусть C - цикл с минимальной средней стоимостью. Если увеличить стоимость всех рёбер на δ, то C останется циклом с минимальной средней стоимостью, однако значение цикла увеличится на δ. таким образом можно увеличить все стоимости рёбер так, что l(C)=0. Покажем, что α0: Выеберем любую вершину v и путь P, заканчивающийся в v и имеющий стоимость dn(v). P должен содержать цикл C. Пусть P - путь P не содержащий цикла C и имеющий длину j. Тогда в цикле имеется nj рёбер. Из-за l(C)0 справедливо dn(v)=l(P)=l(C)+l(P)l(P)dj(v) и для каждой вершины v существует j{1,...,n1} такой, что dn(v)dj(v). Покажем, что α0: Для этого докажем, что существует вершина w для которой истино dn(w)dj(w) для всех j{1,...,n1}. Пусть v - вершина цикла с минимальной средней стоимостью C, P - кратчайший путь, заканчивающийся на v и не содержащий в себе цикла. пусть p<n количество вершин в P. Также ввёдем вершину w, которая лежит на C на расстоянии np вершин от 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). Путь QR имеет стоимость 0, т.к. l(C)=0. Таким образом dn(w)dj(w) для всех j{1,...,n1}. Учитывая лемму, получим α0. Время выполнения такого алгоритам составит O(m2n2log(nL)), так как в процессе выполнения алгоритма пройдут nlog(nL)+1 фаз, в каждой из которых m итераций, требующих O(nm) времени. Основываясь не предидущей оценке времени можно составить и следующую: O(m3n2log(n)).
  • Использовать модификацию алгоритма Форда — Фалкерсона, в которой на каждом шаге выбирается увеличивающий путь минимальной цены. Для выбора пути можно воспользоваться алгоритмом Беллмана-Форда.
  • Улучшение предыдущего алгоритма: используя потенциалы, можно свести задачу к задаче без отрицательных рёбер, после чего вместо алгоритма Беллмана-Форда воспользоваться алгоритмом Дейкстры. Алгоритм Беллмана-Форда придётся применить лишь на самом первом шаге.

Ссылки

См. также

Литература