Быстрая библиотека минимального потока для 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.