exponenta event banner

cyclebasis

Фундаментальная циклическая основа графика

Описание

пример

cycles = cyclebasis(G) вычисляет фундаментальную циклическую основу неориентированного графа. Продукция cycles - массив ячеек, который указывает, какие узлы принадлежат каждому фундаментальному циклу.

пример

[cycles,edgecycles] = cyclebasis(G) также возвращает ребра в каждом цикле. Продукция edgecycles - массив ячеек, где edgecycles{k} дает края между узлами в cycles{k}.

Примеры

свернуть все

Создание и печать неориентированного графика.

s = [1 1 2 2 3 4 4 5 5 6 7 8];
t = [2 4 3 5 6 5 7 6 8 9 8 9];
G = graph(s,t);
plot(G)

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

Вычислите, какие узлы находятся в каждом фундаментальном цикле.

cycles = cyclebasis(G)
cycles=4×1 cell array
    {[1 2 5 4]}
    {[2 3 6 5]}
    {[4 5 8 7]}
    {[5 6 9 8]}

Вычислите узлы и рёбра в фундаментальных циклах графа, визуализируйте фундаментальные циклы, а затем используйте фундаментальные циклы, чтобы найти другие циклы в графе.

Создание и печать неориентированного графика.

s = [1 1 1 2 2 3 3 4 4 4 5 6];
t = [2 3 4 4 5 4 6 5 6 7 7 7];
G = graph(s,t);
plot(G);

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

Вычислите фундаментальную циклическую основу графа.

[cycles,edgecycles] = cyclebasis(G)
cycles=6×1 cell array
    {[1 2 4]}
    {[1 3 4]}
    {[2 4 5]}
    {[3 4 6]}
    {[4 5 7]}
    {[4 6 7]}

edgecycles=6×1 cell array
    {[  1 4 3]}
    {[  2 6 3]}
    {[  4 8 5]}
    {[  6 9 7]}
    {[8 11 10]}
    {[9 12 10]}

Выделите каждый из основных циклов, используя tiledlayout и nexttile для построения массива вложенных диаграмм. Для каждого вложенного графика сначала получите узлы соответствующего цикла из cyclesи края из edgecycles. Затем постройте график и выделите эти узлы и ребра.

tiledlayout flow
for k = 1:length(cycles)
    nexttile
    highlight(plot(G),cycles{k},'Edges',edgecycles{k},'EdgeColor','r','NodeColor','r')
    title("Cycle " + k)
end

Figure contains 6 axes. Axes 1 with title Cycle 1 contains an object of type graphplot. Axes 2 with title Cycle 2 contains an object of type graphplot. Axes 3 with title Cycle 3 contains an object of type graphplot. Axes 4 with title Cycle 4 contains an object of type graphplot. Axes 5 with title Cycle 5 contains an object of type graphplot. Axes 6 with title Cycle 6 contains an object of type graphplot.

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

figure
new_cycle_edges = setxor(edgecycles{1},edgecycles{2});
highlight(plot(G),'Edges',new_cycle_edges,'EdgeColor','r','NodeColor','r')

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

Хотя каждый цикл может быть построен путем объединения циклов из базисного цикла, не каждая комбинация базисных циклов формирует действительный цикл.

Изучение того, каким образом осуществляется вывод cyclebasis и allcycles функции масштабируются с числом рёбер в графе.

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

n = 5;
A = delsq(numgrid('S',n));
G = graph(A,'omitselfloops');
plot(G)

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

Вычислить все циклы на графике с помощью allcycles. Используйте tiledlayout функция для построения массива вложенных графиков и выделения каждого цикла в вложенном графике. Результаты показывают, что всего на графике 13 циклов.

[cycles,edgecycles] = allcycles(G);
tiledlayout flow
for k = 1:length(cycles)
    nexttile
    highlight(plot(G),cycles{k},'Edges',edgecycles{k},'EdgeColor','r','NodeColor','r')
    title("Cycle " + k)
end

Figure contains 13 axes. Axes 1 with title Cycle 1 contains an object of type graphplot. Axes 2 with title Cycle 2 contains an object of type graphplot. Axes 3 with title Cycle 3 contains an object of type graphplot. Axes 4 with title Cycle 4 contains an object of type graphplot. Axes 5 with title Cycle 5 contains an object of type graphplot. Axes 6 with title Cycle 6 contains an object of type graphplot. Axes 7 with title Cycle 7 contains an object of type graphplot. Axes 8 with title Cycle 8 contains an object of type graphplot. Axes 9 with title Cycle 9 contains an object of type graphplot. Axes 10 with title Cycle 10 contains an object of type graphplot. Axes 11 with title Cycle 11 contains an object of type graphplot. Axes 12 with title Cycle 12 contains an object of type graphplot. Axes 13 with title Cycle 13 contains an object of type graphplot.

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

[cycles,edgecycles] = cyclebasis(G);
tiledlayout flow
for k = 1:length(cycles)
    nexttile
    highlight(plot(G),cycles{k},'Edges',edgecycles{k},'EdgeColor','r','NodeColor','r')
    title("Cycle " + k)
end

Figure contains 4 axes. Axes 1 with title Cycle 1 contains an object of type graphplot. Axes 2 with title Cycle 2 contains an object of type graphplot. Axes 3 with title Cycle 3 contains an object of type graphplot. Axes 4 with title Cycle 4 contains an object of type graphplot.

Теперь увеличьте число узлов на каждой стороне квадратного графа с трёх до четырёх. Это представляет небольшое увеличение размера графа.

n = 6;
A = delsq(numgrid('S',n));
G = graph(A,'omitselfloops');
figure
plot(G)

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

Использовать allcycles для вычисления всех циклов в новом графике. Для этого графа существует более 200 циклов, что слишком много для построения графика.

allcycles(G)
ans=213×1 cell array
    {[                       1 2 3 4 8 7 6 5]}
    {[                  1 2 3 4 8 7 6 10 9 5]}
    {[1 2 3 4 8 7 6 10 11 12 16 15 14 13 9 5]}
    {[      1 2 3 4 8 7 6 10 11 15 14 13 9 5]}
    {[            1 2 3 4 8 7 6 10 14 13 9 5]}
    {[                 1 2 3 4 8 7 11 10 6 5]}
    {[                 1 2 3 4 8 7 11 10 9 5]}
    {[           1 2 3 4 8 7 11 10 14 13 9 5]}
    {[     1 2 3 4 8 7 11 12 16 15 14 10 6 5]}
    {[     1 2 3 4 8 7 11 12 16 15 14 10 9 5]}
    {[     1 2 3 4 8 7 11 12 16 15 14 13 9 5]}
    {[1 2 3 4 8 7 11 12 16 15 14 13 9 10 6 5]}
    {[           1 2 3 4 8 7 11 15 14 10 6 5]}
    {[           1 2 3 4 8 7 11 15 14 10 9 5]}
    {[           1 2 3 4 8 7 11 15 14 13 9 5]}
    {[      1 2 3 4 8 7 11 15 14 13 9 10 6 5]}
      ⋮

Несмотря на большое количество циклов в графе, cyclebasis по-прежнему возвращает небольшое число фундаментальных циклов. Каждый из циклов в графе может быть построен с использованием только девяти фундаментальных циклов.

[cycles,edgecycles] = cyclebasis(G);
figure
tiledlayout flow
for k = 1:length(cycles)
    nexttile
    highlight(plot(G),cycles{k},'Edges',edgecycles{k},'EdgeColor','r','NodeColor','r')
    title("Cycle " + k)
end

Figure contains 9 axes. Axes 1 with title Cycle 1 contains an object of type graphplot. Axes 2 with title Cycle 2 contains an object of type graphplot. Axes 3 with title Cycle 3 contains an object of type graphplot. Axes 4 with title Cycle 4 contains an object of type graphplot. Axes 5 with title Cycle 5 contains an object of type graphplot. Axes 6 with title Cycle 6 contains an object of type graphplot. Axes 7 with title Cycle 7 contains an object of type graphplot. Axes 8 with title Cycle 8 contains an object of type graphplot. Axes 9 with title Cycle 9 contains an object of type graphplot.

Большое увеличение числа циклов с лишь небольшим изменением размера графа характерно для некоторых структур графа. Количество циклов, возвращаемых allcycles может расти экспоненциально с числом рёбер в графе. Однако количество циклов, возвращаемых cyclebasis может, самое большее, вырасти линейно с числом рёбер в графе.

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

свернуть все

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

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

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

свернуть все

Фундаментальные циклы графов, возвращаемые в виде массива ячеек. Каждая ячейка cycles{k} содержит узлы, которые принадлежат одному из фундаментальных циклов G. Каждый цикл начинается с наименьшего индекса узла. Если G не содержит циклов, то cycles пуст.

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

Тип данных ячеек в cycles зависит от того, содержит ли входной граф имена узлов:

  • Если график G не имеет имен узлов, то каждая ячейка cycles{k} - числовой вектор индексов узлов.

  • Если график G имеет имена узлов, затем каждая ячейка cycles{k} - массив ячеек имен узлов символьных векторов.

Рёбра в каждом фундаментальном цикле, возвращаемые как массив ячеек. Каждая ячейка edgecycles{k} содержит индексы ребер для ребер в цикле cycles{k}. Если G не содержит циклов, то edgecycles пуст.

Подробнее

свернуть все

Основа фундаментального цикла

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

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

Минимальное покрывающее дерево, используемое в cyclebasis обычно отличается от возвращенного minspantree. Его выбирают таким образом, чтобы циклы были короткими. Однако cyclebasis не гарантировано возвращение как можно более короткого базового цикла.

См. также

| | |

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