05第5讲 图论模型
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(v0 , v2 ) 1 , (v2 , v3 ) 1 , (v3 , v4 ) 1 , (v1 , v8 ) 1 , (v0 , v1 ) 2 , (v0 , v6 ) 2 , (v5 , v6 ) 2 , (v0 , v3 ) 3 , (v6 , v7 ) 3 , (v0 , v4 ) 4 , (v0 , v5 ) 4 , (v0 , v8 ) 4 , (v1 , v2 ) 4 , (v0 , v7 ) 5 , (v7 , v8 ) 5 , (v4 , v5 ) 5
v1
4 2 4 5 3
v2
1 3 4 4 2
v3
v1
1
v8
1
v0
1
v4
1
v8
v7
2
v2 1
v0
1
v3 1 v4 v5
5
v7
2 v6 (a)
5
v5
2 3
v6
2
图 5.4 生成的最小生成树
v0 , v1 ,
求最小生成树的 Kruskal 算法的 MATLAB 程序如下(用 MATLAB 计算时,顶点 : , v8 分别编号为 1, 2, ,9 ) clc, clear a=zeros(9); a(1,[2:9])=[2 1 3 4 4 2 5 4]; a(2,[3 9])=[4 1]; a(3,4)=1; a(4,5)=1; a(5,6)=5; a(6,7)=2; a(7,8)=3; a(8,9)=5; a=a'; %转成 MATLAB 需要的下三角元素 a=sparse(a); %转换为稀疏矩阵 b=graphminspantree(a,'Method','Kruskal') %注意要写 Kruskal 算法,否则使用 Prim 算法 L=sum(sum(b)) %求最小生成树的权重 view(biograph(b,[],'ShowArrows','off','ShowWeights','on')) %画最小生成树,
5.2
MATLAB 图论工具箱的命令
2
MATLAB 图论工具箱的命令见表 5.1。
表 5.1 命令名 graphallshortestpaths graphconncomp graphisdag graphisomorphism graphisspantree graphmaxflow graphminspantree graphpred2path graphshortestpath graphtopoorder graphtraverse MATLAB 图论工具箱的相关命令 功能 求图中所有顶点对之间的最短距离 找无向图的连通分支,或有向图的强(弱)连通分支 测试有向图是否含有圈,不含圈返回 1,否则返回 0 确定两个图是否同构,同构返回 1,否则返回 0 确定一个图是否是生成树,是返回 1,否则返回 0 计算有向图的最大流 求图的最小生成树 把前驱顶点序列变成路径的顶点序列 求图中指定的一对顶点间的最短距离和最短路径 执行有向无圈图的拓扑排序 求从一顶点出发,所能遍历图中的顶点
例 5.2 0 0 0 A 0 0 0
图 5.2 所表示的有向图的邻接矩阵
1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 , 1 1 0
用 MATLAB 重新画出图 5.2。
v2
v4
v1
第5讲
图论模型
司守奎 烟台市,海军航空大学 Email:sishoukui@163.com
5.1
图与网络的数据结构
5.1.1 图的概念 定义 5.1 非赋权图 一 个 非 赋 权 图 是 由 点 集 V {v1 , v2 , , vn } 和 V 中 元 素 的 无 序 对 的 一 个 集 合 记为 G (V , E ) , V 中的元素 vi 叫做顶点,E 中的元素 ek 叫 E {e1 , e2 , , em } 所构成的二元组, 做边。 定义 5.2 赋权图 赋权图(网络)G 是一个三元组,记为 G (V , E,W ) ,其中 V {v1 , , vn} 为顶点集合,E 为边的集合, W (wij )nn 为邻接矩阵(或权重矩阵) ,其中
1
邻接矩阵的对应元素为 0。 5.1.3 例题 例 5.1 图 5.1 所示的图,其邻接矩阵为
v5
0 9 A 2 4 7
9 2 4 7 0 3 4 0 3 0 8 4 4 8 0 6 0 5 6 0
6 7
v1
4 4 2 8 3
v3
v4
9
v2
4
图 5.1 赋权无向图
顶点vi 与v j 之间边的权重, (vi , v j ) E wij 0 ) , vi 与v j 之间无边时. (或
注 5.1
(1)
当两个顶点之间不存在边或弧时,根据实际问题的含义或算法需要,对应的权 重可以取为 0 或 。 当顶点与顶点之间的关系是对称关系时,对应的图是无向图,除非特殊说明,我们所说 的图都是指无向图。当顶点与顶点之间的关系是非对称关系时,对应的图为有向图。 定义 5.3 有向图 有向图 D 是一个二元组,记为 D (V , A) ,其中 V 为顶点集合, A 为弧(带箭头的边) 的集合。 定义 5.4 赋权有向图 赋权有向图 D 是一个三元组,记为 D (V , A,W ) ,其中 V {v1 , , vn } 为顶点集合, A 为 弧(带箭头的边)的集合, W (wij )nn 为邻接矩阵,其中
v6
v3
v5
图 5.2 非赋权有向图
clc, clear a=zeros(6); a(1,[2 3])=1; a(2,3)=1; a(3,[2 5])=1; a(4,[2 6])=1; a(5,[2 4 6])=1; a(6,5)=1; b=sparse(a); h=biograph(b,[],'ShowArrows','on') %生成图形对象 set(h,'LaБайду номын сангаасoutType','equilibrium'); %设置属性:图形的布局是平衡的 view(h) %显示图形
1, 当从vi 到v j的边在树中, xij 0, 当从vi 到v j的边不在树中.
4
目标函数是使得 z wij xij 最小化。
i 1 j 1
n
n
约束条件分成如下 4 类: (1)根 v1 至少有一条边连接到其他的顶点,
5.3.3 最小生成树的数学规划模型 根据最小生成树问题的实际意义和实现方法, 也可以用数学规划模型来描述, 同时能够 方便地应用 LINGO 软件来求解这类问题。 顶点 v1 表示树根,总共有 n 个顶点。顶点 vi 到顶点 v j 边的权重用 wij 表示,当两个顶点 之间没有边时,对应的权重用 M (充分大的实数)表示,这里 wii M , i 1, 2, , n 。 引入 0 1 变量
5.3
最小生成树
5.3.1 prim 算法构造最小生成树 构造连通赋权图 G (V , E,W ) 的最小生成树, 设置两个集合 P 和 Q ,其中 P 用于存放 G 的 最小生成树中的顶点,集合 Q 存放 G 的最小生成树中的边。令集合 P 的初值为 P {v1} (假 设构造最小生成树时, 从顶点 v1 出发) , 集合 Q 的初值为 Q (空集) 。 prim 算法的思想是, 从所有 p P , v V P 的边中,选取具有最小权值的边 pv ,将顶点 v 加入集合 P 中,将边 pv 加入集合 Q 中,如此不断重复,直到 P V 时,最小生成树构造完毕,这时集合 Q 中包 含了最小生成树的所有边。 prim 算法如下: (1) P {v1} , Q ; (2)while P ~ V 找最小边 pv ,其中 p P, v V P ; P P {v} ; Q Q { pv} ; end 5.3.2 Kruskal 算法构造最小生成树 科茹斯克尔(Kruskal)算法是一个好算法。Kruskal 算法如下: (1)选 e1 E ,使得 e1 是权值最小的边。 (2)若 e1 , e2 , , ei 已选好,则从 E {e1 , e2 , , ei } 中选取 ei 1 ,使得 i) {e1 , e2 , , ei , ei 1} 中无圈,且 ii) ei 1 是 E {e1 , e2 , , ei } 中权值最小的边。 (3)直到选得 e|V |1 为止。 5.3.2 最小生成树举例 例 5.3 一个乡有 9 个自然村,其间道路及各道路长度如图 5.3 所示,各边上的数字表 示距离,问架设通讯线时,如何拉线才能使用线最短。
3
v1
4 2 4 5 3
v2
1 3 4 4 2
v3
v1
1
v8
1
v0
1
v4
1
v8
v7
2
v2 1
v0
1
v3 1 v4 v5
5
v7
2 v6
5
v5
2 3
v6 (b)
2
图 5.3 连通图及对应的最小生成树
解 列:
这就是一个最小生成树问题,用 Kruskal 算法求解。先将边按大小顺序由小至大排
顶点vi v j的弧的权重, 当vi v j 有弧时 wij 0 ) , 当vi v j 无弧时. (或
(2)
当 G (或 D )为非赋权图时,也可以看成赋权图,邻接矩阵
1, 当vi 与v j间有边(弧)时, wij 0, 当vi 与v j间无边(弧)时.
(3)
5.1.2 MATLAB 中邻接矩阵的表示 在 MATLAB 中邻接矩阵以稀疏矩阵的格式存储。 在数学上,稀疏矩阵是指矩阵中零元素很多,非零元素很少的矩阵。对于计算机的数 据结构,稀疏矩阵只是一种存储格式,只存放非零元素的行地址、列地址和非零元素本身的 值,即按如下方式存储 (非零元素的行地址,非零元素的列地址) ,非零元素的值。 在 MATLAB 中无向图和有向图邻接矩阵的使用上有很大差异。 对于有向图,只要写出邻接矩阵,直接使用 MATLAB 的 sparse 命令,把邻接矩阵转化 为稀疏矩阵的表示方式,供 MATLAB 工具箱使用。 对于无向图,由于邻接矩阵是对称阵,MATLAB 中只使用邻接矩阵的下三角元素,即 需要 MATLAB 先截取邻接矩阵的下三角部分,再用 sparse 命令转化为稀疏矩阵。 在 MATLAB 中,普通矩阵使用 sparse 命令变成稀疏矩阵,稀疏矩阵使用 full 命令变成 普通矩阵。 另外要注意,在数学上按照邻接矩阵的定义式(1),如果两个顶点间无边连接,对应的 元素为 0 或 。 在 MATLAB 工具箱中, 由于使用稀疏矩阵, 隐含着两个顶点间无边连接时,
然后按照边的排列顺序,取定 e1 (v0 , v2 ) , e2 (v2 , v3 ) , e3 (v3 , v4 ) , e4 (v1 , v8 ) , e5 (v0 , v1 ) , e6 (v0 , v6 ) , e7 (v5 , v6 ) , 由于下一个未选边中的最小权边 (v0 , v3 ) 与已选边 e1 , e2 构成圈,所以排除。选 e8 (v6 , v7 ) 。得 到图 5.4,就是图 G 的一颗最小生成树,它的权是 13。
用 MATLAB 重新画出图 5.1。 clc, clear a=zeros(5); %邻接矩阵初始化 a(1,[2:5])=[9 2 4 7]; a(2,[3 4])=[3 4]; %输入邻接矩阵的上三角元素 a(3,[4 5])=[8 4]; a(4,5)=6; a=a'; b=sparse(a) %变成下三角矩阵,并转化为稀疏矩阵 h=biograph(b,[],'ShowWeights','on','ShowArrows','off') %生成图形对象 set(h,'LayoutType','equilibrium'); %设置属性:图形的布局是平衡的 view(h) %显示图形