图与网络01—基本理论与MATLAB工具箱
简单的规划问题先告一段落了,这里我们将开展图论内容的学习,一点一点慢慢来,还是从两个方面入手:数学+代码,如果有错误和需要改进的地方,还请多多指教!
图与网络分析
前言
咕~
一、图与网络的基础理论
第一部分基本概念都比较简单易懂,所以把定义过一下完事儿~ 第二部分是图的矩阵表示,这个也是基础,大概介绍一下“关联矩阵”、“邻接矩阵”就完事儿~1.1 图与网络的基本概念
1. 无向图和有向图
【定义1.1】 一个无向图 G G G是由非空顶点集 V V V和边集 E E E按一定的对应关系构成的连接结构,记为 G = ( V , E ) G=(V,E) G=(V,E) 。其中非空集合 V = V= V= { v 1 , v 2 , . . . , v n v_{1},v_{2},...,v_{n} v1,v2,...,vn}为 G G G的顶点集, V V V中的元素称为 G G G的顶点,其元素的个数为顶点数;集合 E = E= E= { e 1 , e 2 , . . . , e n e_{1},e_{2},...,e_{n} e1,e2,...,en}为 G G G的边集, E E E中的元素称为 G G G的边,其元素的个数为图 G G G的边数。
以下用 ∣ V ∣ |V| ∣V∣表示图 G = ( V , E ) G=(V,E) G=(V,E)中顶点的个数, ∣ E ∣ |E| ∣E∣表示边的条数。
图 G G G的每一条边是由连接 G G G中两个顶点而得的一条线(可以是直线或曲线),因此与 G G G的顶点对相对应,通常记作 e k = ( v i , v j ) e_{k}=(v_{i},v_{j}) ek=(vi,vj),其中,顶点 v i , v j v_{i},v_{j} vi,vj称为边 e k e_{k} ek的两个端点,有时也说边 e k e_{k} ek与顶点 v i , v j v_{i},v_{j} vi,vj* 关联。
对于无向图来说,对应一条边的顶点对表示是无序的,即
v
i
,
v
j
v_{i},v_{j}
vi,vj和
v
j
,
v
i
v_{j},v_{i}
vj,vi表示的是同一条边
e
k
e_{k}
ek。
有公共端点的两条边,或称邻边。同样,同一条边
e
k
e_{k}
ek的两个端点
v
i
和
v
j
v_{i}和v_{j}
vi和vj称为是 相邻的顶点。
带有方向的边称为 有向边,又称为 弧。
【定义1.2】 有向图通常记为 D = ( V , A ) D=(V,A) D=(V,A) ,其中非空集合 V = V= V= { v 1 , v 2 , . . . , v n v_{1},v_{2},...,v_{n} v1,v2,...,vn}为 D D D的顶点集, A = A= A= { a 1 , a 2 , . . . , a n a_{1},a_{2},...,a_{n} a1,a2,...,an}为 D D D的弧集合,每一条弧与一个有序的顶点对相对应,弧 a k = ( v i , v j ) a_{k}=(v_{i},v_{j}) ak=(vi,vj)表示弧的方向自顶点 v i v_{i} vi指向 v j v_{j} vj , v_{i}称为弧 a k a_{k} ak的始端, v j v_{j} vj称为弧 a k a_{k} ak的末端或终端,其中 a k a_{k} ak称为 v i v_{i} vi的出弧,称为 v j v_{j} vj的入弧。
与无向图不同,在有向图情形下, ( v i , v j ) (v_{i},v_{j}) (vi,vj)与 ( v j , v i ) (v_{j},v_{i}) (vj,vi)表示不同的弧。
把有向图 D = ( V , A ) D=(V,A) D=(V,A)中所有弧的方向都去掉,得到的边集用 E E E表示,就得到与有向图 D D D对应的无向图 G = ( V , E ) G=(V,E) G=(V,E) ,称 G G G为有向图 D D D的基本图,称 D D D为 G G G的定向图。
2. 简单图、完全图、赋权图
【定义1.3】 如果一条边的两个端点是同一个顶点,则称这条边为环。如果有两条边或多条边的端点是同一对顶点,则称这些边为重边或平行边。称不与任何边相关联的顶点为孤立点。
【定义1.4】 无环且无重边的图称为简单图。如果不特别申明,一般的图均指简单图。
【定义1.5】 任意两顶点均相邻的简单图称为完全图。含 n n n个顶点的完全图记为 K n K_{n} Kn。
【定义1.6】 如果图 G G G的每条边 e e e都附有一个实数 w ( e ) w(e) w(e) ,则称图 G G G为赋权图,实数 w ( e ) w(e) w(e)称为边 e e e的权。
赋权图也称为网络。赋权图中的权可以是距离、费用、时间、效益、成本等。赋权图 G G G一般记作 G = ( V , E , W ) G=(V,E,W) G=(V,E,W),其中 W W W为权重的邻接矩阵。赋权图也可以记作 N = ( V , E , W ) N=(V,E,W) N=(V,E,W) 。
如果有向图 D D D的每条弧都被赋予了权,则称 D D D为有向赋权图。以后对于无向图、有向图或网络都可以用 G G G表示,从下文中就能够区分出无向的还是有向的,赋权的还是非赋权的。
3. 顶点的度
【定义1.7】
(1)在无向图中,与顶点
v
v
v关联的边的数目(环算两次)称为
v
v
v的度,记为
d
(
v
)
d(v)
d(v)。
(2)在有向图中,从顶点
v
v
v引出的弧的数目称为
v
v
v的出度,记为
d
+
(
v
)
d^{+}(v)
d+(v),从顶点
v
v
v引入的弧的数目称为
v
v
v的入度,记为
d
−
(
v
)
d^{-}(v)
d−(v), 称为
v
v
v的度。
度为奇数的顶点称为奇顶点,度为偶数的顶点称为偶顶点。
【定理1.1】 给定图
G
=
(
V
,
E
)
G=(V,E)
G=(V,E) ,所有顶点的度数之和是边数的2倍,即
∑
v
∈
V
d
(
v
)
=
2
∣
E
∣
.
\sum_{v\in V}^{}{d(v)}=2|E|.
v∈V∑d(v)=2∣E∣.
【推论1.1】 任何图中奇顶点的总数必为偶数。
4. 子图与图的连通性
【定义1.8】设 G 1 = ( V 1 , E 1 ) G_{1}=(V_{1},E_{1}) G1=(V1,E1)与 G 2 = ( V 2 , E 2 ) G_{2}=(V_{2},E_{2}) G2=(V2,E2)是两个图,并且满足 V 1 ⊂ V 2 V_{1}\subset V_{2} V1⊂V2 , E 1 ⊂ E 2 E_{1}\subset E_{2} E1⊂E2 ,则称 G 1 G_{1} G1是 G 2 G_{2} G2 的子图, G 2 G_{2} G2称为 G 1 G_{1} G1的母图。如 G 1 G_{1} G1是 G 2 G_{2} G2的子图,且 V 1 = V 2 V_{1}=V_{2} V1=V2 ,则称 G 1 G_{1} G1是 G 2 G_{2} G2的生成子图(支撑子图)。
【定义1.9】 设
W
=
v
0
e
1
v
1
e
2
⋯
e
k
v
k
W=v_0 e_1 v_1 e_2⋯e_k v_k
W=v0e1v1e2⋯ekvk,其中
e
i
∈
E
(
i
=
1
,
2
,
⋯
,
k
)
e_i∈E(i=1,2,⋯,k)
ei∈E(i=1,2,⋯,k),
v
j
∈
V
(
j
=
0
,
1
,
⋯
,
k
)
v_j∈V(j=0,1,⋯,k)
vj∈V(j=0,1,⋯,k),
e
i
e_i
ei与
v
i
−
1
v_{i-1}
vi−1和
v
i
v_i
vi关联,称
W
W
W是图
G
G
G的一条道路(walk),简称路,
k
k
k为路长,
v
0
v_0
v0为起点,
v
k
v_k
vk为终点;
各边相异的道路称为迹(trail);
各顶点相异的道路称为轨道(path),记为
P
(
v
0
,
v
k
)
P(v_0,v_k)
P(v0,vk);
起点和终点重合的道路称为回路;
起点和终点重合的轨道称为圈,即对轨道
P
(
v
0
,
v
k
)
P(v_0,v_k)
P(v0,vk),当
v
0
=
v
k
v_0=v_k
v0=vk时成为一个圈。
称以两顶点
u
,
v
u,v
u,v分别为起点和终点的最短轨道之长为顶点
u
,
v
u,v
u,v的距离。
【定义1.10】 在无向图 G G G中,如果从顶点 u u u到顶点 v v v存在道路,则称顶点 u u u和 v v v是连通的。如果图 G G G中的任意两个顶点 u u u和 v v v都是连通的,则称图 G G G是连通图,否则称为非连通图。非连通图中的连通子图,称为连通分支。
在有向图 D D D中,如果对于任意两个顶点 u u u和 v v v,从 u u u到 v v v和从 v v v和 u u u都存在道路,则称图 D D D是强连通图。
1.2 图的矩阵表示
设图的顶点个数为
n
n
n ,边(或弧)的条数为
m
m
m。
对于无向图
G
=
(
V
,
E
)
G=(V,E)
G=(V,E) ,其中
V
=
v
1
,
v
2
,
⋯
,
v
n
V={v_1,v_2,⋯,v_n}
V=v1,v2,⋯,vn ,
E
=
e
1
,
e
2
,
⋯
,
e
m
E={e_1,e_2,⋯,e_m}
E=e1,e2,⋯,em。
对于有向图
D
=
(
V
,
A
)
D=(V,A)
D=(V,A),其中
V
=
v
1
,
v
2
,
⋯
,
v
n
V={v_1,v_2,⋯,v_n}
V=v1,v2,⋯,vn,
A
=
a
1
,
a
2
,
⋯
,
a
m
A={a_1,a_2,⋯,a_m}
A=a1,a2,⋯,am。
1. 关联矩阵
对于无向图 G G G,其关联矩阵 M = ( m i j ) n × m M=(m_{ij})_{n×m} M=(mij)n×m,其中
m
i
j
=
{
1
,
顶
点
v
i
与
边
e
j
关
联
0
,
顶
点
v
i
与
边
e
j
不
关
联
m_{ij} = \begin{cases} 1, &顶点v_i 与边e_j 关联 \\ 0, &顶点v_i 与边e_j 不关联 \\ \end{cases}
mij={1,0,顶点vi与边ej关联顶点vi与边ej不关联
i
=
1
,
2
,
⋯
,
n
i=1,2,⋯,n
i=1,2,⋯,n,
j
=
1
,
2
,
⋯
,
m
j=1,2,⋯,m
j=1,2,⋯,m.
对有向图
G
G
G,其关联矩阵
M
=
(
m
i
j
)
n
×
m
M=(m_{ij})_{n×m}
M=(mij)n×m,其中
m
i
j
=
{
1
,
顶
点
v
i
是
弧
a
j
的
始
端
−
1
,
顶
点
v
i
是
弧
a
j
的
末
端
0
,
顶
点
v
i
与
弧
a
j
不
关
联
m_{ij} = \begin{cases} 1, &顶点v_i 是弧a_j 的始端 \\ -1, &顶点v_i 是弧a_j 的末端 \\ 0, &顶点v_i 与弧a_j 不关联 \end{cases}
mij=⎩⎪⎨⎪⎧1,−1,0,顶点vi是弧aj的始端顶点vi是弧aj的末端顶点vi与弧aj不关联
i
,
j
=
1
,
2
,
⋯
,
n
i,j=1,2,⋯,n
i,j=1,2,⋯,n
2. 邻接矩阵
对无向非赋权图
G
G
G,其关联矩阵
W
=
(
w
i
j
)
n
×
m
W=(w_{ij})_{n×m}
W=(wij)n×m,其中
w
i
j
=
{
1
,
顶
点
v
i
与
顶
点
v
j
相
邻
0
,
顶
点
v
i
与
顶
点
v
j
不
相
邻
w_{ij} = \begin{cases} 1, &顶点v_i 与顶点v_j 相邻 \\ 0, &顶点v_i 与顶点v_j 不相邻 \\ \end{cases}
wij={1,0,顶点vi与顶点vj相邻顶点vi与顶点vj不相邻
i
,
j
=
1
,
2
,
⋯
,
n
i,j=1,2,⋯,n
i,j=1,2,⋯,n
对有向非赋权图
D
D
D,其邻接矩阵
W
=
(
w
i
j
)
n
×
m
W=(w_{ij})_{n×m}
W=(wij)n×m,其中
w
i
j
=
{
1
,
弧
(
v
i
,
v
j
)
∈
A
,
0
,
i
=
j
或
顶
点
v
i
到
v
j
无
弧
,
w_{ij} = \begin{cases} 1, &弧(v_i,v_j) \in A, \\ 0, &i=j或顶点v_i到v_j无弧, \\ \end{cases}
wij={1,0,弧(vi,vj)∈A,i=j或顶点vi到vj无弧,
i
,
j
=
1
,
2
,
⋯
,
n
i,j=1,2,⋯,n
i,j=1,2,⋯,n
对无向赋权图
G
G
G,其邻接矩阵
W
=
(
w
i
j
)
n
×
m
W=(w_{ij})_{n×m}
W=(wij)n×m,其中
w
i
j
=
{
顶
点
v
i
与
v
j
之
间
边
的
权
(
v
i
,
v
j
)
∈
E
,
0
或
∞
,
v
i
与
v
j
无
边
,
w_{ij} = \begin{cases} 顶点v_i与v_j之间边的权 &(v_i,v_j) \in E, \\ 0或∞, &v_i与v_j无边, \\ \end{cases}
wij={顶点vi与vj之间边的权0或∞,(vi,vj)∈E,vi与vj无边,
i
,
j
=
1
,
2
,
⋯
,
n
i,j=1,2,⋯,n
i,j=1,2,⋯,n
二、MATLAB工具箱简介
1.图的生成
Graph:无向图(undirected Graph);
Digraph:有向图(directed Graph);
G = graph——创建空的无向图对象。
G = graph(A)——使用邻接矩阵A创建赋权无向图。
G = graph(A,nodes) ——使用邻接矩阵A和节点名称nodes创建赋权无向图。
G = graph(s,t) ——使用节点对组s,t创建无向图。
G = graph(s,t,weights) ——使用节点对组s,t和权重向量weights创建赋权无向图。
G = graph(s,t,weights,nodes)——使用字符向量元胞数组nodes指定节点名称。
G = graph(s,t,weights,num) ——使用数值标量num指定图中的节点数。
G = graph(A[,nodes],type)——仅使用A的上或下三角形阵构造赋权图,type可以是’upper’ 或 ‘lower’。
【例1】 画出一个60个顶点的3正则图(每个顶点的度都为3)
代码如下(示例):
clc,close all
G = graph(bucky);plot(G);
2.数据存储结构
MATLAB存储网络的相关数据时,使用了稀疏矩阵,这有利于在存储大规模稀疏网络时节省存储空间。
【例2】 画出【例1】的非赋权有向图并导出邻接矩阵和关联矩阵。
代码如下(示例):
clc,clear,close all
E=[1,2;1,3;2,3;3,2;3,5;4,2;4,6;5,2;5,4;6,5]
s=E(:,1);t=E(:,2);
nodes = cellstr(strcat('v',int2str([1:6]')))
G=digraph(s,t,[],nodes);
plot(G,'LineWidth',1.5,'Layout','circle','NodeFontSize',15)
W1 = adjacency(G) %导出邻接矩阵的稀疏矩阵
W2 = incidence(G) %导出关联矩阵的稀疏矩阵
【例3】 导出图1.2所示赋权有向图的邻接矩阵和关联矩阵,并重新画图。
clc, clear, close all
E = [1, 3, 10; 1, 4, 60; 2, 3, 5; 2, 4, 20; 3, 4, 1];
G = graph(E(:,1), E(:,2), E(:,3));
W1 = adjacency(G,'weighted'), W2 = incidence(G)
plot(G,'Layout','force','EdgeLabel',G.Edges.Weight)
总结
这里主要是介绍一下图论最基础的概念以及简单的MATLAB图生成的工具箱的使用。内容不多,但是是后续模型建立以及求解的基础,好好理解!