Подтвердить что ты не робот

Устранение симметрии по графам

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

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

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


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

Digraph ADigraph B


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

Digraph CDigraph 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)]

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

4b9b3361

Ответ 1

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

Ответ 2

Я просто добавлю дополнительное здание ответа на то, что предложил userOVER9000, если кто-то еще заинтересован. Ниже приведен пример использования 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:7, которые являются e:h.

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

Ответ 3

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

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

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

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

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

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

?