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

上传人:b****6 文档编号:21124638 上传时间:2023-01-27 格式:DOCX 页数:16 大小:79.42KB
下载 相关 举报
Floyd最短路径算法Word文档下载推荐.docx_第1页
第1页 / 共16页
Floyd最短路径算法Word文档下载推荐.docx_第2页
第2页 / 共16页
Floyd最短路径算法Word文档下载推荐.docx_第3页
第3页 / 共16页
Floyd最短路径算法Word文档下载推荐.docx_第4页
第4页 / 共16页
Floyd最短路径算法Word文档下载推荐.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

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

《Floyd最短路径算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Floyd最短路径算法Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。

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

...->

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)时,就要让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 

#define 

MAXSIZE 

20 

void 

floyd(int[][MAXSIZE],int[][MAXSIZE],int);

display_path(int[][MAXSIZE],int[][MAXSIZE],int);

reverse(int[],int);

readin(int[][MAXSIZE],int*);

MAXSUM(a,b) 

(((a)!

=INT_MAX&

&

(b)!

=INT_MAX)?

\

((a)+(b)):

INT_MAX)

voidfloyd(intdist[][MAXSIZE],intpath[][MAXSIZE],intn)

{

int 

i,j,k;

for(i=0;

i<

n;

i++) 

for(j=0;

j<

path[j]=i;

for(k=0;

k<

for(i=0;

i++)

j++) 

if(dist[j]>

MAXSUM(dist[k],dist[k][j])) 

path[j]=path[k][j];

dist[j]=MAXSUM(dist[k],dist[k][j]);

}

voiddisplay_path(intdist[][MAXSIZE],intpath[][MAXSIZE],intn)

*chain;

count;

printf("

\n\nOrigin->

Dest 

Dist 

ath"

);

printf( 

"

\n-----------------------------"

chain=(int*)malloc(sizeof(int)*n);

if(i!

=j)

printf("

\n%6d->

%d 

"

i+1,j+1);

if(dist[j]==INT_MAX)

NA 

else

%4d 

dist[j]);

count=0;

k=j;

do

{

k=chain[count++]=path[k];

}while(i!

=k);

reverse(chain,count);

%d"

chain[0]+1);

for(k=1;

count;

k++)

->

chain[k]+1);

j+1);

free(chain);

#defineSWAP(a,b) 

{temp=a;

a=b;

b=temp;

}

voidreverse(intx[],intn)

i,j,temp;

for(i=0,j=n-1;

j;

i++,j--)

SWAP(x,x[j]);

voidreadin(intdist[][MAXSIZE],int*number)

origin,dest,length,n;

i,j;

charline[100];

gets(line);

sscanf(line,"

&

n);

*number=n;

dist[j]=INT_MAX;

dist=0;

%d%d%d"

origin,&

dest,&

length);

while(origin!

=0&

dest!

length!

=0)

dist[origin-1][dest-1]=length;

测试程序如下所示:

intmain(void)

intdist[MAXSIZE][MAXSIZE];

intpath[MAXSIZE][MAXSIZE];

intn;

\nInputthepathinformation:

\n----------------------------\n"

readin(dist,&

floyd(dist,path,n);

display_path(dist,path,n);

getchar();

其中readin函数规定了输入的格式,第一列是指出有多少个城市;

第二列以后每行三个数;

第一个和第二个是一条路径的起点和终点,第三个数是路径的长度,最后以三个0作为输入结束条件。

下面是一个输入的例子:

Inputthepathinformation:

--------------------------------------

4

5

50

15

30

0

对应的输出结果为:

Origin->

Path

----------------------------------------------

1->

2

15 

1->

2->

4->

3

10 

2->

1

3->

30 

3->

35 

4->

Dijkstra算法是由荷兰计算机科学家艾兹格?

迪科斯彻发现的。

算法解决的是有向图中最短路径问题。

举例来说,如果图中的顶点表示城市,而边上的权重表示著城市间开车行经的距离。

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的最低花费路径(i.e.最短路径)。

这个算法也可以在一个图中,找到从一个顶点s到任何其他顶点的最短路径。

算法描述

这个算法是通过为每个顶点v保留目前为止所找到的从s到v的最短路径来工作的。

初始时,源点s的路径长度值被赋为0(d[s]=0),同时把所有其他顶点的路径长度设为无穷大,即表示我们不知道任何通向这些顶点的路径(对于V中所有顶点v除s外d[v]=∞)。

当算法结束时,d[v]中储存的便是从s到v的最短路径,或者如果路径不存在的话是无穷大。

Dijstra算法的基础操作是边的拓展:

如果存在一条从u到v的边,那么从s到u的最短路径可以通过将边(u,v)添加到尾部来拓展一条从s到v的路径。

这条路径的长度是d+w(u,v)。

如果这个值比目前已知的d[v]的值要小,我们可以用新值来替代当前d[v]中的值。

拓展边的操作一直执行到所有的d[v]都代表从s到v最短路径的花费。

这个算法经过组织因而当d达到它最终的值的时候没条边(u,v)都只被拓展一次。

算法维护两个顶点集S和Q。

集合S保留了我们已知的所有d[v]的值已经是最短路径的值顶点,而集合Q则保留其他所有顶点。

集合S初始状态为空,而后每一步都有一个顶点从Q移动到S。

这个被选择的顶点是Q中拥有最小的d值的顶点。

当一个顶点u从Q中转移到了S中,算法对每条外接边(u,v)进行拓展。

在下面的算法中,u:

=Extract_Min(Q)在在顶点集Q中搜索有最小的d值的顶点u。

这个顶点被从集合Q中删除并返回给用户。

functionDijkstra(G,w,s)

foreachvertexvinV[G] 

//初始化

d[v]:

=infinity

previous[v]:

=undefined

d[s]:

=0

S:

=emptyset

Q:

=setofallvertices

whileQisnotanemptyset 

//Dijstra算法主体

u:

=Extract_Min(Q)

=Sunion{u}

11 

foreachedge(u,v)outgoingfromu

12 

ifd[v]>

d+w(u,v) 

//拓展边(u,v)

13 

=d+w(u,v)

14 

=u

如果我们只对在s和t之间寻找一条最短路径的话,我们可以在第9行添加条件如果满足u=t的话终止程序。

现在我们可以通过迭代来回溯出s到t的最短路径

1S:

=emptysequence

2u:

=t

3whiledefinedu 

insertutothebeginningofS

u:

=previous

现在序列S就是从s到t的最短路径的顶点集.本人自己写的蚁群算法。

完全能够实现功能,就是收敛速度感觉有点慢。

%function[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACO(C,D,s,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

%%AntColonyOptimizationAlgorithmforRoadSelectProblem

%%LiLixin,ShenYangInsituteofAeronauticalengineering,ShenYang,China

%%Email:

myassist@

%%Allrightsreserved

%%-------------------------------------------------------------------------

%%主要符号说明

%%Cn个城市的坐标,n×

2的矩阵

%%D道路连通加权矩阵

%%s起点

%%e终点

%%NC_max最大迭代次数

%%m蚂蚁个数

%%Alpha表征信息素重要程度的参数

%%Beta表征启发式因子重要程度的参数

%%Rho信息素蒸发系数

%%Q信息素增加强度系数

%%R_best各代最佳路线

%%L_best各代最佳路线的长度

%

clc

clear

%设置初始参数如下:

m=10;

Alpha=1;

Beta=5;

Rho=0.1;

NC_max=100;

Q=100;

%设定起始点

s=1;

e=50;

%31城市坐标为:

C=[601.6 

971.7

988.8 

482.6

54.4 

549.6

95.4 

868

529.1 

429.5

982 

350.5

654.3 

23.2

738.1 

372

538.9 

593.7

560.1 

850.3

229.2 

805.9

411.2 

710

83.2 

706.2

937.4 

800.5

11.9 

994.4

694.1 

809.1

795.4 

758.8

338.9 

148.1

955.8 

643.8

345.7 

726.2

550.3 

349.6

183.7 

935.1

640 

544

854.6 

842.4

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

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

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