1 / 18
文档名称:

Prim算法和Kruskal算法的Matlab实现.doc

格式:doc   大小:244KB   页数:18页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Prim算法和Kruskal算法的Matlab实现.doc

上传人:文库旗舰店 2019/12/20 文件大小:244 KB

下载得到文件列表

Prim算法和Kruskal算法的Matlab实现.doc

文档介绍

文档介绍:Prim算法和Kruskal算法的Matlab实现《计算机仿真》期末大作业Prim算法和Kruskal算法的Matlab实现05605刘禹050697(30)连线问题应用举例:个城市的高速公路,若城与城之间的高速公路造价为,试设计欲铺设连接jnCiij一个线路图,使总的造价最低。连线问题的数学模型就是图论中在连通的赋权图上求权最小的支撑树。试用Matlab分别实现求最小支撑数的Prim算法和Krusal算法(避圈法)。:(1)画出程序流程图;(2)对关键算法、变量和步骤进行解释说明;(3)用如下两图对所写算法的正确性进行验证。即输入图的信息,输出对应图的最小支撑树及其权值。24v23629v92v3115vv5165620164344v85v745(4)分析两种算法的实现复杂度。:(1)提供对算法效率(复杂度)进行评估的方法,并通过举例验证,与分析得到的算法复杂度结果相对照;(2)从降低内存消耗、减少计算时间的角度,对算法进行优化。三((算法分析及需求分析,程序设计prim算法的基本思想是:设G=(V,E)是一个无向连通网,令T=(U,TE)是G的最小生成树。T的初始状态为U={v0}(v0)TE={},然后重复执行下述操作:在所有uU,vV-U的边中找一条代价最小的边(u,v)并入集合TE,同时v并入U,直至U=V为止。显然,Prim算法的基本思想是以局部最优化谋求全局的最优化,而且,还涉及到起始结点的问题。本程序完成的功能是:从图中的任意结点出发,都能够找出最小生成树1/14实现方案分析:Prim算法的关键是如何找到连接U和V-U的最短边来扩充生成树T。设当前T中有k个点(即T的顶点集U中有k个顶点)则所有满足uU,vV-U的边最多有k条,从如此大的边集中选取最短边是不太经济的。利用MST性质,可以用下述方法构造候选最小边集:对应V-U中的每个顶点,保留从该顶点到U中的各顶点的最短边,取候选边最短边集为V-U中的n-k个顶点所关联的n-k条最短边的集合。为表示候选最短边集,需设置两个一维数组lowcost[n]和adjvex[n],其中lowcost用来保存集合V-U中的各顶点与集合U中顶点的最短边的权值,lowcost[v]=0表示顶点v已经加入最小生成树中;adjvex用来保存依附于该边在集合U中的顶点。例如下式表明顶点和顶点之间的权值为wlowcost[i]=w;adjvex[i]=k;程序流程图关键代码说明:1(将用于验证算法正确性的两幅图用邻接矩阵的形式保存,,(注:矩阵的对角线元素设置为零。)并在主程序finallyprim中直接进行调用。2(在输入起点时应该给程序的阅读者就该图的顶点数作出提示,不然的话使用者很可能会输入越界下标。采取的方法如下len=length(graph_adjacent);%求图中有多少个顶点k=sprintf('pleaseinputthepointwhereyouwanttostart,dorememberitmustbebetween1and%d',len);2/14start_point=input(k);%输入最小生成树产生起点采取了sprintf格式化字符串的方法,就避免了编程的人每次根据输入图的顶点数手动对提示作修改。效果如下:在对第一幅图进行算法验证时在workspace会如下输出:pleaseinputthepointwhereyouwanttostart,dorememberitmustbebetween1and7在对第二幅图进行算法验证时在workspace会有如下输出:pleaseinputthepointwhereyouwanttostart,dorememberitmustbebetween1and83(在输出结果时为了使结果在workspace中输出的清晰,使人一目了然,也使用了sprintf格式化字符串的方法,代码如下s=0;forii=1:len-1k=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));enddisp('最小生成树的总代价为:')disp(s);4(下面对算法的核心部分进行说明:在len-1次循环中,,(需要求lowcost数组的最小非零值,因为0表示该边已经被加入到了最小生成树中)由于是求非零的最小值,就不能在直接用min函数