Я пытаюсь реализовать этот алгоритм кластеризации графов (раздел 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
Deniz 14 Авг 2014 в 12:36

1 ответ

Лучший ответ

Вот пара определений:

1) Дерево называется эквивалентным деревом потока тогда и только тогда, когда для каждой пары узлов (u, v) максимальный поток между этими двумя узлами в дереве такой же, как в исходном графе (и это означает, что стоимость минимальной резки одинакова).

2) Дерево удовлетворяет свойству cut тогда и только тогда, когда для каждой пары узлов (u, v) минимальный разрез в этом дереве такой же, как в исходном графе (не только стоимость - это то же самое, но два подмножества тоже совпадают).

Возникает вопрос: что такое дерево Гомори-Ху? Есть два общих определения:
1) Дерево эквивалента потока.
2) Дерево эквивалентного потока, удовлетворяющее свойству разрезания.

Несмотря на то, что не задокументировано, какое определение используется в этой библиотеке, похоже, что они использовали первое. Таким образом, гарантируется только то, что стоимость разреза будет одинаковой, но не самого разреза. Если вам нужно найти сам разрез, вы можете использовать метод maxflow для фиксированной пары узлов.

1
kraskevich 14 Авг 2014 в 17:45
Спасибо! Я не уверен, могу ли я превратить его в дерево, эквивалентное простому потоку, в дерево со свойством cut, то есть такое дерево, которое я ищу. Мне совсем не ясно, упрощает ли наличие дерева эквивалента потока задачу поиска дерева со свойством cut. Есть ли какая-нибудь библиотека графов python (я пробовал графический инструмент, NetworkX), в которой есть что-то подходящее?
 – 
Deniz
14 Авг 2014 в 18:21
Я никогда не слышал о простом способе превратить дерево, эквивалентное потоку, в истинное дерево минимальных разрезов (я бы сказал, что было бы проще построить его правильно с нуля, потому что это хорошо известный алгоритм). У меня нет большого опыта работы с библиотеками графов Python, поэтому я не знаю, есть ли библиотека с правильным деревом mincut.
 – 
kraskevich
14 Авг 2014 в 18:40