- 在线时间
- 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]初来乍到
 |
最短路问题及其算法
3 D/ J4 p6 F. |- k/ n一.实验目的:
: `0 m/ K J7 N, s2 @% g2 Z1 e. [1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;5 w( a: S' u0 D- A: }' n2 q* Q9 V
2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.
4 r. I3 W% c3 [9 G6 N二.实验内容:
, q( c2 |7 c m- l, d& q要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).6 G) Y( R g7 S& s8 x( _ U" n
为方便计,1km主管道钢管称为1单位钢管., g/ {; |3 E4 m3 B6 u$ Z0 P$ x
一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:
3 F$ A9 r, z/ T9 G* {) m+ A8 |
" ?: D& K, u5 {/ Q; `$ n j7 w- X$ y2 Y1 2 3 4 5 6 7
- t8 }6 Q: N. F6 L% [; ~ + W( r( D3 w/ k. x- V" [3 ]
800 800 1000 2000 2000 2000 3000- i6 g; n- V1 u( f# j
0 d$ J! x$ {8 n- |/ `
160 155 155 160 155 150 1600 P* `" P; L5 I* ^' d, V
9 |7 A) W' ^- U0 J; |1单位钢管的铁路运价如下表:
# j6 S$ I0 ~' e# N K e' z里程(km) 300: w- X# o, ]3 J# d3 I2 z. j. D
301-350 351-400 401-450 451-500
2 W# ^$ z5 w8 R运价(万元) 20 23 26 29 32
9 n, b O! s# n O# R) ?& `/ A里程(km) 501-600 601-700 701-800 801-900 901-1000
4 ] ^( @+ U8 @" h# D k- e. @运价(万元) 37 44 50 55 60
! V) I; Z' {5 V! M0 k! o1000km以上每增加1至100km运价增加5万元.
+ C- b V2 G* o N+ R! C- ] Q公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).! o; L' ~% I; m5 e
假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.6 g- j+ Y1 |; g! A, j! a* y
; B1 m/ T/ f$ F0 f试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.
3 S' v, B* b5 U, p3 ]+ C三. 模型建立
$ a0 J7 F1 A4 i5 W/ l8 l0 f6 S设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :2 j) V; x ^5 @! R4 B: H/ z; r
- U- ^% M6 l- P( a. _6 R7 z利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离) N# o: r$ a) S3 W
: {& v9 d& t8 A
解:先写出带权邻接矩阵:
& g. s) f- S% E' N' |) Q7 L0 J . _2 C' r: J6 M
后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .
/ @2 W2 z5 }% R' k: s" q4 Y% `, }四. 模型求解(含经调试后正确的源程序)$ S% e6 o( k" a! @
(1) Dijkstra算法4 E" E& K: l8 f; h s! C; R
road1.m文件源程序:
$ a9 U. r# e/ k, z$ h3 _- fw=[0 1200 inf inf inf inf inf inf inf inf;
& t/ y3 @( |: ^7 w: f& O2 @1200 0 12 202 inf inf inf inf inf inf;$ w# i; g; I! R, Y4 h6 n
inf 12 0 inf 201 inf inf inf inf inf;: I$ e8 V7 E4 p, C! m0 c
inf 202 inf 0 31 20 inf inf inf inf;) a3 J8 U0 _# I- G/ a0 m
inf inf 201 31 0 10 inf 205 inf inf;
4 {- Z4 s F1 w- ^. a* Jinf inf inf 20 10 0 195 inf inf inf;
: }+ J% w8 H0 L; V1 l! L: rinf inf inf inf inf 195 0 5 306 inf;
) ?7 \; n, `: D) qinf inf inf inf 205 inf 5 0 inf 194;
) R, Z6 L8 x6 P5 r! p' R1 Q9 D2 minf inf inf inf inf inf 306 inf 0 10;
8 u ^9 }. N2 d( W E4 T; s W! v( j6 uinf inf inf inf inf inf inf 194 10 0];
. ~3 V# p$ w" t# r x) |& xn=size(w,1);& y8 w6 |2 O, t/ G& Q! u0 _) z/ W
w1=w(1, ;
+ ?5 L9 p/ v9 }+ t5 c1 `2 M5 T- lfor i=1:n& E& J% A$ N& ]/ S, J
l(i)=w1(i);1 O/ L0 v, |1 }) z2 |3 w& _6 S
z(i)=1;4 `3 J# h% ?0 B+ S6 b- J
end/ a- V% I" o& o: V8 ?" V, B
s=[];
6 @, {( n6 E' o$ c! P. l, is(1)=1;
1 n J; f% }! a eu=s(1);
+ T4 z0 ?7 ] G+ s R7 C6 Z5 l- w$ A0 N7 gk=1;
9 W4 S: G8 _( j. z1 k$ }4 |l;: I- }' u) s7 K* c9 _
z;
7 R g2 I# c5 l, ]while k<n) Q$ A% a: X5 Z o; N
for i=1:n6 V! z% }, a" }, ~
for j=1:k% D7 }, H1 e2 T$ ~* f/ Q
if i~=s(j)/ F' _! \) a# m) o2 ]1 u+ }7 f& X0 Y
if l(i)>l(u)+w(u,i);
: I0 J; z x, E( c l(i)=l(u)+w(u,i);* J& W2 h7 x9 R
z(i)=u;
+ K) t$ |* Y; R0 ~% g _3 a3 F7 W end
( t7 W( S. |0 | end
9 X( c$ t9 D, ~. l end
" E9 G0 f7 `8 oend
! T5 m- B8 [/ A; s& ~ U0 \& s l;( Q h1 k$ Y( y8 a. N. w5 F
z;
5 h9 L9 e9 \9 ^+ m8 E4 `6 S2 Wll=l;
, d+ d. W$ }5 E% D for i=1:n
, R& Y$ {& R6 p. D for j=1:k
{- e+ v# w( o) Q0 `9 B# n/ V if i~=s(j)
3 i# ?8 X. O- H5 y* T6 q7 C ll(i)=ll(i);
# U7 A. G, K: a" e: Y: ? D0 K else
7 J; K7 C+ o- U8 e. {- ?+ v$ G. u ll(i)=inf;: s& I$ P( L3 Z% g" c
end
4 i" Q( s' `# \end
6 W6 Z* n& _# r" f7 u' Nend% s0 J; ?/ y' Z3 e [
lv=inf;
& w9 z2 f0 M" B9 c9 nfor i=1:n
/ J- m r* u5 k- X if ll(i)<lv9 x3 _+ k) M7 D7 h8 L
lv=ll(i);
! p9 @9 s! t' g% B3 `( ] v=i;
1 Y4 C! o7 ~; z* f5 j9 _ end
: W0 m" x6 u4 |- w* |0 |end
9 ~: `3 d6 _8 R" Z4 [1 Zlv;: b5 k" h- n2 _- h1 k. O5 k
v;
3 x' c- @' S0 ^" bs(k+1)=v;
m5 v4 k5 U. D8 u! D# _4 \' bk=k+1; E n7 r8 ?- t! z5 Q
u=s(k);- [5 d1 n- P: v2 C+ y4 S
end
3 y' D+ H" D' _% z/ yl
0 `1 O7 E2 M3 r3 Y: w; u# y9 Pz
/ u4 s+ s* c3 G# @) }' S8 Z6 n0 v* ]4 r
(2) Floyd算法& Y9 F; C% {# A/ q0 H
road2.m文件源程序:6 o8 S7 E3 D- v* U, e7 a. {. A
a=[0 1200 inf inf inf inf inf inf inf inf;
* v$ g6 H X3 l" {! e0 A' g+ s1200 0 12 202 inf inf inf inf inf inf;9 A' v7 |& `' d- i$ i- K5 t
inf 12 0 inf 201 inf inf inf inf inf;, ]( k" v$ ]$ t; o& S. A0 [' u
inf 202 inf 0 31 20 inf inf inf inf;
) z; R! _- a. x2 J" D5 Dinf inf 201 31 0 10 inf 205 inf inf;
" m: x2 j8 S; t0 E4 i {( g2 [inf inf inf 20 10 0 195 inf inf inf;, u3 s, l" M& c
inf inf inf inf inf 195 0 5 306 inf;
( H4 ~: e# L( p, N- rinf inf inf inf 205 inf 5 0 inf 194;! J/ N8 N( S; {3 F# `6 g
inf inf inf inf inf inf 306 inf 0 10;, _, P/ a" [" k y5 w! t
inf inf inf inf inf inf inf 194 10 0];* |% Y$ C/ d$ p( q c
[D,R]=floyd(a)
S6 w; [3 @" w! cfloyd.m文件源程序:; [+ h; _' I; @1 F& C# o
function[D,R]=floyd(a)0 ], W0 |+ T; O7 l
n=size(a,1);9 X2 }& x: a" y' i, \/ y% i
D=a2 e7 `" S9 r4 g
for i=1:n
- y5 a4 \0 J8 j' B# E( Y for j=1:n
% L1 `3 e% f6 P- l9 c/ N' H R(i,j)=j;
" K, h; O# Z) G end
/ p F+ b/ {6 _ P) n& Nend- U" \- b$ F5 t6 ? C
R
4 O3 j0 W& t* T5 d% B1 P8 Jfor k=1:n k, w, n/ \5 R9 R9 C; R1 Q
for i=1:n0 Y# v) Y. B5 _6 O, g' i. ?
for j=1:n
; \$ C! F* Q6 X+ l+ O& t5 e if D(i,k)+D(k,j)<D(i,j)+ S! B" U( @8 b% a: i4 \6 y8 P
D(i,j)=D(i,k)+D(k,j);& U9 q! a( H/ N- ]5 `8 w
R(i,j)=R(i,k);
1 }( k C+ L( t& ? end
. m; y+ j% }) `* B) g$ n9 {& D* h7 n end
. K2 W( h, W7 f. c8 U end4 q" s( o& J, u2 L! k q
k
1 K/ Q4 x6 S4 a+ S% q D
( @% }( C, {. Z3 i5 \8 E6 l R/ E. F1 R! m1 R
end1 l6 T6 R% s7 L
五.结果分析
% o3 Z4 U5 d7 l s4 s# W(1)Dijkstra算法3 U& y t7 ?; o! L
运行结果:
: Q: l6 Q, x: b/ L6 e) v. gl = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812) ~2 \/ y/ [& f$ p/ }& N7 G
z =1 1 2 2 3 4 6 5 10 8
: ]$ E! y% ]9 T5 k" z, J! b9 F/ w
$ J+ M# z0 J* k x/ Q结果分析:
9 A( y& n* E& y; w/ |5 W) o通过运行结果: 到其他顶点的最短路的权 ,可看出,6 I& c Q. j' \& n; l3 o
到 (即 到 )的最短距离为1812(km);
$ q) D9 u. U3 l 到 (即 到 )的最短距离为1618(km);0 |7 ?/ E$ a0 O) Z# u0 s# L
$ _$ n% W: W/ r& w! B1 ~
到 的最短路径为:V1→V2→V3→V5→V8→V10;
( k i& L% J7 e) @2 O: {7 C 到 的最短路径为:V1→V2→V3→V5→V8。
/ T N+ ^. J, d3 l/ i/ X7 o7 u* P R0 z8 x1 U% D
(2) Floyd算法% h0 k% f9 l3 H; v$ S0 g# {
运行结果: L2 y- O1 u' W5 U
D =
6 x0 O! d, ]* z% f# ^8 o 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
# R0 Q. B+ C2 [( ?' Q% g 1200 0 12 202 213 222 417 418 622 612* h! P. z* l8 k% P& h: u3 t
1212 12 0 214 201 211 406 406 610 600
6 g& q1 g& J1 d; z% v+ O# K* { 1402 202 214 0 30 20 215 220 424 414* p, W1 G, G+ H- Z4 |6 L. }
1413 213 201 30 0 10 205 205 409 3994 E( u; s& T9 C; [, K" ^
1422 222 211 20 10 0 195 200 404 394" e1 J0 f; p; ]: d/ S+ {- v
1617 417 406 215 205 195 0 5 209 199
/ P( V s9 N3 Y8 [7 Z4 W$ m G 1618 418 406 220 205 200 5 0 204 194$ H c" O% W5 s( Y" y& ^+ r9 Z) ]! j
1822 622 610 424 409 404 209 204 0 10
) l! Z* |% K( t$ ~2 [. a* Q. n' ?$ d 1812 612 600 414 399 394 199 194 10 07 r( j I! i L2 _/ P9 F0 V, P4 \
0 Q: Q: v' \# IR =6 I8 @- N# h% g# K1 n2 f* `
1 2 2 2 2 2 2 2 2 2
% {$ y: q* P2 h; M 1 2 3 4 3 4 4 3 3 3
+ x/ C P9 T$ X R1 @ 2 2 3 2 5 5 5 5 5 52 ]4 ~7 f) ?9 s+ s, H
2 2 2 4 6 6 6 6 6 6. ?6 `& j: k4 A% F& g
3 3 3 6 5 6 6 8 8 84 @* i9 p2 {% Q: S0 c0 y
4 4 5 4 5 6 7 7 7 78 n3 [ v9 p8 ^! n7 m
6 6 6 6 6 6 7 8 8 8
) S. _6 A% a% B$ ?. w 5 5 5 7 5 7 7 8 10 10
) g% B& s. Q$ i- M ]$ s- z5 ]# ` 10 10 10 10 10 10 10 10 9 10. Q2 V6 e2 U* Y8 X1 n: Y
8 8 8 8 8 8 8 8 9 10
! x) ~" {( B9 e. m4 S+ Y结果分析:/ [; A2 D2 @$ ^6 r4 D6 E1 I
通过运行结果:可看出,( V# ^1 v @2 b4 J7 c
到 (即 到 )的最短距离为1812(km);* ?0 n+ m9 }' [" j) o
到 的最短路径为:V1→V2→V3→V5→V8→V10;
" s! Y P# C. r 到 (即 到 )的最短距离为1618(km);
4 A; s- V7 i8 N6 I/ L" e S. C1 x 到 的最短路径为:V1→V2→V3→V5→V8。
1 h2 O+ a- f3 o+ p8 N9 n7 p
3 @7 U P3 t( X
$ Q# u6 i0 k1 A! j6 ?# H |
zan
|