ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:79.42KB ,
资源ID:21124638      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21124638.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Floyd最短路径算法Word文档下载推荐.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Floyd最短路径算法Word文档下载推荐.docx

1、.-p-j,也就是说p是i到j的最短行径中的j之前的最后一个城市。P矩阵的初值为p(ij)=i。有了这个矩阵之后,要找最短路径就轻而易举了。对于i到j而言找出p(ij),令为p,就知道了路径i-j;再去找p(ip),如果值为q,i到p的最短路径为i-q-p;再去找p(iq),如果值为r,i到q的最短路径为i-r-q;所以一再反复,到了某个p(it)的值为i时,就表示i到t的最短路径为i-t,就会的到答案了,i到j的最短行径为i-t-j。因为上述的算法是从终点到起点的顺序找出来的,所以输出的时候要把它倒过来。但是,如何动态的回填P矩阵的值呢?回想一下,当d(ij)d(ik)+d(kj)时,就要让

2、i到j的最短路径改为走i-k-j这一条路,但是d(kj)的值是已知的,换句话说,就是k-j这条路是已知的,所以k-j这条路上j的上一个城市(即p(kj)也是已知的,当然,因为要改走i-j这一条路,j的上一个城市正好是p(kj)。所以一旦发现d(ij)d(ik)+d(kj),就把p(kj)存入p(ij)。下面是具体的C代码:#include#defineMAXSIZE20voidfloyd(int MAXSIZE, int MAXSIZE, int);display_path(int MAXSIZE, int MAXSIZE, int);reverse(int , int);readin(int

3、 MAXSIZE, int *);MAXSUM(a, b)(a) != INT_MAX & (b) != INT_MAX) ? (a) + (b) : INT_MAX)void floyd(int distMAXSIZE, int pathMAXSIZE, int n) inti, j, k; for (i = 0; i n; i+)for (j = 0; j pathj = i; for (k = 0; k MAXSUM(distk, distkj) pathj = pathkj; distj = MAXSUM(distk, distkj);void display_path(int dis

4、tMAXSIZE, int pathMAXSIZE, int n)*chain;count; printf(nnOrigin-DestDistath); printf(n- chain = (int *) malloc(sizeof(int)*n);if (i != j)printf(n%6d-%d , i+1, j+1);if (distj = INT_MAX) NAelse%4d, distj); count = 0; k = j; do k = chaincount+ = pathk; while (i != k); reverse(chain, count);%d, chain0+1)

5、; for (k = 1; count; k+)-, chaink+1);, j+1); free(chain);#define SWAP(a, b) temp = a; a = b; b = temp; void reverse(int x, int n)i, j, temp; for (i = 0, j = n-1; j; i+, j-)SWAP(x, xj);void readin(int distMAXSIZE, int *number)origin, dest, length, n;i, j; char line100; gets(line); sscanf(line, , &n);

6、 *number = n; distj = INT_MAX;dist = 0;%d%d%dorigin, &dest, &length); while (origin != 0 & dest ! length != 0) distorigin-1dest-1 = length;测试程序如下所示:int main(void) int distMAXSIZEMAXSIZE; int pathMAXSIZEMAXSIZE; int n;nInput the path information:n-n readin(dist, & floyd(dist, path, n); display_path(d

7、ist, path, n); getchar();其中readin函数规定了输入的格式,第一列是指出有多少个城市;第二列以后每行三个数;第一个和第二个是一条路径的起点和终点,第三个数是路径的长度,最后以三个0作为输入结束条件。下面是一个输入的例子:Input the path information:-41 2 52 1 50 3 15 43 3040 0 0对应的输出结果为:Origin- Path-1- 5215 1-2-4-310 2-13-30 3-35 4-Dijkstra算法是由荷兰计算机科学家艾兹格?迪科斯彻发现的。算法解决的是有向图中最短路径问题。举例来说,如果图中的顶点表示城

8、市,而边上的权重表示著城市间开车行经的距离。 Dijkstra算法可以用来找到两个城市之间的最短路径。Dijkstra算法的输入包含了一个有权重的有向图G,以及G中的一个来源顶点S。 我们以V表示G中所有顶点的集合。 每一个图中的边,都是两个顶点所形成的有序元素对。(u,v)表示从顶点u到v有路径相连。 我们以E所有边的集合,而边的权重则由权重函数w: E 0, 定义。 因此,w(u,v)就是从顶点u到顶点v的非负花费值(cost)。 边的花费可以想像成两个顶点之间的距离。任两点间路径的花费值,就是该路径上所有边的花费值总和。 已知有V中有顶点s及t,Dijkstra算法可以找到s到t的最低花

9、费路径(i.e. 最短路径)。 这个算法也可以在一个图中,找到从一个顶点s到任何其他顶点的最短路径。算法描述这个算法是通过为每个顶点v保留目前为止所找到的从s到v的最短路径来工作的。初始时,源点s的路径长度值被赋为0(ds=0), 同时把所有其他顶点的路径长度设为无穷大,即表示我们不知道任何通向这些顶点的路径(对于V中所有顶点v除s外dv= )。当算法结束时,dv中储存的便是从s到v的最短路径,或者如果路径不存在的话是无穷大。 Dijstra算法的基础操作是边的拓展:如果存在一条从u到v的边,那么从s到u的最短路径可以通过将边(u,v)添加到尾部来拓展一条从s到v的路径。这条路径的长度是d+w

10、(u,v)。如果这个值比目前已知的dv的值要小,我们可以用新值来替代当前dv中的值。拓展边的操作一直执行到所有的dv都代表从s到v最短路径的花费。这个算法经过组织因而当d达到它最终的值的时候没条边(u,v)都只被拓展一次。算法维护两个顶点集S和Q。集合S保留了我们已知的所有dv的值已经是最短路径的值顶点,而集合Q则保留其他所有顶点。集合S初始状态为空,而后每一步都有一个顶点从Q移动到S。这个被选择的顶点是Q中拥有最小的d值的顶点。当一个顶点u从Q中转移到了S中,算法对每条外接边(u,v)进行拓展。在下面的算法中,u:=Extract_Min(Q)在在顶点集Q中搜索有最小的d值的顶点u。这个顶点

11、被从集合Q中删除并返回给用户。function Dijkstra(G, w, s)for each vertex v in VG/ 初始化dv := infinitypreviousv := undefined5ds := 06S := empty set7Q := set of all vertices8while Q is not an empty set / Dijstra算法主体9u := Extract_Min(Q)= S union u11for each edge (u,v) outgoing from u12if dv d + w(u,v) / 拓展边(u,v)13= d +

12、w(u,v)14= u如果我们只对在s和t之间寻找一条最短路径的话,我们可以在第9行添加条件如果满足u=t的话终止程序。现在我们可以通过迭代来回溯出s到t的最短路径1 S := empty sequence 2 u := t3 while defined u insert u to the beginning of S u := previous现在序列S就是从s到t的最短路径的顶点集. 本人自己写的蚁群算法。完全能够实现功能,就是收敛速度感觉有点慢。% function R_best,L_best,L_ave,Shortest_Route,Shortest_Length=ACO(C,D,s,

13、e,NC_max,m,Alpha,Beta,Rho,Q)% function Shortest_Route,Shortest_Length=ACOR(C,D,s,e,NC_max,m,Alpha,Beta,Rho,Q)%=% ACO.m% Ant Colony Optimization Algorithm for Road Select Problem% LiLixin,ShenYang Insitute of Aeronautical engineering ,ShenYang,China% Email:myassist% All rights reserved%-% 主要符号说明% C n

14、个城市的坐标,n2的矩阵% D 道路连通加权矩阵% s 起点% e 终点% NC_max 最大迭代次数% m 蚂蚁个数% Alpha 表征信息素重要程度的参数% Beta 表征启发式因子重要程度的参数% Rho 信息素蒸发系数% Q 信息素增加强度系数% R_best 各代最佳路线% L_best 各代最佳路线的长度% clcclear% 设置初始参数如下:m=10;Alpha=1;Beta=5;Rho=0.1;NC_max=100;Q=100;%设定起始点s=1;e=50;% 31城市坐标为:C=601.6 971.7988.8 482.654.4 549.695.4 868529.1 429.5982 350.5654.3 23.2738.1 372538.9 593.7560.1 850.3229.2 805.9411.2 71083.2 706.2937.4 800.511.9 994.4694.1 809.1795.4 758.8338.9 148.1955.8 643.8345.7 726.2550.3 349.6183.7 935.1640 544854.6 842.4

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1