Найдите все циклы в графике
[
также возвращает ребра в каждом цикле. Выход cycles
,edgecycles
] = allcycles(G
)edgecycles
массив ячеек где edgecycles{k}
дает ребра в соответствующем цикле, cycles{k}
.
[___] = allcycles(
задает дополнительные опции с помощью одних или нескольких аргументов name-value. Можно использовать любую из комбинаций выходного аргумента в предыдущих синтаксисах. Например, можно задать 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)
Вычислите все циклы в графике.
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));
Вычислите все циклы в графике. Задайте два выходных аргумента, чтобы также возвратить индексы ребра для ребер в каждом цикле.
[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)
Используйте '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)
Вычислите все циклы в графике с помощью 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
Некоторые из этих циклов могут рассматриваться как комбинации меньших циклов. 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
Теперь увеличьте число узлов на каждой стороне квадратного графика от три до четыре. Это представляет маленькое увеличение размера графика.
n = 6; A = delsq(numgrid('S',n)); G = graph(A,'omitselfloops'); figure plot(G)
Используйте 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
Значительное увеличение количества циклов только с небольшим изменением в размере графика типично для некоторых структур графика. Количество циклов возвращено allcycles
может вырасти экспоненциально с количеством ребер в графике. Однако количество циклов, возвращенных cyclebasis
может, самое большее, вырасти линейно с количеством ребер в графике.
Задайте дополнительные разделенные запятой пары Name,Value
аргументы. Name
имя аргумента и Value
соответствующее значение. Name
должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN
.
allcycles(G,'MaxNumCycles',100)
возвращает только первые 100 циклов в графике.MaxNumCycles
— Максимальное количество цикловМаксимальное количество циклов в виде разделенной запятой пары, состоящей из 'MaxNumCycles'
и неотрицательный целочисленный скаляр. Эта опция полезна, когда количество циклов в графике становится достаточно большим, чтобы поразить пределы памяти. Можно задать MaxNumCycles
ограничить количество циклов, возвращенных allcycles
так, чтобы результаты соответствовали в доступной памяти.
Пример: allcycles(G,'MaxNumCycles',100)
MaxCycleLength
— Максимальная длина циклаМаксимальная длина цикла в виде разделенной запятой пары, состоящей из 'MaxCycleLength'
и положительный целочисленный скаляр. Эта опция фильтрует результаты, возвращенные allcycles
так, чтобы никакие циклы с длиной, больше, чем заданный предел, не были возвращены. Длина цикла измеряется количеством ребер в нем, игнорируя вес ребра.
Чтобы найти циклы с областью значений длин, задайте оба 'MaxCycleLength'
и 'MinCycleLength'
. Чтобы найти циклы с точной заданной длиной, задайте то же значение для обоих 'MaxCycleLength'
и 'MinCycleLength'
.
Пример: allcycles(G,'MaxCycleLength',4)
возвращает циклы, которые имеют длину, меньше чем или равную 4.
Пример: allcycles(G,'MinCycleLength',3,'MaxCycleLength',5)
возвращает циклы, которые имеют длину 3, 4, или 5.
MinCycleLength
— Минимальная длина циклаМинимальная длина цикла в виде разделенной запятой пары, состоящей из 'MinCycleLength'
и положительный целочисленный скаляр. Эта опция фильтрует результаты, возвращенные allcycles
так, чтобы никакие циклы с длиной, меньшей, чем заданный предел, не были возвращены. Длина цикла измеряется количеством ребер в нем, игнорируя вес ребра.
Чтобы найти циклы с областью значений длин, задайте оба 'MaxCycleLength'
и 'MinCycleLength'
. Чтобы найти циклы с точной заданной длиной, задайте то же значение для обоих 'MaxCycleLength'
и 'MinCycleLength'
.
Пример: allcycles(G,'MinCycleLength',2)
возвращает циклы, которые имеют длину, больше, чем или равный 2.
Пример: allcycles(G,'MinCycleLength',3,'MaxCycleLength',5)
возвращает циклы, которые имеют длину 3, 4, или 5.
cycles
— Циклы графикаЦиклы графика, возвращенные как массив ячеек. Каждый элемент cycles{k}
содержит узлы, которые принадлежат одному из циклов в G
. Каждый цикл начинается с узла, который имеет самый маленький индекс узла, и циклы возвращены в лексикографическом порядке. Циклы в неориентированных графах возвращены только однажды, после одного направления. Если G
не содержит циклов, затем cycles
isempty.
Тип данных ячеек в cycles
зависит от того, содержит ли входной график имена узла:
Если график G
не имеет имен узла, затем каждый элемент cycles{k}
числовой вектор из индексов узла.
Если график G
имеет имена узла, затем каждый элемент cycles{k}
массив ячеек имен узла вектора символов.
edgecycles
— Ребра в каждом циклеРебра в каждом цикле, возвращенном как массив ячеек. Каждый элемент edgecycles{k}
содержит индексы ребра для ребер в соответствующем цикле, cycles{k}
. Если G
не содержит циклов, затем edgecycles
isempty.
Цикл существует в графике, когда существует непустой путь, в котором только повторяются первые и последние узлы. Пример цикла: (Node1 - Node2 - Node3 - Node1). Условно, allcycles
не возвращает последний узел в цикле, поскольку это совпадает с первым.
Цикл не может пересечь то же ребро дважды. Например, цикл (Node1 - Node2 - Node1) в неориентированном графе только существует, если существует больше чем одно ребро, соединяющее Node1 и Node2. По этому определению самоциклы рассчитывают как циклы, хотя они не могут быть частью большего цикла.
Количество циклов в графике зависит в большой степени от структуры графика. Для некоторых структур графика количество циклов может вырасти экспоненциально с количеством узлов. Например, полный график с 12 узлами, данными G = graph(ones(12))
содержит почти 60 миллионов циклов. Используйте MaxNumCycles
, MaxCycleLength
, и MinCycleLength
опции, чтобы управлять выходом allcycles
в этих случаях.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.