- 在线时间
- 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]初来乍到
 |
最短路问题及其算法
, R8 G9 b2 W) b/ s2 }9 C一.实验目的:
5 v3 Q: s/ x! C' _) F% s! a. J1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;
( W: [ Z& N/ C1 a6 g1 k2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.
8 g. Z; S' h: f+ v0 k3 N9 Y$ I二.实验内容:2 T8 R" F$ `9 [. L+ L
要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).9 a: E I8 h9 Q T
为方便计,1km主管道钢管称为1单位钢管.
- b$ p1 o. U' L+ t8 v- }# y一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:
- m9 q" P- I7 V# @) o* h 3 V( r$ r: K. u& d0 s3 N u$ j- r) ]
1 2 3 4 5 6 78 e9 e* z" b2 s1 C9 h# b4 d
# e, ~- m- b0 L; y% y3 e; v800 800 1000 2000 2000 2000 3000
3 s* T' u6 a' C/ m" E
: y \3 q# R4 t& ]0 {/ ] c0 f160 155 155 160 155 150 160" \; L* Q) P( d9 s+ B; `
6 ~% n9 [3 S$ I
1单位钢管的铁路运价如下表:
1 M/ O/ _$ ]! |$ T里程(km) 300
4 k7 C& ]' ^ r5 u! w' _301-350 351-400 401-450 451-500, s/ f5 M0 t- U2 I2 S9 n# q4 H' e
运价(万元) 20 23 26 29 32
# W9 w4 E1 |3 R, z$ r& E+ v里程(km) 501-600 601-700 701-800 801-900 901-1000
8 |7 b6 O. k& l运价(万元) 37 44 50 55 602 E+ `5 l$ T3 J- x' l! q& y
1000km以上每增加1至100km运价增加5万元.; J- x3 O: Y: u# @& s
公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).- w# l+ o' E) h$ f5 J) k: X. i
假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.
( m) o5 O/ b. l4 T) u1 D3 a , r4 h* p. ?- ]5 }* b& {* ^
试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.
) n& O2 D- I5 m) {. U三. 模型建立! e5 C7 Y1 V1 q; t3 [- Q) Z
设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :
( S0 V7 s. i+ H6 H6 D& R* E
# R; T4 l L" J$ z# `利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离
2 J; `- I! i" I4 W$ p; ]* ^ + I% j7 r1 K. w; `6 F
解:先写出带权邻接矩阵:
% f' [, E$ Z5 G+ o } ?4 n5 f
& F& ?& O2 D. l! O& n后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .7 Y; |& w5 H" P/ T0 N
四. 模型求解(含经调试后正确的源程序)0 [+ S; L% g: x$ E3 P
(1) Dijkstra算法
. `2 R0 H% O% m# D! K$ }( [road1.m文件源程序:9 K Z0 B$ p; X1 j; u# C( j
w=[0 1200 inf inf inf inf inf inf inf inf;; [# Q' I: u# N1 g. p! T
1200 0 12 202 inf inf inf inf inf inf;8 K7 C# Q, U: V6 D# n0 F
inf 12 0 inf 201 inf inf inf inf inf;6 q6 E) q6 j& j& ]" p: D2 J- Z
inf 202 inf 0 31 20 inf inf inf inf;2 }- u7 F4 c6 t+ l2 n& b
inf inf 201 31 0 10 inf 205 inf inf;7 t t2 ^3 A4 u4 r/ {
inf inf inf 20 10 0 195 inf inf inf;4 G7 E" ~4 ~/ ]7 \1 n0 |
inf inf inf inf inf 195 0 5 306 inf;) b; t: P( g3 K! D# o4 L) ?4 e
inf inf inf inf 205 inf 5 0 inf 194; d2 j9 f; p& N% q4 `
inf inf inf inf inf inf 306 inf 0 10;
7 |' g! m8 a: N1 Q6 C4 U0 Vinf inf inf inf inf inf inf 194 10 0]; , k, W4 x- }8 M9 [' h- U
n=size(w,1);8 p7 b6 m2 h7 `' O* E
w1=w(1, ;
# m8 R" s3 p2 b4 E Xfor i=1:n
' U: @: V+ r% O- \5 l l(i)=w1(i);6 x' c& o! H( g* l; A3 m/ [
z(i)=1;) u4 L4 Z" U9 G" m7 U5 ]- M' [
end
( `& E1 R! r1 X# r- Ns=[];9 J. d" t6 P# ?0 T% I
s(1)=1;
! A8 B* Y0 U$ C: ~u=s(1);
4 {9 r+ A/ P+ [6 kk=1;8 n1 k; g" ^. N3 b
l;
7 y# J' E: ]' n: f* s$ Mz;
0 \6 c5 i( y( [; d. ?7 w3 h- Gwhile k<n6 X" X6 c. v) C5 @* ^
for i=1:n
# H: T2 @3 H0 c% S) Y: ] for j=1:k
9 T5 \. b+ i# n1 s9 i: O if i~=s(j); h- ?! A# k+ [# L: V
if l(i)>l(u)+w(u,i);, z! t; G+ F# _6 I
l(i)=l(u)+w(u,i);
; [' ^" n5 w" V z(i)=u;
2 i/ @+ y0 a/ @ I) z( f/ z( a end
5 g5 |" Z& k6 G% P9 @: C! I end0 @0 m `$ U, D! I2 T- e: ^3 t
end: h4 t9 S) x3 g# T8 i. t% K8 p
end
B" p/ F7 j3 e% Z( E* k l;
B, _! |% O% d7 \- m z;
" N4 n! B4 u0 x8 l$ d5 Qll=l;( K0 z. e( }1 H% n7 e$ \$ p
for i=1:n
' ^" f! ^% J9 f: W2 d/ @ for j=1:k
; h0 f+ i' i! \: p7 i if i~=s(j)
) z$ m' v9 |; x7 s ll(i)=ll(i);# w$ ]7 p" ~* B7 L: n
else7 A2 y5 D Y9 O: q8 L# K
ll(i)=inf;/ S3 q( J8 [& \7 c0 |
end
2 M$ t& \( t8 dend
$ o3 E; s3 l/ A: Iend4 L: p7 T$ _% k0 X2 `; \* |% `
lv=inf;" Q. }0 a" L: ^/ j
for i=1:n
: V# e0 T0 _; Z if ll(i)<lv
A7 o* p5 z) p2 R, x& ~1 h* @+ ]5 W& h lv=ll(i);( f# K$ K# Q$ C, {8 V
v=i;9 ?2 ]* z1 q; m* [" d/ |. d
end
2 [3 e$ W) Q9 A0 x9 ^( g4 Send% i0 _/ W+ N3 G+ ?2 X
lv;+ T( ]; ~0 Z$ `% [
v;- a6 }1 D7 o2 v' @
s(k+1)=v;3 x+ ?( }# J t# `! e. B
k=k+1;
3 x3 w9 V* ` y! J# I0 \u=s(k);
5 \. D- ^* E4 j4 A: Uend
7 R4 L6 U4 P7 }% v% {l D# w0 F. ^3 F& R
z
$ E& e# t. F5 b1 R1 x6 W8 [! V% f2 p
(2) Floyd算法/ M% t9 U* ^- J0 {! f
road2.m文件源程序:
7 M7 g; u& _( }6 x) S7 Ea=[0 1200 inf inf inf inf inf inf inf inf;" d* [4 O( o/ }: j- j
1200 0 12 202 inf inf inf inf inf inf;
& w) R. C8 c) Z) {6 W7 Cinf 12 0 inf 201 inf inf inf inf inf;
) m# c0 u1 [ ^. ~ M9 uinf 202 inf 0 31 20 inf inf inf inf;& _& w7 {. b( c* e% R3 M
inf inf 201 31 0 10 inf 205 inf inf;
4 F0 E7 t3 W4 k9 y' Winf inf inf 20 10 0 195 inf inf inf;; U6 R( E# _5 o
inf inf inf inf inf 195 0 5 306 inf;. P7 r, \( m( v# n
inf inf inf inf 205 inf 5 0 inf 194;2 |: B4 J: e. h1 K' I! P
inf inf inf inf inf inf 306 inf 0 10;
! {7 p' X/ O& [7 l/ g1 h! j. yinf inf inf inf inf inf inf 194 10 0];" I1 C: P" u' P0 Z* D
[D,R]=floyd(a)& V: t; F- d z5 @0 I1 R
floyd.m文件源程序:
8 G$ ~0 K+ y9 Zfunction[D,R]=floyd(a)
6 ]" y4 h4 H% t- v* d7 y ~n=size(a,1);" m2 e! h4 G' W% a
D=a4 t+ a2 Z6 {$ b2 n& V
for i=1:n4 r7 P, K& W+ `) a. J: G, v2 [2 n
for j=1:n
" s0 G) q: c9 b, Z0 C R(i,j)=j;
4 V7 ~. \2 S1 K+ ^5 t" G end# B7 I0 S$ b7 l2 H
end" Y/ q# p5 _: A, s4 V
R
. X! Y4 z6 k7 _" Dfor k=1:n2 l. n: _) T) Q6 L. q G: c% m
for i=1:n
; v- M6 s, G4 F P# b for j=1:n3 ?2 M! e9 h- n6 M
if D(i,k)+D(k,j)<D(i,j)
$ a# C G1 P! T5 @ w% c3 L1 G/ ]) C0 z9 v D(i,j)=D(i,k)+D(k,j);
9 w5 g. \, `3 q) M R(i,j)=R(i,k);
9 o7 E: k( W4 Y* H* S& j' i end
$ j4 I# q1 K. y1 l8 c; d end0 S/ E6 }0 c, h+ h3 f
end; J9 P- X; r9 ^- C; T
k2 {- @' r/ P& N( V# ^5 ^% T" q
D
; B* @& O, r& G R) `( H& ?4 S1 c2 j9 l
end, S' z6 c6 Y! U
五.结果分析
8 v5 C! K, y/ S& X5 Z: t(1)Dijkstra算法
2 y, {5 X+ Y. y9 ~/ ~2 {$ l* [" k运行结果:; V% ]/ z5 q. u! c. a
l = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
; d; v& E J6 ~/ V! w1 v" o$ l4 wz =1 1 2 2 3 4 6 5 10 8
3 R3 B4 I& |6 g$ X3 W5 l! U
, J# h; m) ~7 R( h; x* w3 z8 |结果分析:( h# o4 u7 v! x
通过运行结果: 到其他顶点的最短路的权 ,可看出,2 F; @0 F) U( N3 O B$ u
到 (即 到 )的最短距离为1812(km);
) {' \- J% J# y" k5 h 到 (即 到 )的最短距离为1618(km);. O' s% \0 |: S' O G
7 B' u1 E( _8 c# g+ S8 O# W 到 的最短路径为:V1→V2→V3→V5→V8→V10;
2 J' L$ @* |1 c$ W( ? 到 的最短路径为:V1→V2→V3→V5→V8。/ |. o+ Z) B' s* [; y! k8 a
& }2 ?6 V v' i2 ~(2) Floyd算法3 @3 o: |* v! e8 Y
运行结果:
) F# W$ k& ]- e; xD =
+ z$ r. P' }& l. m6 p 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
- g6 Y1 e! w' S2 F3 }# f 1200 0 12 202 213 222 417 418 622 612( S* k: q8 I0 ~, y8 ]1 h
1212 12 0 214 201 211 406 406 610 600" I% t6 R! {5 e# @9 e0 A
1402 202 214 0 30 20 215 220 424 414/ ]7 B* V! ^! y+ A# ~
1413 213 201 30 0 10 205 205 409 399; H( R; u8 q; L2 ~8 d8 q; }
1422 222 211 20 10 0 195 200 404 394
. E Z1 e1 Q% g+ i7 k! j 1617 417 406 215 205 195 0 5 209 199
8 b# V# S2 K- t9 w2 ^5 x 1618 418 406 220 205 200 5 0 204 194+ A; k9 c6 c; V$ l
1822 622 610 424 409 404 209 204 0 10
, p/ h" t+ @. p4 [ 1812 612 600 414 399 394 199 194 10 0
6 C1 N% W C2 M v9 u3 t! `
" k; \2 X* o" e$ H% _1 a% dR =
) P8 {3 N* S+ k" P 1 2 2 2 2 2 2 2 2 26 s+ z, \6 X) _8 q- V& `: ]+ N
1 2 3 4 3 4 4 3 3 3: f$ ^. m) J& b
2 2 3 2 5 5 5 5 5 5
) @4 w6 M; t6 G 2 2 2 4 6 6 6 6 6 6
5 d1 i+ I* Q6 e+ C+ v" f3 ?9 y 3 3 3 6 5 6 6 8 8 8' M4 {- d9 c& V- m# m( s- V
4 4 5 4 5 6 7 7 7 75 U; _- _4 h% c# M& F6 v
6 6 6 6 6 6 7 8 8 8
5 x& D$ E; f9 r' {% ?3 [6 y2 t9 v 5 5 5 7 5 7 7 8 10 10
/ z- W; e: N4 p V3 D1 ~ 10 10 10 10 10 10 10 10 9 102 a' t$ W+ u2 c
8 8 8 8 8 8 8 8 9 10% ^0 d( I) u" G6 J8 I
结果分析:+ J6 B: N( q2 s
通过运行结果:可看出,
7 ` L* a+ N$ ?' h. y 到 (即 到 )的最短距离为1812(km);
6 {! a" z+ C% z# t, S 到 的最短路径为:V1→V2→V3→V5→V8→V10;
+ _2 g/ X9 ?- R A 到 (即 到 )的最短距离为1618(km); K: S, u. r& i! b
到 的最短路径为:V1→V2→V3→V5→V8。( d# U& x% A. r
( f( a2 X- M, a( X# h8 r% `5 q4 i. ^
|
zan
|