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.

Некоторые из этих циклов можно рассматривать как комбинации небольших циклов. The 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 пуст.

Подробнее о

свернуть все

Базис основного цикла

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

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

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

См. также

| | |

Введенный в R2021a