Я пытаюсь реализовать этот алгоритм кластеризации графов (раздел 3.2) с помощью python-igraph. Поскольку я не хочу самостоятельно рассчитывать минимальное дерево разрезов, я пытаюсь использовать метод gomory_hu_tree()
. Чтобы поэкспериментировать с этим методом (и предоставить MWE), я написал следующее:
from igraph import *
g= Graph()
g.add_vertices(4)
g.vs["name"] = ["0", "1", "2", "artificial"]
g.add_edge("0", "1", weight=10.0)
g.add_edge("0", "2", weight=20.0)
g.add_edge("2", "1", weight=30.0)
g.add_edge("artificial", "0", weight=100.0)
g.add_edge("artificial", "1", weight=100.0)
g.add_edge("artificial", "2", weight=100.0)
t = g.gomory_hu_tree(capacity="weight")
print t.es["flow"]
print
print t
Получаю следующий результат:
[130.0, 140.0, 150.0]
IGRAPH UNW- 4 3 --
+ attr: name (v), flow (e), weight (e)
+ edges (vertex names):
0--1, 1--2, 2--artificial
Но это не дерево с минимальной обрезкой! Если бы дерево было таким, то удаление ребра между 1
и 2
привело бы к разделению графа на два подмножества {0, 1}
и {2, t}
за дополнительную плату из 250. Однако правильный ответ - разрезать {1}
и {2, 0, t}
всего за 140.
(Под "стоимостью" я подразумеваю стоимость соответствующего сокращения.)
Итак, один (и единственный) правильный ответ для дерева минимальной резки был бы
0--artificial, 1--artificial, 2--artificial
Что я сделал не так? Возможно, неправильно использовать метод gomory_hu_tree()
в этом контексте?
Примечание. Изначально я задал этот вопрос совершенно неправильно < / а>.
1 ответ
Вот пара определений:
1) Дерево называется эквивалентным деревом потока тогда и только тогда, когда для каждой пары узлов (u, v) максимальный поток между этими двумя узлами в дереве такой же, как в исходном графе (и это означает, что стоимость минимальной резки одинакова).
2) Дерево удовлетворяет свойству cut тогда и только тогда, когда для каждой пары узлов (u, v) минимальный разрез в этом дереве такой же, как в исходном графе (не только стоимость - это то же самое, но два подмножества тоже совпадают).
Возникает вопрос: что такое дерево Гомори-Ху? Есть два общих определения:
1) Дерево эквивалента потока.
2) Дерево эквивалентного потока, удовлетворяющее свойству разрезания.
Несмотря на то, что не задокументировано, какое определение используется в этой библиотеке, похоже, что они использовали первое. Таким образом, гарантируется только то, что стоимость разреза будет одинаковой, но не самого разреза. Если вам нужно найти сам разрез, вы можете использовать метод maxflow
для фиксированной пары узлов.
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.