- 在线时间
- 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]初来乍到
 |
最短路问题及其算法
; ]9 P' l- @, h7 e h0 ]8 L一.实验目的:
0 B* G" v9 o# U1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法; e9 F& J) v* b) R, \
2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.
/ ^7 [3 O4 K+ P) a: ?. p二.实验内容:: H% [& o6 u+ q# g8 o# n
要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).! n6 F+ ]7 c( y
为方便计,1km主管道钢管称为1单位钢管.# I# c/ E# y$ x1 r+ j
一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:1 Y$ W8 Z: F; J9 R* I. k
' t) y% O$ }7 g9 V) A7 i3 `
1 2 3 4 5 6 7
8 e& A3 K" a {7 v( u( r
- }- B& R; S1 t8 I) b9 i800 800 1000 2000 2000 2000 3000
' p( ]2 \1 \3 Q5 G, |( q* ?: k Z4 D# p3 B* x4 d- K
160 155 155 160 155 150 1609 D9 k1 _ E$ H0 O! n4 K
- i$ `+ N+ p" @6 E2 h# I0 Y1单位钢管的铁路运价如下表:4 z, W+ r6 a* P9 z+ e7 O+ X9 w. J
里程(km) 300
. C. o. \2 v/ N) o& z# L301-350 351-400 401-450 451-500
* o& p( s7 e& x运价(万元) 20 23 26 29 327 {; r& ]) t0 G0 R$ R6 K
里程(km) 501-600 601-700 701-800 801-900 901-1000
( A; K& x$ T6 w* Q运价(万元) 37 44 50 55 60+ q& u4 B2 b& { F# |
1000km以上每增加1至100km运价增加5万元.
; @; N+ @5 ^8 x公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算)." e/ D/ M* Q8 S* `/ `7 W0 U+ x
假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.
3 C4 P! b4 S' I6 ? 4 S l/ q. k( R$ m* }) P2 e
试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.* S( u* A) N/ Q! I6 e+ O+ s. Y) E% z
三. 模型建立7 u. E' j, S( g' U
设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :
, |, N) f, @4 M; s6 `. X2 P " D6 A' K& C2 I, d$ }) E
利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离% T* B) a- H, D
+ o, t/ j4 Y5 t7 G; U1 O" T2 O& [' I解:先写出带权邻接矩阵:+ F9 ~ }! ]0 o# C) e6 X
. `8 F4 ~& h9 M g( C: N
后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .0 S# s) u9 G- t) m- D
四. 模型求解(含经调试后正确的源程序)
% a ^) |* Q7 w' | Y* S% `4 m(1) Dijkstra算法% m9 k: K9 y; Z; T7 _
road1.m文件源程序:1 y; h( N9 Q" g! F. T
w=[0 1200 inf inf inf inf inf inf inf inf;+ B) W7 c; I3 z [2 Y! L
1200 0 12 202 inf inf inf inf inf inf;9 i" l3 B% X: X, R; B* p! t
inf 12 0 inf 201 inf inf inf inf inf;
6 i0 l) l6 x, f$ R- Pinf 202 inf 0 31 20 inf inf inf inf;
) o0 |6 w0 P. j4 c$ ninf inf 201 31 0 10 inf 205 inf inf;" r: F' W/ ^$ H3 U7 s
inf inf inf 20 10 0 195 inf inf inf;
& B3 O; k. C8 L; binf inf inf inf inf 195 0 5 306 inf;( l0 u, X1 T) |8 W
inf inf inf inf 205 inf 5 0 inf 194;8 z0 M0 ]5 E) f, W" @0 b5 d; B2 u
inf inf inf inf inf inf 306 inf 0 10;, {1 V- {+ T& f+ N- S
inf inf inf inf inf inf inf 194 10 0];
. |( W# F- l% W& C/ on=size(w,1);
) V# A$ b, p5 ~# ~! hw1=w(1, ;5 h# p, i2 Y0 _4 f' E
for i=1:n
! _4 c4 p) \' Y l(i)=w1(i);
- k* s# C) p+ D z(i)=1;9 u% |7 k( B! x% T8 F5 q) B; o
end
' T5 q" @( E* t9 V7 |s=[];
( m, V$ s. H& [! ks(1)=1;: t+ |9 ?( S5 b+ L8 t9 U: o6 H& Z
u=s(1);3 f) H' q" g/ P% w
k=1;; Z- g, T2 J* j- M% j
l;) r6 V4 k9 t; X0 n {2 p7 p. H+ [
z;
! N' j/ K3 u3 Uwhile k<n
# P7 a& u% H8 Q) `; P+ q for i=1:n
4 v/ Y5 f) E5 Y0 e# p for j=1:k
+ b9 W1 O6 ^4 z" v; w' E, o if i~=s(j)" ]$ {2 O# T g) P1 ]
if l(i)>l(u)+w(u,i); s7 g9 Q% s; ^3 g
l(i)=l(u)+w(u,i);6 T& f) d' u, y
z(i)=u;
- b4 A3 d- c% T4 B5 F. U% y end
' K, c: ]/ H# @& H end, g' f0 Y9 ^, Z: Q7 F) G( s
end
6 q* ?% C- z5 N9 Y& k6 q$ l2 c. send
d8 T! t) C( h$ u. Q l; T5 @8 p2 V7 y: G
z;
9 |7 F0 B( j g, n+ \6 u& l2 ^* H% Mll=l; D: j- Z( t8 D
for i=1:n
/ U# l1 a/ q; D, G J% M for j=1:k( q6 t/ T1 \' L9 j
if i~=s(j)
. v1 k" m) k9 c3 }9 ]$ {' V ll(i)=ll(i);
& C2 F$ _3 A8 ~* e7 @2 y4 x else8 y0 j: b% X% O* V' n
ll(i)=inf;
4 w% ~+ k4 d2 S0 t) p; v I# z end$ ]" J5 z' U$ w! ]+ T$ |4 p7 H
end2 K& M0 X" T; t, e' t9 T, L
end: v. p9 z& ]% v2 K8 h+ H
lv=inf;( u3 s+ N/ P/ K5 g: E7 v" y( }
for i=1:n
0 z; S+ t/ Q4 u( C. O2 X if ll(i)<lv1 z4 ~- d+ D1 o
lv=ll(i);
4 Z/ P1 ~, s9 }2 i v=i;( k: t, D+ z3 K; X) k0 B
end5 f# k! R8 r" N5 |+ j. g
end
3 i$ S9 F$ B" K" W J/ Alv;
+ E; K# `; Y+ a" Wv;1 N6 `/ p5 F5 L, z1 r7 D6 K7 t
s(k+1)=v;0 v! m7 V+ P. a' x: w/ F
k=k+1;
# g! U- Q7 J" O& J* u! a9 eu=s(k);
& s8 P' @" V6 e Rend
" \5 m2 i2 u [3 B/ yl9 b2 {3 R/ `8 {& I2 k) S" B$ i- T
z
- M! p7 [* v b3 [) f3 z6 i3 I# O( g6 D' A- e0 J8 t/ R7 V
(2) Floyd算法/ ]% ]; Y* n. g
road2.m文件源程序:) W. _. O4 T' w" F1 E6 X
a=[0 1200 inf inf inf inf inf inf inf inf;- l, ^2 B+ T! }0 q9 E
1200 0 12 202 inf inf inf inf inf inf;% s6 o6 }. n6 ]! S# o
inf 12 0 inf 201 inf inf inf inf inf;
1 `; z5 c' e: j! `; U& ?9 g; zinf 202 inf 0 31 20 inf inf inf inf;
# A# O) `) T$ binf inf 201 31 0 10 inf 205 inf inf;
8 M5 k( q8 _& E- Zinf inf inf 20 10 0 195 inf inf inf;
8 z- p( [$ o+ M2 v/ t1 E/ P) Vinf inf inf inf inf 195 0 5 306 inf;+ J5 X( G- E. v+ T
inf inf inf inf 205 inf 5 0 inf 194;
! n) V* V6 G1 iinf inf inf inf inf inf 306 inf 0 10;4 Y- O1 M/ c# x) o4 d
inf inf inf inf inf inf inf 194 10 0];
4 ~0 w' Y8 ]( Z[D,R]=floyd(a)& Q7 A5 p, s6 O7 @; f3 u
floyd.m文件源程序:- l J4 S. h! C
function[D,R]=floyd(a)
4 l( X, \( ?9 ^. ?- fn=size(a,1);
9 }1 f# m) `, k) @( [D=a
' E# S8 o6 k) V; T7 q% Ufor i=1:n3 c4 f) v: p- m
for j=1:n
) O1 l% R! M0 F5 J U R(i,j)=j;- l6 `1 B& k: D8 Q! q; l0 L' M
end3 q# S# U) k, C; d+ P
end3 g& a3 ?9 b& P: E$ L2 G
R- Z: Q7 \ H/ ^. J% ]! T9 |
for k=1:n
9 v5 I8 a6 X& G U* Q for i=1:n
: a1 A J% z' x) _ for j=1:n
2 k& \$ u) b$ k& D% H; u if D(i,k)+D(k,j)<D(i,j)# n4 x* Q( r" b$ f: Z
D(i,j)=D(i,k)+D(k,j);1 ?+ H4 E2 j, M5 Z: `
R(i,j)=R(i,k);
& j0 c6 g M9 m; W: G$ N9 |$ U end
0 f, y0 f% S9 |8 N. {" F( ~ end+ f$ S5 l/ j" l) U
end
% t4 z0 |/ t0 X0 \& [ k
( z6 T" H+ o9 \+ `5 r0 V D
' W M( ^" K: T ]% v R
& S& w- a! B$ ~4 ?) S. }end/ }% {9 i5 x' C( f& G
五.结果分析
( N; E5 F& ]! ^& V. s; i/ u(1)Dijkstra算法# t+ g0 a o) w! a, k6 B6 \
运行结果:2 T+ [9 s% X N, I1 _; j5 {8 n+ e, H
l = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
I* q- E* Z5 U, \z =1 1 2 2 3 4 6 5 10 8
' f6 ^% Q+ `' R5 O. W ' a1 _: x2 ?& {
结果分析:" J' i; m: o1 E8 H! [
通过运行结果: 到其他顶点的最短路的权 ,可看出,2 O9 U' m, A/ n1 O6 y4 R; m
到 (即 到 )的最短距离为1812(km);
% r0 g- b: Y) @& f' R3 ^9 z1 K( X 到 (即 到 )的最短距离为1618(km);
8 S. q, }2 M- I$ F9 r1 v2 V+ d8 ?0 K+ m4 M2 u8 R$ X" s
到 的最短路径为:V1→V2→V3→V5→V8→V10;
9 g% F6 c/ V: d+ E7 ` 到 的最短路径为:V1→V2→V3→V5→V8。
' A; k* j& g: u* A6 j/ m5 ~ i ^
* B% [0 y& l! O# J5 w(2) Floyd算法8 \1 M4 K9 C+ D' _% S, z, H
运行结果:3 z" b7 L. y7 a& o, m3 e" g4 M
D =, i& Z+ ]2 |4 K. }/ H! x
0 1200 1212 1402 1413 1422 1617 1618 1822 1812
7 E1 G& D7 \- r, L8 C: F, L 1200 0 12 202 213 222 417 418 622 6124 v) }% Q& t6 k) d" t
1212 12 0 214 201 211 406 406 610 6004 [ i" ?, ~7 |. [
1402 202 214 0 30 20 215 220 424 414- F1 D2 f" @& g+ a
1413 213 201 30 0 10 205 205 409 399. \$ m) J1 z+ R
1422 222 211 20 10 0 195 200 404 394
' W1 p/ F4 Z# s$ O 1617 417 406 215 205 195 0 5 209 199
- j( B+ A) t" e" [; b2 K/ j 1618 418 406 220 205 200 5 0 204 194( ^: k3 u2 f0 g- T# ~8 B, o
1822 622 610 424 409 404 209 204 0 108 _$ x" U2 e+ _4 j5 B% u
1812 612 600 414 399 394 199 194 10 0
9 _4 H: {- V1 b7 R$ G/ F7 A5 W6 {+ N/ u( s' p& k
R =- \- ]1 e+ {5 j4 O! o) y
1 2 2 2 2 2 2 2 2 2
$ O- ~& }: F' H; [- r' K4 }. t 1 2 3 4 3 4 4 3 3 3; F! g& N4 r/ y7 O0 q
2 2 3 2 5 5 5 5 5 5
. S5 O$ r1 T5 k. c( _! R, F( O 2 2 2 4 6 6 6 6 6 6
6 q/ C6 D* ]0 E4 ]9 r9 t 3 3 3 6 5 6 6 8 8 8% F1 ]+ J6 D3 y% J! K( I. a
4 4 5 4 5 6 7 7 7 7
6 H/ Y7 s q8 N% k5 ]0 J 6 6 6 6 6 6 7 8 8 8
" b9 K% U7 e# {; E 5 5 5 7 5 7 7 8 10 10& {4 D3 ~, ^. w% M2 r
10 10 10 10 10 10 10 10 9 10
: t2 l6 c0 V' ?+ ~ 8 8 8 8 8 8 8 8 9 106 p3 \, C }2 G) K0 j
结果分析:
3 S% V2 |* l0 F) L, |' j* \通过运行结果:可看出,
9 j; l+ q: |! o" ` 到 (即 到 )的最短距离为1812(km);
* Z- x3 L( h0 ] V+ _! ] 到 的最短路径为:V1→V2→V3→V5→V8→V10;: L: l8 c) B2 T/ h( B3 H" s
到 (即 到 )的最短距离为1618(km);
, b3 A( }+ l# Q% o, f3 Y/ ~; n 到 的最短路径为:V1→V2→V3→V5→V8。
D1 f& f8 |. a! y$ s
2 \ W3 ?' ]- \$ E: m# l) ` C+ s! I4 a. [
|
zan
|