1、辽 宁 工 业 大 学物流运输与配送 课程设计(论文)题目:MATLAB 下 Dijkstra 算法的实现院(系): 汽车与交通工程学院 专业班级: 物流工程 091 学 号: 091204016 学生姓名: 卢骏鹏 指导教师: 王殿超 职 称: 助教 起止时间: 2012.12.172012.12.28 课程设计(论文)任务及评语院(系):汽车与交通工程学院 教研室:物流工程教研室学 号 091204016 学生姓名 卢骏鹏 专业班级 物流工程 091课程设计(论 文)题 目MATLAB 下 Dijkstra 算法的实现课程设计(论文)任务在掌握 Dijkstra 算法的基础上,综合运用物流
2、运输与配送 、 运筹学 、物流学等课程理论知识,学会利用 MATLAB 软件编制设计程序,提高理论与实际相结合的应用能力。 要求运用节约法进行配送线路设计,解决课程设计指导书上案例 3,计算应用 MATLAB 软件。编写设计程序,并调试运行,完成以下任务:(1)同组同学每人以一个不同的节点作为出发点手动进行最短路的计算; (2)利用 MATLAB 软件编写程序,以案例 3 的数据作为默认数据对Dijkstra 算法程序进行测试;(3)实现输入数据的界面操作;(4)输入起始点和终点能够自动计算最短路径里程及最短路径。完成课程设计说明书。主要内容包括:Dijkstra 算法的原理、程序框图、部分主
3、要程序及说明、最终结果、结果分析及任务书上要求完成的内容等。指导教师评语及成绩成绩: 指导教师签字: 年 月 日辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)目录一设计目的 1二Dijkstra 算法的原理 12.1 两个指定顶点之间的最短路径 12.2 Dijkstra 算法原理 2三Dijkstra 算法的操作步骤 2四Dijkstra 算法的程序框图 34.1 菜单程序框图 .34.2 输入程序框图 .44.3 main 框图 5五部分主要程序及其说明 65.1 菜单 menu 程序 65.2 原始数据 default_dat 程序 .65.3 输入数据 input_dat
4、 程序 .75.4 迪杰斯特拉算法 main 程序 7六主要任务 96.1 最短路的计算 .96.2 测试 106.2.1 测试 1 106.2.2 测试 2 116.3 实现输入数据界面 116.4 最短路径求取 12参考文献 .13辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)辽 宁 工 学 院 课 程 设 计 说 明 书(论 文)1MATLAB 下 Dijkstra 算法的实现同组同学:佟连庆,胡冰,苗灵卉,牟东旭一设计目的物流运输与配送课程设计是在学生完成物流运输与配送课程学习后必修的教学环节。它一方面要求学生在设计中能初步学会综合运用过去所学的全部知识,另外也为以后毕业
5、设计工作做一次综合训练,学生应当通过物流运输与配送课程设计达到以下几个目的:1.培养学生综合运用物流学 、 物流运输与配送 、 运筹学等课程理论知识的能力。2.培养学生初步掌握配送中心选址、配送线路优化的基本方法和基本理论,学会利用 MATLAB 软件进行程序设计,提高理论与实际相结合的应用能力。3.能够进一步强化学生收集整理资料的能力,提高对文献资料的归纳、写作、综合运用能力。二Dijkstra 算法的原理2.1 两个指定顶点之间的最短路径问题如下:给出了一个连接若干个客户的道路网络,在这个网络的两个指定客户间,找一条最短的路线。以各客户为图 G 的顶点,两客户间的直通路为图 G 相应两顶点
6、间的边,得图 G 。对 G 的每一边 e,赋以一个实数 w(e)直通路的长度,称为 e 的权,得到赋权图 G 。G 的子图的权是指子图的各边的权和。问题就是求赋权图 G 中指定的两个顶点 , 间的0uv具最小权的轨。这条轨叫做 , 间的最短路,它的权叫做 , 间的距离,亦记作0uv0uv。求最短路已有成熟的算法:迪克斯特拉(Dijkstra)算法,其基本思想是按距0,duv从近到远为顺序,依次求得 到 G 的各顶点的最短路和距离,直至 (或直至 G 的0 0所有顶点) ,算法结束。辽 宁 工 学 院 课 程 设 计 说 明 书(论 文)22.2 Dijkstra 算法原理Dijkstra 算法
7、原理 :首先,引进一个辅助向量 D,它的每个分量 D 表示当前所找到1的从始点 v 到每个终点 的最短路径的长度。如 D3=2 表示从始径相对最小长度为 2。iv这里强调相对就是说在算法过程中 D 的值是在不断逼近最终结果但在过程中不一定就等于最短路径长度。它的初始状态为:若从 v 到 有弧,则 D 为弧上的权值;否则置 D 为i。显然,长度为 V 的路径就是从 v 出发的长度最短的一条最短路jMin|i径。此路径为 。那么,下一条长度次短的最短路径是哪一条呢?假设该次短路径的(,)jv终点是 ,则可想而知,这条路径或者是(v, ),或者是(v, , )。它的长度或者是从k kvjkv 到 的
8、弧上的权值,或者是 和从 到 的弧上的权值之和。 一般情况下,假设 SDjj为已求得最短路径的终点的集合,则可证明:下一条最短路径(设其终点为 X)或者是弧(v,x),或者是中间只经过 S 中的顶点而最后到达顶点 X 的路径。因此,下一条长度次短的最短路径的长度必是 V-S其中,D 或者是弧(v, )上的权值,或者jMin|iviv是 ( S)和弧( , )上的权值之和。 迪杰斯特拉算法描述如下:Dkvkvi(1)arcs 表示弧上的权值。若不存在,则置 arcs 为 。S 为已找到从 v 出发的最短路径的终点的集合,初始状态为空集。那么,从 v 出发到图上其余各顶点 可能达到的最i短路径长度
9、的初值为 Locate Vex(G,v),i V; Darcsi(2)选择 vj,使得 V-S;jin|i(3)修改从 v 出发到集合 V-S 上任一顶点 可达的最短路径长度。kv三Dijkstra 算法的操作步骤Dijkstra 算法的操作步骤 :11初始时令回路 ,T=其余顶点,T 中顶点对应的距离值若存在 ,0SV 0,iV为 弧上的权值,若不存在 , 为 ; 0(,)idV0,i 0,iV0(,)id2从 T 中选取一个其距离值为最小的顶点 W 且不在 S 中,加入到 S 中; 3. 对 T 中顶点的距离值进行修改:若加进 W 作中间顶点,从 到 的距离值比不加0iW 的路径要短,则修
10、改此距离值;4. 重复上述步骤 2、3 直到 S 中包含所有顶点,即 S=T 为止。辽 宁 工 学 院 课 程 设 计 说 明 书(论 文)3四Dijkstra 算法的程序框图4.1 菜单程序框图主菜单的程序是使界面上直接显示所需完成的内容,主要完成默认数据导入,输入数据,查看数据,求取路径,退出程序的任务,其具体程序的框图如下图 图 1 菜单程序 menu 框图 所示。开始定义全局变量 ii = 1a d j _ m a t = d e f a u l t _ d a t ( )Yi = 2i = 3i = 4i = 5NNNNa d j _ m a t = i n p u t _ d a
11、t ( )Yd i s p ( a d j _ m a t )Y输入 s t a , d s t输出 “ 默认数据已被启用 ”输出 a d j _ m a ts t a = d s t输出 “ 起始结点与目的结点不能相同 ”Y l e n g , p a t h = d i j k s t r a (a d j _ m a t , s t a , d s t )N输出 l e n gk = l e n g t h ( p a t h )输出p a t h ( i ) , p a t h ( k )结束图 1 菜单 menu 程序框图辽 宁 工 学 院 课 程 设 计 说 明 书(论 文)44.
12、2 输入程序框图输入程序是为了完成从外界输入数据形成一个新的邻接矩阵,产生一组新的数据进行最短路的求解。输入程序框图如下图 图 2 输入 input_dat 程序框图 所示。开始输入全局变量 l e n g t h , i , ja d j _ m a t = z e r o s ( l e n g t h ) ;i = 1i ,path(i);endfprintf(%dn,path(k);endend该段程序完成的是从菜单界面进入程序并选择完成的任务。当输入值为 1 时,程序默认使用原始数据程序即 default_dat,并在界面上输出默认数据已被启用。当输入值为 2 时,程序调用输入程序即
13、 input_dat。当输入值为 3 时,程序输出数据,并在界面上显示。当输入值为 4 时,程序调用迪杰斯特拉算法程序即 main,并在界面上输入起始点和目的点,通过 main 的计算,能输出最短路径和经过的路径。当输入值为 5 时,退出程序。5.2 原始数据 default_dat 程序function adj_mat=default_dat() %定义原始数据函数辽 宁 工 学 院 课 程 设 计 说 明 书(论 文)7length=10; %定义结点个数adj_mat=zeros(length); %邻接矩阵adj_mat(1,1)=0;adj_mat(1,2)=8;adj_mat(1,
14、3)=5;adj_mat(1,4)=9;adj_mat(1,5)=12;adj_mat(1,6)=14;adj_mat(1,7)=12;adj_mat(1,8)=16;adj_mat(1,9)=17;adj_mat(1,10)=22; %原始数据该段程序通过定义结点个数来确定邻接矩阵的宽度,并能输入案例上的的数据,用其来进行测试。5.3 输入数据 input_dat 程序function adj_mat =input_dat() %定义输入数据函数length = input(请输入节点的数量 ); %定义结点个数adj_mat=zeros(length); %定义一个邻接矩阵for i =1
15、:1:length for j =i:1:lengthif i = jfprintf(请输入结点 %d 到结点%d 的长度(没有则输入 0),i,j)adj_mat(i,j) = input(:); %输入结点间的距离if adj_mat(i,j) = 0adj_mat(i,j) = inf;endadj_mat(j,i) = adj_mat(i,j); %对称成为一个完整的对称矩阵endendend该段程序完成的是输入数据的过程,通过在界面上输入的结点数,以及从各结点到其后面的结点之间的距离,在对输入的数据进行对称,使其成为一个完整的矩阵,为以后的计算做铺垫。5.4 迪杰斯特拉算法 main
16、 程序 3m=length(adj_mat); %定义 m 的长度lengs =linspace(0,0,m); %产生行矢量for i = 1:1:m if i = sta lengs(i) = adj_mat(sta,i); if lengs(i) = inf 辽 宁 工 学 院 课 程 设 计 说 明 书(论 文)8paths(i) = sta; end end end %for 循环求起始点到各邻点的距离index = 1; %标号for i = 1:1:m if i = sta min = inf; %让最小值 min 为for j = 1:1:m if lengs(j) 9minV
17、j, , ,M=1,2,3,4,5,6,7,8,ijV; ; ;19172D19204VD319302VD; ; ;440555156681;71976V8198, ,即 10 7minj, , ,M=1,2,3,4,5,6,8ijV; ; ;17123D27212VD373178VD; ; ;4401V550669208789, ,即 10 8minj, , ,M=1,2,3,4,5,61ijV; ; ;18627VD82189VD383123VD; ;4455676645, ,即 10 5min5j, , ,M=1,2,3,4,6ijV; ; ;15127V252132V53192V;44
18、38D668D, ,即 10 6min6j, , ,M=1,2,3,4ijV; ; ;1610Vd26214d363127Vd4473, ,即 10 3min3j, , ,M=1,2,4ijV; ;13152Vd32176d434172Vd, ,即 10 4 或 10 84 或 10 54min48j辽 宁 工 学 院 课 程 设 计 说 明 书(论 文)10, , ,M=1,24i18iVj;1927d421853Vd, ,即 10 1 或 10 31minj, , ,M=2ij212830V, ,即 10 2 或 10 72minj最后得到的具体结果如下所示:起点为 10 点,终点为 1
19、点的最短距离为 22,其路径为 10 1 或 10 31。起点为 10 点,终点为 2 点的最短距离为 22,其路径为 10 2 或 10 72。起点为 10 点,终点为 3 点的最短距离为 17,其路径为 10 3。起点为 10 点,终点为 4 点的最短距离为 18,其路径为 10 4 或 10 84 或10 54。起点为 10 点,终点为 5 点的最短距离为 15,其路径为 10 5。起点为 10 点,终点为 6 点的最短距离为 16,其路径为 10 6。起点为 10 点,终点为 7 点的最短距离为 11,其路径为 10 7。起点为 10 点,终点为 8 点的最短距离为 11,其路径为 1
20、0 8。起点为 10 点,终点为 9 点的最短距离为 10,其路径为 10 9。6.2 测试6.2.1 测试 1以案例 3 的数据作为默认数据对 Dijkstra 算法程序进行测试。现取 10 点为起始点,以 2 点为终点。其手动计算结果为最短路径长度为 22,其路径是 10 2。通过MATLAB 计算得到结果如下图 4 测试结果 1 所示。图 4 测试结果 1辽 宁 工 学 院 课 程 设 计 说 明 书(论 文)116.2.2 测试 2现取 10 点为起始点,以 8 点为终点。其手动计算结果为最短路径长度为 11,其路径是 10 8。通过 MATLAB 计算得到结果如下图 5 测试结果 2
21、 所示。图 5 测试结果 2通过以上随机取的两组数据,经过 MATLAB 的计算与手动的计算,可以看出其结果是完全相同的,能够判断出 Dijkstra 程序的准确性。6.3 实现输入数据界面进行菜单选择的界面操作如图 6 菜单选择界面 所示。在该界面可以完成使用默认数据,输入数据,查看数据,求取路径和退出程序等功能。而且使用该界面能更直观的让使用者使用。图 6 菜单选择界面辽 宁 工 学 院 课 程 设 计 说 明 书(论 文)12以下是实现输入数据与查看数据的任务,在该过程中,可以输入结点的数量,并能输入各结点之间的距离,显示一个对称的矩阵,为以后的求解做准备。其具体的操作步骤如图 7 输入
22、数据 所示。图 7 输入数据6.4 最短路径求取该程序可以完成输入起始点和终点能够自动计算最短路径里程及最短路径。现输入 4 个结点,且结点 1 到结点 2 的距离为 2,结点 1 到结点 3 的距离为 4,结点1 到结点 4 的距离为 5,结点 2 到结点 3 的距离为 6,结点 2 到结点 4 的距离为 2,结点3 到结点 4 的距离为 3。现计算结点 1 到结点 4 的距离,其最短路径为 4,路径是 1 24。使用 MATLAB 程序计算其结果如图 8 求取结果 所示。如图 8 求取结果辽 宁 工 学 院 课 程 设 计 说 明 书(论 文)13参考文献1 http:/ 2 赵晓川.物流配送系统规划M.北京:中国水利水电出版社,2007. 3 林雪松,周婧,林德新. MATLAB7.0 应用集锦. 北京:机械工业出版社,2005. 4 代西武. Dijkstra 矩阵算法D.北京:北京建筑工程学院基础科学部,20075 张志涌,杨祖樱等.MATLAB 教程 7.0M.北京:北京航空航天出版社,2005.