Быстрая библиотека минимального потока для Python

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

pygraph.algorithms.minmax.maximum_flow из python-graph решает проблему, но она мучительно медленная: поиск максимальных потоков и минимальных разрезов в ориентированном графе с чем-то вроде 4000 узлов и 11000 ребер занимает > 1 минута. Я ищу что-то, что по крайней мере на порядок быстрее.

Bounty. Я предлагаю щедрость по этому вопросу, чтобы увидеть, изменилась ли ситуация с тех пор, как был задан этот вопрос. Бонусные баллы, если у вас есть личный опыт работы с библиотекой, которую вы рекомендуете!

Ответы

Ответ 1

Я использовал graph-tool для подобных задач.

Graph-tool - эффективный модуль python для манипулирования и статистического анализа графиков (сети a.k.a.). Они даже имеют превосходную документацию о алгоритмах максимального потока.

Графический инструмент поддерживает следующие алгоритмы:

  • Edmonds-Karp - Рассчитать максимальный поток на графике с помощью алгоритма Эдмондса-Карпа.
  • Push relabel - Рассчитать максимальный поток на графике с помощью алгоритма push-relabel.
  • Бойков Колмогоров - Рассчитать максимальный поток на графе с алгоритмом Бойкова-Колмогорова.

Пример из документа: найти maxflow с помощью Boykov-Kolmogorov:

>>> g = gt.load_graph("flow-example.xml.gz") #producing example is in doc
>>> cap = g.edge_properties["cap"]
>>> src, tgt = g.vertex(0), g.vertex(1)
>>> res = gt.boykov_kolmogorov_max_flow(g, src, tgt, cap)
>>> res.a = cap.a - res.a  # the actual flow
>>> max_flow = sum(res[e] for e in tgt.in_edges())
>>> print max_flow
6.92759897841
>>> pos = g.vertex_properties["pos"]
>>> gt.graph_draw(g, pos=pos, pin=True, penwidth=res, output="example-kolmogorov.png")

Я выполнил этот пример со случайным ориентированным графом (узлы = 4000, вершины = 23964), весь процесс занял всего 11 секунд.

альтернативные библиотеки:

Ответ 2

Я не знаю, быстрее ли это, вам нужно проверить это, но попробовали ли вы networkx? Похоже, что он предлагает функцию, которую вы ищете, и по моему опыту это очень простая в использовании библиотека для обработки графиков.

Ответ 3

Для действительно хорошей производительности вы можете попробовать переформулировать свою проблему в виде целочисленной линейной программы, любой из стандартных инструментов ILP должен дать вам более чем достаточную производительность.

Википедия содержит хороший список таких коммерческих и открытых источников tools, многие из которых, похоже, имеют привязки к python. Среди наиболее известных CPLEX и lp_solve.

Я лично использовал lp_solve разумно в течение последних нескольких лет и счел достаточным написать запись в lp_solve как текстовые файлы и вызовите lp_solve, используя оболочку. Думаю, я, вероятно, должен был потратить немного больше усилий, чтобы заставить официальные привязки python работать lp_solve.