exponenta event banner

изоморфизм

Вычислить изоморфизм между двумя графами

Описание

пример

P = isomorphism(G1,G2) вычисляет отношение эквивалентности изоморфизма графа между графами G1 и G2, если он существует. Если изоморфизма не существует, то P является пустым массивом.

пример

P = isomorphism(___,Name,Value) указывает дополнительные параметры с одним или несколькими аргументами пары имя-значение. Например, можно указать 'NodeVariables' и список узловых переменных, указывающий, что изоморфизм должен сохранять эти переменные действительными.

[P,edgeperm] = isomorphism(___) дополнительно возвращает вектор перестановок рёбер, edgeperm. Эти выходные данные позволяют сохранять граничные переменные при работе с мультиграфами.

Примеры

свернуть все

Создайте и постройте два направленных графика, а затем вычислите отношение изоморфизма между ними.

G1 = digraph([1 1 1 2 3 4],[2 3 4 4 4 1]);
G2 = digraph([3 3 3 2 1 4],[1 4 2 3 2 2]);
subplot(1,2,1)
plot(G1)
subplot(1,2,2)
plot(G2)

Figure contains 2 axes. Axes 1 contains an object of type graphplot. Axes 2 contains an object of type graphplot.

p = isomorphism(G1,G2)
p = 4×1

     3
     1
     4
     2

Результат показывает, что reordernodes(G2,p) имеет ту же структуру, что и G1.

Создайте и постройте два графика, G1 и G2.

G1 = graph([1 1 1 2 2 3 3 4 5 5 7 7],[2 4 5 3 6 4 7 8 6 8 6 8]);
plot(G1,'XData',[1 4 4 1 2 3 3 2],'YData',[4 4 1 1 3 3 2 2])

Figure contains an axes. The axes contains an object of type graphplot.

G2 = graph({'a' 'a' 'a' 'b' 'b' 'b' 'c' 'c' 'c' 'd' 'd' 'd'}, ...
    {'g' 'h' 'i' 'g' 'h' 'j' 'g' 'i' 'j' 'h' 'i' 'j'});
plot(G2,'XData',[1 2 2 2 1 2 1 1],'YData',[4 4 3 2 3 1 2 1])

Figure contains an axes. The axes contains an object of type graphplot.

Вычислите отношение изоморфизма между графами, если таковое существует. Результат показывает, что узлы графа могут быть переставлены для представления одного и того же графа, несмотря на их различные метки и макеты.

p = isomorphism(G1,G2)
p = 8×1

     1
     2
     5
     3
     4
     7
     6
     8

Вычислите два различных отношения изоморфизма между двумя графами. Одно из уравнений сохраняет свойство узла, а другое игнорирует его.

Создайте два похожих графика. Добавление свойства узла Color к каждому из графиков.

G1 = graph({'d' 'e' 'f'},{'e' 'f' 'd'});
G1.Nodes.Color = {'blue' 'red' 'red'}';

G2 = graph({'a' 'b' 'c'},{'b' 'c' 'a'});
G2.Nodes.Color = {'red' 'red' 'blue'}';

Постройте графики рядом на том же рисунке. Окрашивание узлов в красный цвет Color = 'red'.

subplot(1,2,1)
p1 = plot(G1);
highlight(p1,{'e' 'f'},'NodeColor','r')

subplot(1,2,2)
p2 = plot(G2);
highlight(p2,{'a' 'b'},'NodeColor','r')

Figure contains 2 axes. Axes 1 contains an object of type graphplot. Axes 2 contains an object of type graphplot.

Вычислите изоморфизм между графами, игнорируя Color собственность.

p = isomorphism(G1,G2)
p = 3×1

     1
     2
     3

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

p = isomorphism(G1,G2,'NodeVariables','Color')
p = 3×1

     3
     1
     2

Просмотр узлов в G1 и G2 что изоморфизм совпадает вместе.

[G1.Nodes.Name, G2.Nodes.Name(p)]
ans = 3x2 cell
    {'d'}    {'c'}
    {'e'}    {'a'}
    {'f'}    {'b'}

Входные аргументы

свернуть все

Входные графики, указанные как отдельные аргументы graph или digraph объекты. Использовать graph для создания неориентированного графика или digraph для создания направленного графа.

G1 и G2 должно быть и то, и другое graph объекты или оба digraph объекты.

Пример: G1 = graph(1,2)

Пример: G1 = digraph([1 2],[2 3])

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: P = isomorphism(G1,G2,'NodeVariables',{'Var1' 'Var2'})

Краевые переменные для сохранения, указанные как разделенная запятыми пара, состоящая из 'EdgeVariables' и символьный вектор, строковый скаляр, клеточный массив символьных векторов или строковый массив. Используйте этот параметр, чтобы указать одну или несколько переменных кромки, которые находятся в обоих G1.Edges и G2.Edges. Чтобы изоморфизм был действительным, необходимо сохранить указанные граничные переменные.

Если G является мультиграфом, то можно указать второй вывод edgeperms для включения переупорядочивания граничных переменных.

Типы данных: char | string | cell

Сохраняемые переменные узла, указанные как пара, разделенная запятыми, состоящая из 'NodeVariables' и символьный вектор, строковый скаляр, клеточный массив символьных векторов или строковый массив. Используйте этот параметр, чтобы указать одну или несколько переменных узла, которые находятся в обоих G1.Nodes и G2.Nodes. Чтобы изоморфизм был действительным, необходимо сохранить указанные узловые переменные.

Типы данных: char | string | cell

Выходные аргументы

свернуть все

Вектор перестановки для изоморфизма, возвращаемый как вектор столбца, когда существует изоморфизм или как пустой массив [] когда изоморфизм не существует. Если P не пуст, то reordernodes(G2,P) имеет ту же структуру, что и G1.

Перестановка края, возвращаемая как вектор столбца. При работе с мультиграфами вектор перестановки рёбер позволяет сохранять рёберные переменные, заданные 'EdgeVariables' пара имя-значение. Используйте следующие команды для изменения порядка переменных ребер повторяющихся ребер:

[p,edgeperm] = isomorphism(g1,g2,'EdgeVariables',edgevars);
g2perm = reordernodes(g2, p);
g2perm.Edges(:, 2:end) = g2perm.Edges(edgeperm, 2:end);

Подробнее

свернуть все

Изоморфизм графа

Два графика, G1 и G2, являются изоморфными, если существует перестановка узлов P такой, что reordernodes(G2,P) имеет ту же структуру, что и G1.

Два изоморфных графа имеют сходную структуру. Например, если граф содержит один цикл, то все изоморфные этому графу графы также содержат один цикл.

Представлен в R2016b