- 在线时间
- 0 小时
- 最后登录
- 2018-6-6
- 注册时间
- 2018-6-6
- 听众数
- 1
- 收听数
- 1
- 能力
- 0 分
- 体力
- 21 点
- 威望
- 0 点
- 阅读权限
- 20
- 积分
- 14
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 14
- 主题
- 2
- 精华
- 0
- 分享
- 8
- 好友
- 2
升级   9.47% TA的每日心情 | 慵懒 2018-6-6 10:42 |
|---|
签到天数: 1 天 [LV.1]初来乍到
 |
最短路问题及其算法
4 y- E1 V3 a4 `* K' e一.实验目的:
* t( q; E0 b! a1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;' o# m% U( C% B9 I- Q4 e: e
2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.' r0 h% C- H( ?# E% W
二.实验内容:
2 z% G' {1 ]5 B1 _+ B' p要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).$ o4 |" J( J8 B) [$ A
为方便计,1km主管道钢管称为1单位钢管.
# E9 s3 k0 l7 [' B/ t一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:" |7 K/ {' v. @, a
4 o% D- b0 K5 u6 `, e
1 2 3 4 5 6 7) Z/ V$ h! P9 C& r# I) o! D( e
* w$ w/ a9 b* w! E% Z
800 800 1000 2000 2000 2000 3000
- j- M9 g0 U/ ^3 x+ x
. v! o; `. C/ y; `. |0 C7 r: H160 155 155 160 155 150 160
2 }2 V0 ?5 U/ Q3 w
8 I- L0 W* e% p& {7 ^3 v% p4 H+ K# F1单位钢管的铁路运价如下表:$ P: S; B G7 C& \- Y
里程(km) 300/ S4 C8 Q; V/ `6 ?
301-350 351-400 401-450 451-500
8 E! F: m3 u8 W4 b运价(万元) 20 23 26 29 32% L: e6 P( y0 K8 F2 }
里程(km) 501-600 601-700 701-800 801-900 901-1000, j- O7 i. V, i0 G& Y* A
运价(万元) 37 44 50 55 60, C, f+ w: V) T- g7 r
1000km以上每增加1至100km运价增加5万元.% J U( }/ J+ Q, u1 c" e# [0 q
公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).- x: H! ~* |- z- @2 v
假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.# O: N2 I- {5 Q9 S# A! u! [5 V' I
" y$ Z# z0 X8 a4 d
试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.
" W) h: o& r. u! i. ?. V三. 模型建立 S Z" ]5 y, v) a ~- k8 E% W, V
设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :) `. _0 Q, _& J3 ^ }5 T
+ T0 R1 V' }' N2 M3 N
利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离) I% v0 k8 j2 C' T* E- b; q" k: j
- Y& a; d. ?% p( D2 W2 `/ S& T
解:先写出带权邻接矩阵:
$ G: m o- R& I. V; Y
$ H0 z& J6 ^* |后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 . d8 T1 O- E# m8 A
四. 模型求解(含经调试后正确的源程序)$ Z9 O* a9 Y& |, b
(1) Dijkstra算法1 x- A E! T/ ^( J: |$ z4 k
road1.m文件源程序:
, [! f9 m% j0 v, c& o# Yw=[0 1200 inf inf inf inf inf inf inf inf;7 d! c" q# l( Y2 T. B
1200 0 12 202 inf inf inf inf inf inf;, g8 r3 E0 Q( L. E, o; i$ ]: P
inf 12 0 inf 201 inf inf inf inf inf;
0 y. U" F7 V8 P2 u, minf 202 inf 0 31 20 inf inf inf inf;1 f" y+ ^3 ?% U9 s% |% l
inf inf 201 31 0 10 inf 205 inf inf;& }) O7 I; F l. E/ a1 k; U# B
inf inf inf 20 10 0 195 inf inf inf;
+ @$ h7 a7 ]3 |# Linf inf inf inf inf 195 0 5 306 inf;
4 q, P% r) v0 s# o8 K+ Vinf inf inf inf 205 inf 5 0 inf 194;: A& z+ j9 }, g$ ]; C
inf inf inf inf inf inf 306 inf 0 10;' ^* X- C0 W2 h5 t6 Q) ]9 ?
inf inf inf inf inf inf inf 194 10 0];
/ W) G1 B- L- q' a: t9 In=size(w,1);
& r( U+ J4 v F) T Hw1=w(1, ;
0 y% v6 _' |; ^* ~# W, Gfor i=1:n' x0 H% V0 }+ {6 u
l(i)=w1(i);
8 `! X# x0 O. Q3 Q2 d z(i)=1;# @, ~0 i* I9 b) F6 x* Y. F7 O; C( Q- |
end
( T# G @1 M% i( ^, z2 h% ws=[];
; ^: w8 G1 l1 \5 i+ o3 _. ]0 hs(1)=1;
4 m0 G, m+ {! x: G* i, Hu=s(1);1 @% k, Q+ O$ J' B
k=1;8 L+ ?0 t& ^3 C, h: K7 @+ O
l;, o( X. V0 ^6 N6 x
z;1 b; n( U$ f3 u' K: D+ n* h1 C
while k<n
8 `5 a# r0 a6 s! q- A for i=1:n7 W2 M; |% h, M% H% k5 U
for j=1:k
O/ U$ t9 s- l/ Y* O if i~=s(j)0 z( G+ v6 m! X# }( j6 ]
if l(i)>l(u)+w(u,i);
! m J+ [5 Z1 y5 E1 X4 O l(i)=l(u)+w(u,i);
6 L0 x" \7 I! X9 W0 y; N) y z(i)=u;1 u# V8 l8 I& T0 l+ U- b
end, C5 B; h, I0 o$ Z A; ` F& X
end
: M2 c ?6 K6 @& O% Y. {$ W end
) E0 k+ i2 j' |2 k& O$ G' i0 R# nend
* M2 Y' y/ }) I- S+ m' ~ l;! i' S9 d1 ]' q+ l, w
z;3 H) G, `, ~6 q9 H. @
ll=l;
+ T; ]" I" `% w! t A& M for i=1:n. x- i2 v3 t2 F1 m8 |$ S& H. K
for j=1:k3 T0 T: ^& [6 V; _8 J) v
if i~=s(j)% o7 `. @! M5 ~8 k; w
ll(i)=ll(i);/ L) M( P$ ~" K8 q
else
- L+ B5 R. F) Y3 H! [& z5 I ll(i)=inf;
. ^; k! s9 ^& k5 Y end
8 B5 ?1 U' Q" ^* r! P* v( Hend" o4 A0 `8 {( t8 N$ a' D4 W7 d
end) g, h b, Z N; _% N2 }
lv=inf;
# C+ c, S0 E$ F( @1 Ufor i=1:n8 ?' D, J& k6 n: d3 H! O9 v
if ll(i)<lv
! w$ l2 q3 K" g$ j lv=ll(i);/ A2 A! Q4 T0 }! M! f; T. }
v=i;
% C' X/ |9 f2 o, l, r3 A! F3 x end3 l/ Q) n; R- E, W* ~4 C
end
8 F0 T# V6 n2 [+ ]lv;
2 I0 S# U# R4 Fv;" Z& c* b% b3 T: m% z' d5 |; Z; H
s(k+1)=v;
l- d) X; u9 q% xk=k+1;
- V6 U& X# b+ e* b; A I7 Q# m7 du=s(k);% u, q! e6 M! c# `% k& i
end
$ G9 N# m/ u! l7 E) y5 El
) }& O, _" F. `: c+ cz
& H( f+ f1 T* K5 K: {( T! j, U- ~4 R H9 c7 _0 J: B' I1 L
(2) Floyd算法
y' n* D, c# Q K8 Nroad2.m文件源程序:
1 ^! y3 e9 U! O7 q, |- m) Q! [a=[0 1200 inf inf inf inf inf inf inf inf; L z! X% N' q! b
1200 0 12 202 inf inf inf inf inf inf;
6 _% c( c3 M+ z( Y6 dinf 12 0 inf 201 inf inf inf inf inf;$ Q1 H( e: s8 V U4 o: [: A& `1 [; O
inf 202 inf 0 31 20 inf inf inf inf;
$ j, D! ?5 y. W; @8 r" Z/ N- h- ninf inf 201 31 0 10 inf 205 inf inf;& X+ K' A6 s0 }9 [1 b3 w
inf inf inf 20 10 0 195 inf inf inf;( n8 M H) W4 k& x
inf inf inf inf inf 195 0 5 306 inf;* c- s1 e8 ^6 }
inf inf inf inf 205 inf 5 0 inf 194;
7 i6 j) r. M) j: D+ linf inf inf inf inf inf 306 inf 0 10;4 ]" E+ K' l& b+ m7 u
inf inf inf inf inf inf inf 194 10 0];$ i N- ?$ R+ T: y; k
[D,R]=floyd(a)
4 w8 a' j T+ i, w, |3 l; Cfloyd.m文件源程序:
' f+ ^$ d d& b. f0 d9 F' ufunction[D,R]=floyd(a)
0 j' y$ ?7 ?* Q3 bn=size(a,1);
; x6 k, Q0 I# C- Y( LD=a
' U+ R$ ^5 X4 t- o% Yfor i=1:n5 g7 p7 Q2 F( g
for j=1:n- J2 |8 ~2 |$ ?0 T; X& q. b- O
R(i,j)=j;* ~7 J: s" n1 L; B1 H& b
end
$ k% L# Q7 u4 i! z) Kend: T( x8 H2 c6 E
R
! i; S; t0 A- \: @) L6 t, f0 Tfor k=1:n- Q, N7 v6 g4 p8 h
for i=1:n7 b; Q- o9 k h# H
for j=1:n+ u& e4 E3 \3 S1 V' ?4 l
if D(i,k)+D(k,j)<D(i,j)
7 y, u$ j' T) W: z7 | D(i,j)=D(i,k)+D(k,j);
0 o, | }) c3 a1 P2 ]7 Z2 V) x- \ R(i,j)=R(i,k);
$ M, R! E3 E M; o end. z/ S3 i1 h* r: g; f4 j$ I
end. d4 `0 V, M7 n# }/ e
end
- v4 C, h" U5 U k2 ~) u: c/ u+ Z, f
D9 u% r) m$ M/ f
R
. l$ i6 o7 A" ~& \2 [1 Wend9 y; @$ n1 W3 w. b2 F
五.结果分析
4 E. Z9 P8 D0 H1 c3 _& U' J2 N(1)Dijkstra算法
8 V! G2 E! E( q @# e/ c运行结果:
* I A* x. L) cl = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812# I; Q8 Z9 k6 w# C
z =1 1 2 2 3 4 6 5 10 8
" S! V" z2 r! n" s" ?* R 0 i$ S: B+ D. q# N; ~4 ^
结果分析:
* ?: M% y+ y6 T3 b: C) g通过运行结果: 到其他顶点的最短路的权 ,可看出,3 @7 @8 q3 U" z7 a* c. O
到 (即 到 )的最短距离为1812(km);8 \3 b! f$ t- |( Y) Q3 x" P
到 (即 到 )的最短距离为1618(km);
0 t2 U B6 k9 d" d8 z$ R% F
# ~5 t/ h. t; a. @. p9 b 到 的最短路径为:V1→V2→V3→V5→V8→V10;& n3 p- `: ^& |( c% u
到 的最短路径为:V1→V2→V3→V5→V8。
7 H; p- Z1 \3 W( G4 j
2 `+ Y" s8 a, D8 f# y(2) Floyd算法
; o# W6 b( U# ^( Z3 b! M6 k运行结果:- l! j% Y* O3 U @- d1 {; M
D =
/ B6 y7 o3 q4 j7 x# ^$ R5 y6 p 0 1200 1212 1402 1413 1422 1617 1618 1822 18126 j8 H- ~) f1 D- v$ \
1200 0 12 202 213 222 417 418 622 612' b4 W5 l$ L5 G
1212 12 0 214 201 211 406 406 610 600
* C( O2 e( K: i( R 1402 202 214 0 30 20 215 220 424 414
: R( ~3 W. A' ]. t( O: t* s) T# Q 1413 213 201 30 0 10 205 205 409 3999 V U" ^9 Y5 K5 P, X
1422 222 211 20 10 0 195 200 404 394
! p; q. O( \6 _! R* W, O# ]+ L9 Z# I 1617 417 406 215 205 195 0 5 209 1998 V9 [; F8 Z& _
1618 418 406 220 205 200 5 0 204 194( ]5 |1 Y8 t# p7 n) i8 T. A$ Y
1822 622 610 424 409 404 209 204 0 10
8 l% @9 M0 T; \ ^" C& n; y 1812 612 600 414 399 394 199 194 10 0
' T" L) W1 {. M
* s, R; a% u: Y7 D. ]R =
0 u9 e$ Y+ p. Y, f8 R0 S" S0 q 1 2 2 2 2 2 2 2 2 2
7 [+ r- _/ k" F 1 2 3 4 3 4 4 3 3 3
. `6 E8 l" l$ H" D: p7 k7 n 2 2 3 2 5 5 5 5 5 5
3 u: R% H$ n* C 2 2 2 4 6 6 6 6 6 6
/ u' M: E: G5 o2 O3 v% T& [- B; U 3 3 3 6 5 6 6 8 8 8
- i1 |" U6 T% }; `+ r! L2 W9 r" _ 4 4 5 4 5 6 7 7 7 7
" y4 J, J1 {: f" K3 b$ g 6 6 6 6 6 6 7 8 8 8
* u7 {3 o0 A: ^/ L5 P2 Z# j 5 5 5 7 5 7 7 8 10 10
; B3 I" E) h2 b" ` 10 10 10 10 10 10 10 10 9 10
/ A V5 p9 N, D5 x: z7 \ 8 8 8 8 8 8 8 8 9 102 E1 I2 W- \0 i2 t% n9 m
结果分析:
7 X. r3 P; L' ^# z" y/ G通过运行结果:可看出,, Q; e; |8 c; y+ _3 y
到 (即 到 )的最短距离为1812(km);2 ~7 h8 a. L) Q! e% j8 o9 d6 K
到 的最短路径为:V1→V2→V3→V5→V8→V10;
6 Q3 ?) d6 V3 n, S2 E, B9 G! U 到 (即 到 )的最短距离为1618(km);2 Z" k4 ?# M1 a, N
到 的最短路径为:V1→V2→V3→V5→V8。 w' j6 p* ?; x P+ u" h z
% T- _) D7 [( d# F3 O
5 e9 y: ], _, J. k6 g M |
zan
|