Устранение симметрии из графиков - PullRequest
16 голосов
/ 17 февраля 2011

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

Мой вопрос заключается в том, существует ли алгоритм для эффективного устранения симметрии в орграфах, аналогично тому, как я делал это вручную ниже.

Во всех случаях исходный вектор имеет одинаковое значение для всех узлов.


В первом примере мы видим, что b, c, d и e все получают значения от a и друг от друга. Следовательно, они всегда будут содержать одинаковое значение, и мы можем объединить их.

Digraph A Digraph B


В этом примере мы быстро обнаружим, что график идентичен с точки зрения a, b, c и d. Также для их соответствующих sidenodes не имеет значения, к какому внутреннему узлу он присоединен. Следовательно, мы можем уменьшить график до двух состояний.

Digraph C Digraph D


Обновление: Некоторые люди были достаточно разумны, не вполне понимая, что подразумевается под "матрицей передачи государства". Идея заключается в том, что вы можете разбить комбинаторную задачу на несколько типов состояний для каждого n в вашем повторении. Затем матрица расскажет вам, как получить от n-1 до n.

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

Ниже приведен пример матрицы переноса для приведенного графа в примере 1.

[S_a(n)]   [1  1  1] [S_a(n-1)]
[S_f(n)] = [1  0  0]*[S_f(n-1)]
[S_B(n)]   [4  0  1] [S_B(n-1)]

Любые предложения или ссылки на документы приветствуются.

Ответы [ 3 ]

6 голосов
/ 17 февраля 2011

Красота Брендана Маккея (http://cs.anu.edu.au/~bdm/nauty/) - лучший из известных мне инструментов для вычисления автоморфизмов графов. Может быть слишком дорого вычислять всю группу автоморфизмов вашего графа, но вы можете использовать некоторые алгоритмы, описанные в статье Маккея «Изоморфизм практических графов» (ссылка на страницу nauty).

0 голосов
/ 20 мая 2012

Вычисление симметрии кажется проблемой второго порядка. Взяв только a, b, c и d на вашем втором графике, симметрия должна быть выражена

a(b,c,d) = b(a,d,c)

и все его перестановки или что-то подобное. Рассмотрим второй подграф a ', b', c ', d', добавленный к нему. Опять же, у нас есть симметрии, но параметризованные по-разному.

Для вычислительных людей (а не математиков), можем ли мы выразить проблему следующим образом?

Каждый узел графа содержит набор букв. На каждой итерации все буквы в каждом узле копируются стрелками в соседние узлы (некоторые стрелки занимают более одной итерации и могут рассматриваться как канал анонимных узлов).

Мы пытаемся найти эффективные способы определения таких вещей, как * какие буквы содержит каждый набор / узел после N итераций. * для каждого узла N, после которого его набор больше не изменяется. * какие наборы узлов содержат одинаковые наборы букв (класс эквивалентности)

0 голосов
/ 18 февраля 2011

Я просто добавлю дополнительный ответ, основываясь на том, что предложил пользовательOVER9000, если кому-то еще это интересно.Ниже приведен пример использования nauty в примере 2 через инструмент dreadnaut.

$ ./dreadnaut 
Dreadnaut version 2.4 (64 bits).
> n=8 d g                                     -- Starting a new 8-node digraph
 0 : 1 3 4;                                   -- Entering edge data
 1 : 0 2 5;
 2 : 3 1 6;
 3 : 0 2 7;
 4 : 0;
 5 : 1;
 6 : 2;
 7 : 3;
> cx                                          -- Calling nauty
(1 3)(5 7)
level 2:  6 orbits; 5 fixed; index 2
(0 1)(2 3)(4 5)(6 7)
level 1:  2 orbits; 4 fixed; index 4
2 orbits; grpsize=8; 2 gens; 6 nodes; maxlev=3
tctotal=8; canupdates=1; cpu time = 0.00 seconds
> o                                           -- Output "orbits"
 0:3; 4:7;

Обратите внимание, что предлагается объединить узлы 0:3, которые a:d в примере 2 и 4:7e:h.

Алгоритм nauty недостаточно хорошо документирован, но авторы описывают его как экспоненциальный наихудший случай, n^2 средний.

...