主要内容

allcycles

在图中找到所有的循环

描述

例子

周期= allcycles (G返回所有周期在指定的图表中。输出周期单元格数组是否包含每个单元格的内容周期{k}列出构成一个循环的节点。

例子

周期edgecycles) = allcycles (G还返回每个周期的边。输出edgecycles单元阵列在哪里edgecycles {k}给出相应循环中的边,周期{k}

例子

___) = allcycles (G名称,值使用一个或多个名称-值参数指定其他选项。您可以在前面的语法中使用任何输出参数组合。例如,可以指定MaxNumCycles以及限制返回循环次数的标量。

例子

全部折叠

创建一个有9个节点的有向图。画出图。

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 =有向图(s, t);情节(G)

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

计算图中的所有周期。

周期= allcycles (G)
周期=5×1单元阵列{[1 2 3 6 5 4]} {[1 2 3 6 9 8 5 4]} {[1 2 3 6 6 9 8 7 4]} {[2 3 6 5]} {[2 3 6 9 8 5]}

的第二个输出参数allcycles返回包含在每个循环中的边。这对于多重图特别有用,因为在多重图中,需要边索引来唯一地标识每个循环中的边。

创建一个有8个节点和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];名称= {“一个”“B”“C”' D '“E”“F”‘G’“H”};G =有向图(s t[],名称);p =情节(G,“EdgeLabel”1: numedges (G));

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

计算图中的所有周期。指定两个输出参数也返回每个循环中的边的边索引。

[周期,edgecycles] = allcycles (G);

在第五个循环中查看节点和边。

周期{5}
ans =1 x7单元格{' a '} {' c '} {' e '} {' g '} {' h '} {' f '} {' b '}
edgecycles {5}
ans =1×72 9 13 17 18 14 3

在第五个循环中高亮节点和边缘。

突出(p,“边缘”, edgecycles {5},“EdgeColor”“r”“线宽”, 1.5,“NodeColor”“r”“MarkerSize”6)

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

使用“MaxNumCycles”“MaxCycleLength”,“MinCycleLength”限制返回的循环次数的选项allcycles

为一个包含20个节点的完整图创建一个邻接矩阵。从邻接矩阵创建一个无向图,省略自循环。

一个= 1 (20);图G = (,“omitselfloops”);

由于图中的所有节点都连接到所有其他节点,图中有大量的循环(超过1.7 e17).因此,计算所有周期是不可行的,因为结果将不适合内存。相反,计算前10个循环。

cycles1 = allcycles (G,“MaxNumCycles”, 10)
cycles1 =10×1单元阵列{(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单元阵列{(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]}

最后,计算周期长度大于或等于4的前10个周期。

cycles3 = allcycles (G,“MaxNumCycles”10“MinCycleLength”4)
cycles3 =10×1单元阵列{(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]}

的输出如何cyclebasisallcycles函数随图形中边的数量缩放。

创建并绘制一个正方形网格图,每边有三个节点。

n = 5;一个= delsq (numgrid (“年代”, n));图G = (,“omitselfloops”);情节(G)

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

使用。计算图中的所有周期allcycles.使用tiledlayout函数构造子图数组,并突出显示子图中的每个周期。结果表明,图中总共有13个循环。

[周期,edgecycles] = allcycles (G);tiledlayoutk = 1:length(cycles) nexttile highlight(plot(G),cycles{k},“边缘”, edgecycles {k},“EdgeColor”“r”“NodeColor”“r”)标题(“循环”+ k)结束

图中包含13个轴对象。标题为Cycle 1的坐标轴对象1包含一个graphplot类型的对象。标题为Cycle 2的axis对象2包含一个graphplot类型的对象。标题为Cycle 3的坐标轴对象3包含一个graphplot类型的对象。标题为Cycle 4的axis对象4包含一个graphplot类型的对象。标题为Cycle 5的axis对象5包含一个graphplot类型的对象。标题为Cycle 6的axis对象6包含一个graphplot类型的对象。标题为Cycle 7的axis对象7包含一个graphplot类型的对象。标题为Cycle 8的axis对象8包含一个graphplot类型的对象。标题为Cycle 9的轴对象9包含一个graphplot类型的对象。 Axes object 10 with title Cycle 10 contains an object of type graphplot. Axes object 11 with title Cycle 11 contains an object of type graphplot. Axes object 12 with title Cycle 12 contains an object of type graphplot. Axes object 13 with title Cycle 13 contains an object of type graphplot.

其中一些周期可以看作是更小周期的组合。的cyclebasis函数返回构成图中所有其他循环基的循环的子集。使用cyclebasis计算基本周期的基础,并在子图中突出显示每个基本周期。尽管图中有13个循环,但只有4个基本循环。

[周期,edgecycles] = cyclebasis (G);tiledlayoutk = 1:length(cycles) nexttile highlight(plot(G),cycles{k},“边缘”, edgecycles {k},“EdgeColor”“r”“NodeColor”“r”)标题(“循环”+ k)结束

图中包含4个轴对象。标题为Cycle 1的坐标轴对象1包含一个graphplot类型的对象。标题为Cycle 2的axis对象2包含一个graphplot类型的对象。标题为Cycle 3的坐标轴对象3包含一个graphplot类型的对象。标题为Cycle 4的axis对象4包含一个graphplot类型的对象。

现在,将正方形图每边的节点数从3个增加到4个。这表示图的大小略有增加。

n = 6;一个= delsq (numgrid (“年代”, n));图G = (,“omitselfloops”);图绘制(G)

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

使用allcycles来计算新图中的所有周期。对于这个图,有超过200个循环,太多了。

allcycles (G)
ans =213×1单元阵列{[8 1 2 3 4 5 6 7]} {(1 2 3 4 5 8 7 6 10 9]} {(1 2 3 4 8 7 6 10 11 12 16 15 14 13 9 5]} {(1 2 3 4 5 8 7 6 10 11 15 14 13 9]} {(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 5 8 7 11 10 9]} {(1 2 3 4 5 8 7 11 10 14 13 9]} {(1 2 3 4 8 7 11 12 16 15 14 10 6 5]} {(1 2 3 4 5 8 7 11 12 16 15 14 10 9]} {(1 2 3 4 8 7 11 12 1615 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 5 8 7 11 15 14 10 9]}{(1 2 3 4 5 8 7 11 15 14 13 9]}{(1 2 3 4 8 7 11 15 14 13 9 10 6 5]}⋮

尽管图中有大量的循环,cyclebasis仍然返回少量的基本周期。图中的每一个环可以只用9个基本环来构造。

[周期,edgecycles] = cyclebasis (G);图tiledlayoutk = 1:length(cycles) nexttile highlight(plot(G),cycles{k},“边缘”, edgecycles {k},“EdgeColor”“r”“NodeColor”“r”)标题(“循环”+ k)结束

图中包含9个轴对象。标题为Cycle 1的坐标轴对象1包含一个graphplot类型的对象。标题为Cycle 2的axis对象2包含一个graphplot类型的对象。标题为Cycle 3的坐标轴对象3包含一个graphplot类型的对象。标题为Cycle 4的axis对象4包含一个graphplot类型的对象。标题为Cycle 5的axis对象5包含一个graphplot类型的对象。标题为Cycle 6的axis对象6包含一个graphplot类型的对象。标题为Cycle 7的axis对象7包含一个graphplot类型的对象。标题为Cycle 8的axis对象8包含一个graphplot类型的对象。标题为Cycle 9的轴对象9包含一个graphplot类型的对象。

对于某些图结构来说,循环数的大幅增加而图的大小只有很小的变化是典型的。返回的周期数allcycles可以随着图中边的数量呈指数增长。但是,返回的周期数cyclebasis最多可以随图中的边数线性增长。

输入参数

全部折叠

输入图形,指定为有向图对象。使用创建无向图或有向图创建有向图。

例子:图G =(1、2)

例子:G =有向图([1,2],[2 3])

名称-值参数

指定可选的逗号分隔的对名称,值参数。的名字参数名和价值为对应值。的名字必须出现在引号内。可以以任意顺序指定多个名称和值对参数Name1, Value1,…,的家

例子: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的循环。

输出参数

全部折叠

图形循环,作为单元格数组返回。每个元素周期{k}包含属于其中一个周期的节点G.每个循环从具有最小节点索引的节点开始,并按字典顺序返回循环。无向图中的循环只返回一次,遵循一个方向。如果G不包含任何循环吗周期是空的。

中的单元格的数据类型周期取决于输入图是否包含节点名:

  • 如果图G没有节点名,那么每个元素呢周期{k}是节点索引的数值向量。

  • 如果图G有节点名,然后每个元素周期{k}是字符向量节点名称的单元格数组。

每个循环中的边,作为单元格数组返回。每个元素edgecycles {k}包含相应循环中各边的边索引,周期{k}.如果G不包含任何循环吗edgecycles是空的。

更多关于

全部折叠

图周期

当图中存在一条非空路径,其中只有第一个和最后一个节点重复时,图中就存在一个循环。例如:(Node1 - Node2 - Node3 - Node1)。按照惯例,allcycles不返回周期中的最后一个节点,因为它与第一个节点相同。

一个循环不能两次穿过同一条边。例如,无向图中的循环(Node1 - Node2 - Node1)只有在Node1和Node2之间有多条边连接时才存在。根据这个定义,自循环可以算作周期,尽管它们不能是更大周期的一部分。

提示

  • 图中的循环数很大程度上取决于图的结构。对于某些图结构,循环数可以随节点数呈指数增长。例如,一个包含12个节点的完整图图G = ((12))包含近6000万个循环。使用MaxNumCyclesMaxCycleLength,MinCycleLength的输出控制选项allcycles在这些情况下。

介绍了R2021a