prim算法和kruskal算法的matlab实现

prim算法和kruskal算法的matlab实现

ID:26443475

大小:586.50 KB

页数:14页

时间:2018-11-27

prim算法和kruskal算法的matlab实现_第1页
prim算法和kruskal算法的matlab实现_第2页
prim算法和kruskal算法的matlab实现_第3页
prim算法和kruskal算法的matlab实现_第4页
prim算法和kruskal算法的matlab实现_第5页
资源描述:

《prim算法和kruskal算法的matlab实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、《计算机仿真》期末大作业Prim算法和Kruskal算法的Matlab实现05605刘禹050697(30)连线问题应用举例:欲铺设连接个城市的高速公路,若城与城之间的高速公路造价为,试设计一个线路图,使总的造价最低。连线问题的数学模型就是图论中在连通的赋权图上求权最小的支撑树。试用Matlab分别实现求最小支撑数的Prim算法和Krusal算法(避圈法)。一.基本要求:(1)画出程序流程图;(2)对关键算法、变量和步骤进行解释说明;(3)用如下两图对所写算法的正确性进行验证。即输入图的信息,输出对应图的最小支撑树及其权值。(4)分析两种算法的实现复杂度。二.扩展要求:(1

2、)提供对算法效率(复杂度)进行评估的方法,并通过举例验证,与分析得到的算法复杂度结果相对照;(2)从降低内存消耗、减少计算时间的角度,对算法进行优化。三.实验步骤I.用Prim算法求最小生成树i.算法分析及需求分析,程序设计prim算法的基本思想是:设G=(V,E)是一个无向连通网,令T=(U,TE)是G的最小生成树。T的初始状态为U={v0}(v0)TE={},然后重复执行下述操作:在所有uU,vV-U的边中找一条代价最小的边(u,v)并入集合TE,同时v并入U,直至U=V为止。显然,Prim算法的基本思想是以局部最优14/14化谋求全局的最优化,而且,还涉及到起始结点的

3、问题。本程序完成的功能是:从图中的任意结点出发,都能够找出最小生成树实现方案分析: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中的各顶点

4、与集合U中顶点的最短边的权值,lowcost[v]=0表示顶点v已经加入最小生成树中;adjvex用来保存依附于该边在集合U中的顶点。例如下式表明顶点和顶点之间的权值为wlowcost[i]=w;adjvex[i]=k;程序流程图关键代码说明:1.将用于验证算法正确性的两幅图用邻接矩阵的形式保存,分别保存为文件Graph1.m,Graph2.m(注:矩阵的对角线元素设置为零。)并在主程序finallyprim中直接进行调用。2.在输入起点时应该给程序的阅读者就该图的顶点数作出提示,不然的话使用者很可能会输入越界下标。采取的方法如下len=length(graph_adjac

5、ent);%求图中有多少个顶点14/14k=sprintf('pleaseinputthepointwhereyouwanttostart,dorememberitmustbebetween1and%d',len);start_point=input(k);%输入最小生成树产生起点采取了sprintf格式化字符串的方法,就避免了编程的人每次根据输入图的顶点数手动对提示作修改。效果如下:在对第一幅图进行算法验证时在workspace会如下输出:pleaseinputthepointwhereyouwanttostart,dorememberitmustbebetween1an

6、d7在对第二幅图进行算法验证时在workspace会有如下输出:pleaseinputthepointwhereyouwanttostart,dorememberitmustbebetween1and81.在输出结果时为了使结果在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);d

7、isp('');s=s+graph_adjacent(tree(ii,1),tree(ii,2));enddisp('最小生成树的总代价为:')disp(s);2.下面对算法的核心部分进行说明:在len-1次循环中,每次循环要完成以下三项工作1.找到最小边,(需要求lowcost数组的最小非零值,因为0表示该边已经被加入到了最小生成树中)由于是求非零的最小值,就不能在直接用min函数了。我采取的方法是这样的:k=lowcost>0;%k为一逻辑数组,它和lowcost同维,对于每一个位%置i如果lowcost(i)

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。