exponenta event banner

allcycles

Найти все циклы на графике

Описание

пример

cycles = allcycles(G) возвращает все циклы в указанном графике. Продукция cycles - массив ячеек, в котором содержится содержимое каждой ячейки; cycles{k} перечисляет узлы, образующие цикл.

пример

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

пример

[___] = allcycles(G,Name,Value) указывает дополнительные параметры, использующие один или несколько аргументов «имя-значение». В предыдущих синтаксисах можно использовать любую комбинацию выходных аргументов. Например, можно указать MaxNumCycles и скаляр для ограничения количества возвращаемых циклов.

Примеры

свернуть все

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

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

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

Вычислите все циклы на графике.

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

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

Создайте направленный мультиграф с восемью узлами и 18 ребрами. Укажите имена узлов. Постройте график с помеченными узлами и рёбрами.

s = [1 1 2 2 3 3 2 2 4 6 8 6 6 7 3 3 5 3];
t = [2 3 1 3 2 1 4 4 6 2 6 7 8 8 5 5 7 7];
names = {'A','B','C','D','E','F','G','H'};
G = digraph(s,t,[],names);
p = plot(G,'EdgeLabel',1:numedges(G));

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

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

[cycles,edgecycles] = allcycles(G);

Просмотр узлов и кромок в пятом цикле.

cycles{5}
ans = 1x7 cell
    {'A'}    {'C'}    {'E'}    {'G'}    {'H'}    {'F'}    {'B'}

edgecycles{5}
ans = 1×7

     2     9    13    17    18    14     3

Выделите узлы и кромки в пятом цикле.

highlight(p,'Edges',edgecycles{5},'EdgeColor','r','LineWidth',1.5,'NodeColor','r','MarkerSize',6)

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

Используйте 'MaxNumCycles', 'MaxCycleLength', и 'MinCycleLength' для ограничения количества циклов, возвращаемых allcycles.

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

A = ones(20);
G = graph(A,'omitselfloops');

Поскольку все узлы в графе связаны со всеми остальными узлами, в графе имеется большое количество циклов (более чем 1.7e17). Следовательно, невозможно вычислить все циклы, так как результаты не умещаются в памяти. Вместо этого вычислите первые 10 циклов.

cycles1 = allcycles(G,'MaxNumCycles',10)
cycles1=10×1 cell array
    {[                     1 2 3]}
    {[                   1 2 3 4]}
    {[                 1 2 3 4 5]}
    {[               1 2 3 4 5 6]}
    {[             1 2 3 4 5 6 7]}
    {[           1 2 3 4 5 6 7 8]}
    {[         1 2 3 4 5 6 7 8 9]}
    {[      1 2 3 4 5 6 7 8 9 10]}
    {[   1 2 3 4 5 6 7 8 9 10 11]}
    {[1 2 3 4 5 6 7 8 9 10 11 12]}

Теперь рассчитайте первые 10 циклов, длина которых меньше или равна 3.

cycles2 = allcycles(G,'MaxNumCycles',10,'MaxCycleLength',3)
cycles2=10×1 cell array
    {[ 1 2 3]}
    {[ 1 2 4]}
    {[ 1 2 5]}
    {[ 1 2 6]}
    {[ 1 2 7]}
    {[ 1 2 8]}
    {[ 1 2 9]}
    {[1 2 10]}
    {[1 2 11]}
    {[1 2 12]}

Наконец, вычислите первые 10 циклов, длина которых больше или равна 4.

cycles3 = allcycles(G,'MaxNumCycles',10,'MinCycleLength',4)
cycles3=10×1 cell array
    {[                      1 2 3 4]}
    {[                    1 2 3 4 5]}
    {[                  1 2 3 4 5 6]}
    {[                1 2 3 4 5 6 7]}
    {[              1 2 3 4 5 6 7 8]}
    {[            1 2 3 4 5 6 7 8 9]}
    {[         1 2 3 4 5 6 7 8 9 10]}
    {[      1 2 3 4 5 6 7 8 9 10 11]}
    {[   1 2 3 4 5 6 7 8 9 10 11 12]}
    {[1 2 3 4 5 6 7 8 9 10 11 12 13]}

Изучение того, каким образом осуществляется вывод 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 или digraph объект. Использовать graph для создания неориентированного графика или digraph для создания направленного графа.

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

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

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

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

Пример: allcycles(G,'MaxNumCycles',100) возвращает только первые 100 циклов в графике.

Максимальное количество циклов, указанное как разделенная запятыми пара, состоящая из 'MaxNumCycles' и неотрицательный целочисленный скаляр. Эта опция полезна, когда число циклов в графике растет достаточно велико, чтобы достичь пределов памяти. Можно указать MaxNumCycles для ограничения количества циклов, возвращаемых allcycles чтобы результаты умещались в доступной памяти.

Пример: allcycles(G,'MaxNumCycles',100)

Максимальная длина цикла, указанная как разделенная запятыми пара, состоящая из 'MaxCycleLength' и положительный целочисленный скаляр. Этот параметр фильтрует результаты, возвращенные allcycles чтобы не возвращались циклы с длиной больше указанного предела. Длина цикла измеряется количеством краев в нем, игнорируя веса краев.

Чтобы найти циклы с диапазоном длин, укажите оба 'MaxCycleLength' и 'MinCycleLength'. Чтобы найти циклы с точно заданной длиной, укажите одно и то же значение для обоих 'MaxCycleLength' и 'MinCycleLength'.

Пример: allcycles(G,'MaxCycleLength',4) возвращает циклы, длина которых меньше или равна 4.

Пример: allcycles(G,'MinCycleLength',3,'MaxCycleLength',5) возвращает циклы длиной 3, 4 или 5.

Минимальная длина цикла, указанная как разделенная запятыми пара, состоящая из 'MinCycleLength' и положительный целочисленный скаляр. Этот параметр фильтрует результаты, возвращенные allcycles чтобы не возвращались циклы с длиной меньше указанного предела. Длина цикла измеряется количеством краев в нем, игнорируя веса краев.

Чтобы найти циклы с диапазоном длин, укажите оба 'MaxCycleLength' и 'MinCycleLength'. Чтобы найти циклы с точно заданной длиной, укажите одно и то же значение для обоих 'MaxCycleLength' и 'MinCycleLength'.

Пример: allcycles(G,'MinCycleLength',2) возвращает циклы, длина которых больше или равна 2.

Пример: allcycles(G,'MinCycleLength',3,'MaxCycleLength',5) возвращает циклы длиной 3, 4 или 5.

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

свернуть все

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

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

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

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

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

Подробнее

свернуть все

Циклы графика

Цикл существует в графе, когда существует непустой путь, в котором повторяются только первый и последний узлы. Примером цикла является: (Node1 - Node2 - Node3 - Node1). По конвенции, allcycles не возвращает последний узел в цикле, так как он совпадает с первым.

Цикл не может пересекать одну и ту же кромку дважды. Например, цикл (Node1 - Node2 - Node1) в неориентированном графе существует только при наличии более одного ребра, связывающего Node1 и Node2. По этому определению самокольцы считаются циклами, хотя они не могут быть частью большего цикла.

Совет

  • Количество циклов в графе сильно зависит от структуры графа. Для некоторых структур графов число циклов может увеличиваться экспоненциально с числом узлов. Например, полный граф с 12 узлами, заданными G = graph(ones(12)) содержит почти 60 миллионов циклов. Используйте MaxNumCycles, MaxCycleLength, и MinCycleLength опции для управления выводом allcycles в этих случаях.

См. также

| |

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