Базис фундаментального цикла графика
вычисляет базис основного цикла неориентированного графа. Область выхода 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)

Вычислите, какие узлы находятся в каждом основном цикле.
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);

Вычислите базис основного цикла графика.
[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

Можно создать любой другой цикл в графике, найдя симметричное различие между двумя или несколькими фундаментальными циклами с помощью setxor функция. Например, возьмем симметричное различие между первыми двумя циклами и постройте график получившегося нового цикла.
figure
new_cycle_edges = setxor(edgecycles{1},edgecycles{2});
highlight(plot(G),'Edges',new_cycle_edges,'EdgeColor','r','NodeColor','r')
В то время как каждый цикл может быть построен путем объединения циклов из базиса цикла, не каждая комбинация базисных циклов образует действительный цикл.
Исследуйте, как выходы 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

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

Теперь увеличьте число узлов на каждой стороне квадратного графика с трех до четырех. Это представляет небольшое увеличение размера графика.
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 может, самое большее, расти линейно с количеством ребер в графике.
G - Входной графикgraph объектВходной график, заданный как graph объект. Использование graph для создания неориентированного объекта графа.
Пример: G = graph(1,2)
cycles - Фундаментальные графовые циклыФундаментальные графовые циклы, возвращенные как массив ячеек. Каждая камера cycles{k} содержит узлы, которые относятся к одному из фундаментальных циклов G. Каждый цикл начинается с наименьшего индекса узла. Если G не содержит никаких циклов, тогда cycles пуст.
Каждый цикл в G является комбинацией фундаментальных циклов, возвращаемых в cycles. Если ребро является частью цикла в G, тогда это также часть, по меньшей мере, одного основного цикла в cycles.
Тип данных камер в cycles зависит от того, содержит ли входной график имена узлов:
Если графиков G не имеет имен узлов, тогда каждая камера cycles{k} является числовым вектором индексов узлов.
Если графиков G имеет имена узлов, затем каждую камеру cycles{k} - массив ячеек с именами узлов векторов символов.
edgecycles - Ребра в каждом основном циклеРебра в каждом фундаментальном цикле, возвращенные как массив ячеек. Каждая камера edgecycles{k} содержит индексы ребер для ребер в цикле cycles{k}. Если G не содержит никаких циклов, тогда edgecycles пуст.
В неориентированных графах fundamental cycle basis является набором простых циклов, который формирует базис для циклического пространства графика. То есть любой цикл в графике может быть построен из фундаментальных циклов. Для получения примера см. Узлы и Кромки в фундаментальных циклах.
Базис фундаментального цикла графика вычисляется из минимального покрывающего дерева графика. Для каждого ребра, который не находится в минимальном покрывающем дереве, существует один основной цикл, который состоит из этого ребра, его конечных узлов и пути в минимальном покрывающем дереве, которое соединяет их.
Минимальное покрывающее дерево, используемое в cyclebasis обычно отличается от той, которая возвращается minspantree. Он выбран таким образом, чтобы циклы были короткими. Однако, cyclebasis не гарантируется возврат максимально короткого базиса основных циклов.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.