isomorphism

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

Описание

пример

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