Какой алгоритм мне следует использовать, чтобы найти минимальный поток на орграфе, где есть нижние границы, но не верхние границы потока?

Какой алгоритм мне следует использовать, чтобы найти минимальный поток на орграфе, где есть нижние границы, но не верхние границы потока? Например, этот простой пример:

Схема простого примера. Источник:‹ jwezorek.com/wp-content/uploads/2013/09/min_flow.png ›

В литературе это проблема с минимальными затратами. Однако в моем случае стоимость такая же, как и ненулевая нижняя граница потока, требуемого на каждом ребре, поэтому я сформулировал вопрос, как указано выше. В литературе возникает вопрос: каков наилучший алгоритм для поиска потока с минимальной стоимостью для ориентированного ациклического графа с одним источником / одним стоком, в котором каждое ребро имеет бесконечную пропускную способность, ненулевую нижнюю границу потока и стоимость равна нижней границе расхода.

Из моего исследования кажется, что основной способ, которым люди справляются с любой минимальной стоимостью любого типа сети, - это формулировать проблему как проблема типа LP и решите ее. Однако моя интуиция подсказывает, что не имея верхней границы потока, т. Е. наличие ребер с бесконечными емкостями упрощает задачу, поэтому мне было интересно, есть ли алгоритм, специально нацеленный на этот случай, использующий больше "графических" техник, чем симплексный метод и т. д. al.

Я имею в виду, что если все затраты и нижние границы равны 1, как указано выше ... тогда мы ищем поток, который покрывает все края, подчиняется правилам потока и не проталкивает слишком много потока через любой путь от s до t . Мне просто кажется, что мне не нужен решатель LP, и действительно, в статье в Википедии о потоках минимальной стоимости говорится, что «если ограничение емкости удаляется, проблема сводится к проблеме кратчайшего пути», но я думаю, что они говорят о случай, когда все нижние границы равны нулю.

Также есть ли где-либо код C / C ++ с открытым исходным кодом для минимальных затрат? Погуглив, что доступно, я обнаружил, что могу либо установить проблему как проблему LP и решить ее с помощью решателя LP с открытым исходным кодом, либо я могу использовать LEMON, который предоставляет несколько алгоритмов для потока минимальной стоимости. Насколько я могу судить, библиотека графов ускорений не включает реализации.

Есть ли еще что-нибудь?


person jwezorek    schedule 03.09.2013    source источник
comment
хорошая звезда в названии, лол   -  person Natan Streppel    schedule 06.09.2013
comment
Я вообще-то не знаю, откуда взялась эта звезда ...   -  person jwezorek    schedule 07.09.2013


Ответы (3)


В отсутствие верхних границ самый простой способ - самый простой для реализации, понимания и достаточно эффективный - найти минимальный поток графа:

  1. Найдите допустимый поток, то есть поток, который удовлетворяет правилам потока и нижним границам потока, но не обязательно является минимальным потоком. Этого можно достичь, выполняя обход графа в глубину, отслеживая текущий путь по мере того, как мы проходим, и при посещении ранее обнаруженного узла или целевого узла t, увеличивая поток на текущем пути с максимальным нижним значением. -связка неудовлетворенных ребер на текущем пути до t.

  2. Превратите возможный расход в минимальный, решив задачу о максимальном расходе. Вам нужно найти максимальный поток на графике, который имеет пропускную способность, равную потоку (e) - нижняя граница (e), где поток (e) означает поток из допустимого потока. Этот максимальный расход, вычтенный из допустимого расхода, будет минимальным расходом.

Вариант вышеизложенного также может быть выполнен в случае, когда граф также имеет верхние границы для потока. В этом случае шаг 1. более сложен, но его можно решить, выполнив начальное вычисление максимального потока на специально построенном графе.

person jwezorek    schedule 13.11.2013

Написать решатель нетривиально.

См. Библиотеку LEMON (часть COIN-OR). Он имеет ряд высоко оптимизированных алгоритмов для решения проблемы минимальной стоимости потока. Вы можете выбрать, какой алгоритм лучше всего работает с вашими данными.

См. http://lemon.cs.elte.hu/trac/lemon для получения информации о ЛИМОН.

См. http://lemon.cs.elte.hu/pub/doc/1.3/a00607.html для получения подробной информации о минимальной стоимости сетевого потока.

person EMS    schedule 28.10.2013

Добавьте все «нижние границы» потоков на каждом ребре: это все равно потребуется для любого допустимого решения.

Для каждого узла n в топологическом порядке (т. Е. По ребрам) от приемника t, если сумма S- того, что идет по ребру, больше, чем сумма S+ того, что выходит, тогда добавьте поток S+ - S- на всех ребрах кратчайший путь между s и t (для повышения эффективности составьте список кратчайших путей).

Затем у вас есть «минимальное» задание (в том смысле, что оно необходимо для каждого возможного решения), например, S+ - S- неотрицательно на каждом узле, а минимальная пропускная способность удовлетворяется на каждом ребре.

Затем проблема сводится к проблеме с несколькими потоками на той же структуре графа:

  • источник тот же;
  • нет ограничения мощности;
  • каждый узел, где S+ - S- строго положителен, становится стоком с требуемым потоком S+ - S-.
  • начальный сток (который имел требуемый поток F) становится стоком с потоком F - S-, если F-S- неотрицательный (в противном случае начальное ограничение будет удовлетворено любым решением).

Изменить: для вашей проблемы график выглядит так

     x1 -- x2
   /   \     \
 s      \     t
   \     \   /
     x3 -- x4

с минимальной пропускной способностью 1 для каждого ребра, и я полагаю, что на приемнике t не требуется минимального потока.

Сначала присвойте 1 каждому ребру.

Разница S+ - S- для каждого узла (кроме, конечно, s и t):

x1: 1
x2: 0
x3: 0
x4: -1

единственный отрицательный - для x4; мы добавляем 1 к каждому ребру на кратчайшем пути от x4 до t, в этом случае к ребру (x4, t).

Теперь S+ - S- неотрицательно для каждого узла и положительно только для x1; проблема сводится к проблеме с несколькими потоками (в этом случае это простая проблема с потоком), где запрошенный поток равен 1 в x1, а источник по-прежнему s.

person Nicolas Grebille    schedule 06.09.2013
comment
Итак, f - это назначение потока, в котором поток через каждое ребро просто равен нижней границе? - person jwezorek; 06.09.2013
comment
f не будет законным потоком, что означает, что для данного узла входящий поток не будет равен исходящему потоку. Поэтому простое увеличение f по кратчайшему пути от s до t не обязательно приведет к законному потоку. Как насчет узлов f, где сохранение потока не выполняется, например, не на кратчайшем пути. - person jwezorek; 06.09.2013
comment
Да ты прав. Пробую адаптировать решение прямо сейчас, подредактирую ответ, если заработает. - person Nicolas Grebille; 06.09.2013
comment
Я не слежу, извините ... для примера проблемы, которую я опубликовал, как будет выглядеть минимальное назначение и какую проблему с несколькими потоками оно приведет? Не могли бы вы выложить схему шага предлагаемого вами алгоритма - я мог бы понять это из этого. - person jwezorek; 06.09.2013
comment
Я добавил пример вашей проблемы (я предполагаю, что в исходной задаче нет требуемого потока в раковине). - person Nicolas Grebille; 06.09.2013
comment
Нет требуемого потока ни на одном из узлов в проблемных только ребрах. Вы сводите проблему к задаче минимизации нескольких приемников без пропускной способности или нижних границ, чтобы она превратилась в кратчайший путь? Это верно? - person jwezorek; 07.09.2013