2022年Prim算法和Kruskal算法的Matlab实现.pdf
《2022年Prim算法和Kruskal算法的Matlab实现.pdf》由会员分享,可在线阅读,更多相关《2022年Prim算法和Kruskal算法的Matlab实现.pdf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Prim 算法和 Kruskal算法的 Matlab 实现计算机仿真期末大作业Prim 算法与 Kruskal 算法的 Matlab 实现05605刘禹 050697(30) 连线问题应用举例 : 欲铺设连接n个城市的高速公路, 若i城与j城之间的高速公路造价为ijC, 试设计一个线路图 , 使总的造价最低。连线问题的数学模型就就是图论中在连通的赋权图上求权最小的支撑树。试用Matlab 分别实现求最小支撑数的Prim 算法与 Krusal 算法 ( 避圈法 )。一、基本要求 : (1)画出程序流程图 ; (2)对关键算法、变量与步骤进行解释说明; (3)用如下两图对所写算法的正确性进行验证。
2、即输入图的信息, 输出对应图的最小支撑树及其权值。v1v7v6v4v5v3v2634212435216196611218302051514924167534844(4)分析两种算法的实现复杂度。二、扩展要求 : (1)提供对算法效率(复杂度 )进行评估的方法,并通过举例验证,与分析得到的算法复杂度结果相对照 ; (2)从降低内存消耗、减少计算时间的角度,对算法进行优化。三. 实验步骤I 、用 Prim 算法求最小生成树i.算法分析及需求分析,程序设计prim 算法的基本思想就是:设 G=(V,E)就是一个无向连通网,令 T=(U,TE) 就是 G 的最小生成树。 T 的初始状态为U=v0(v0
3、)TE=, 然后重复执行下述操作:在所有 uU, vV-U 的边中找一条代价最小的边(u,v)并入集合TE,同时 v 并入 U,直至 U=V 为止。显然 ,Prim 算法的基本思想就是以局部最优化谋求全局的最优化,而且 ,还涉及到起始结点的问题。本程序完成的功能就是:从图中的任意结点出发,都能够找出最小生成树实现方案分析 : Prim 算法的关键就是如何找到连接U 与 V-U 的最短边来扩充生成树T。设当前 T 中有k 个点 (即 T 的顶点集 U 中有 k 个顶点 )则所有满足uU,vV-U 的边最多有k条,从如此大的边集中选取最短边就是不太经济的。利用 MST 性质 ,可以用下述方法构造候
4、选最精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 14 页 - - - - - - - - - - Prim 算法和 Kruskal算法的 Matlab 实现小边集 :对应 V-U 中的每个顶点 ,保留从该顶点到U 中的各顶点的最短边,取候选边最短边集为 V-U 中的 n-k 个顶点所关联的n-k 条最短边的集合。为表示候选最短边集,需设置两个一维数组 lowcostn 与 adjvexn ,其中 lowcost 用来保存集合V-U 中的各顶点与集合U 中顶点的最短边的权值,lowcostv
5、=0 表示顶点 v已经加入最小生成树中;adjvex 用来保存依附于该边在集合 U 中的顶点。例如下式表明顶点与顶点之间的权值为w lowcosti=w; adjvexi=k; 程序流程图关键代码说明 : 1 将用于验证算法正确性的两幅图用邻接矩阵的形式保存,分别保存为文件Graph1、m,Graph2、m(注:矩阵的对角线元素设置为零。)并在主程序finallyprim 中直接进行调用。2 在输入起点时应该给程序的阅读者就该图的顶点数作出提示,不然的话使用者很可能会输入越界下标。采取的方法如下len=length(graph_adjacent);% 求图中有多少个顶点k=sprintf(pl
6、ease input the point where you want to start ,do remember it must be between 1 and %d ,len); start_point=input(k);% 输入最小生成树产生起点采取了 sprintf 格式化字符串的方法,就避免了编程的人每次根据输入图的顶点数手动对提示作修改。效果如下: 在对第一幅图进行算法验证时在workspace 会如下输出 : please input the point where you want to start ,do remember it must be between 1 精品资料
7、 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 2 页,共 14 页 - - - - - - - - - - Prim 算法和 Kruskal算法的 Matlab 实现and 7 在对第二幅图进行算法验证时在workspace 会有如下输出 : please input the point where you want to start ,do remember it must be between 1 and 8 3在输出结果时为了使结果在workspace 中输出的清晰,使人一目了然,也使用了sprintf
8、格式化字符串的方法,代码如下s=0; for ii=1:len-1 k=sprintf(最小生成树第%d条边:(%d,%d),权值为%d,ii,tree(ii,1),tree(ii,2),graph_adjacent(tree(ii,1),tree(ii,2); disp(k); disp( ); s=s+graph_adjacent(tree(ii,1),tree(ii,2); end disp(最小生成树的总代价为:) disp(s); 4下面对算法的核心部分进行说明: 在 len-1 次循环中 ,每次循环要完成以下三项工作1、找到最小边 ,(需要求 lowcost 数组的最小非零值,因为
9、 0 表示该边已经被加入到了最小生成树中) 由于就是求非零的最小值,就不能在直接用min 函数了。 我采取的方法就是这样的 : k=lowcost0;%k 为一逻辑数组 ,它与 lowcost 同维 ,对于每一个位% 置 i 如果 lowcost(i)0 则 k(i)=1 %否则 k(i)=0; 稍候将用这个数组进行辅助寻址cost_min=min(lowcost(k);%找出 lowcost 中除 0 外的最小值index=find(lowcost=cost_min);%找出此最小值在lowcost 中的下标 , 即找到相应的节点index=index(1);% 因为最小值的下标可能不止一个
10、,这里取第一个下标进行处理lowcost(index)=0;% 表明该节点已经加入了最小生成树中采用这种方法不仅充分利用了matlab 的 built_in 函数 ,还避免了自己编写代码 (循环 +判断 lowcostv 就是否为0)来实现寻找不为零的最小值的麻烦,提高了代码执行的效率。2、对 lowcost 与 adjvex 进行更新 ,即:设刚加入最小生成树的顶点为index, 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 3 页,共 14 页 - - - - - - - - - - Prim 算法
11、和 Kruskal算法的 Matlab 实现比较对于U-V 中的每个顶点v:比较 lowcost(v) 与(v,index)边的权值大小,如果(v,index) 边的权值小 ,则令 lowcost(v) 的值为该边的权值,并将 adjvex(v) 的值等于 index for j=1:len if lowcost(j)graph_adjacent(j,index); lowcost(j)=graph_adjacent(j,index); adjvex(j)=index; end end 3、将该边保存tree(i,:)=adjvex(index),index; ii、结果如下求第一张图的最小生
12、成树: 求第二张图的最小生成树: 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 4 页,共 14 页 - - - - - - - - - - Prim 算法和 Kruskal算法的 Matlab 实现II 、 用 Krusal 算法( 避圈法 )求最小生成树i.算法分析及需求分析,程序设计Kruskal 算法的基本思想就是:设无向连通网为G=(V,E), 令 G 的最小生成树为T=(U,TE),其初始状态为U=V ,TE=, 这样 T 中各顶点各自构成一个连通分量。然后按照边的权值由小到大的顺序 ,依次
13、考察边集E 中的各条边。若被考察的边的两个顶点属于T 的两个不同的连通分量 ,则将此边加入到TE 中去 ,同时把两个连通分量连接成一个连通分量;若被考察边的两个结点属于同一个连通分量,则舍去此边 ,以免造成回路,如此下去 ,当 T 中的连通分量个数为1时,此连通分量便为G 的一棵最小生成树。显然 ,Kruskal 算法实现起来要比prim 算法复杂些。选择合适的存储结构存储图,采用合适的排序算法对程序执行效率的提高非常重要,采用简单而明了的方法判断边的两个端点就是否在一个连通分支上更就是尤为重要。一般来说 ,涉及 Kruskal 算法多采取边集数组做为图的存储结构,但考虑到matlab 不像
14、C语言那样可以方便地动态的生成数组与释放内存,仍采取了邻接矩阵的形式保存图,用于测试的两幅图 ,分别保存为Graph11、M,Graph22 、M、(注:邻接矩阵的对角线元素设定为100)这样既方便对边进行操作,又方便对边的顶点进行操作。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 5 页,共 14 页 - - - - - - - - - - Prim 算法和 Kruskal算法的 Matlab 实现使用邻接矩阵容易引起的问题就是: 由于邻接矩阵就是对称矩阵,比如 graph_adjacent(1,2)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022 Prim 算法 Kruskal Matlab 实现
限制150内