- 在线时间
- 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]初来乍到
 |
最短路问题及其算法
& i# H4 W) d& @" t- ?+ f一.实验目的:% g6 H2 V" o `4 Q( B; K( b
1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;
' n. `& B3 Z$ p" Y2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.
D' o Y) l9 I! r- P0 Y6 I7 \二.实验内容: s; V4 i Y% |$ D) ^: F; M
要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km). l) ~" i! U1 F6 F3 j2 [5 N
为方便计,1km主管道钢管称为1单位钢管.
0 m6 p, v; M$ l0 d# w$ w n6 R一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:
6 q; p F* p8 E
( O9 j: y6 q; E' w1 2 3 4 5 6 7" d- j% K/ Q8 R- Z5 @% W# F+ m
- u/ v7 W; H. [/ j3 W# ?800 800 1000 2000 2000 2000 3000
# t/ Z' c! B! ]9 r ! {3 n2 j/ J8 z& \4 A9 j
160 155 155 160 155 150 160- a# ~! `( ]; J; m. C
: S' T k3 E* v% @1 W& E
1单位钢管的铁路运价如下表:1 ^, d; V1 N5 \) r3 h7 ?
里程(km) 300
5 [4 c8 i; B$ e$ [' P9 m; P301-350 351-400 401-450 451-5007 f% B4 n( c' `1 @ e$ M# ?( Z6 P
运价(万元) 20 23 26 29 327 M2 b! o" N; ]. q2 I
里程(km) 501-600 601-700 701-800 801-900 901-1000, q( ^+ {' [4 J( l d/ `
运价(万元) 37 44 50 55 60" n0 Y% Q6 M: f- f/ {8 O
1000km以上每增加1至100km运价增加5万元.
; ~! t% d" U3 C1 f* ?2 e' D$ p0 Q6 Y& w公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).
$ @) W7 j7 O6 e$ f; M$ j& J假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.
' d& O! O7 O: H9 Q* G 1 o* [ {6 T4 f6 x: u2 u3 r
试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小., G& |0 w5 o" F0 |
三. 模型建立
* z6 _: g% ?& d# n8 k+ i# F5 k设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :. g( e8 Z. n/ P0 g
3 ]5 }' U/ h. z3 d1 f% E$ \利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离7 d: m2 n: b8 e, @7 ~. |) @
6 c: ~) v4 W/ m+ ^解:先写出带权邻接矩阵:
- |, J, u$ U" f% L8 y 1 B! N8 f; J+ N9 j9 h! L% z
后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .
9 v9 ~4 g" @% \% k5 O四. 模型求解(含经调试后正确的源程序)
' @1 Y! K3 X- V' G! n n(1) Dijkstra算法; H3 B. d8 T. |: l$ n9 I' s* D
road1.m文件源程序:0 n8 d! h0 e6 |% `" ~. H9 ^; @
w=[0 1200 inf inf inf inf inf inf inf inf;. `5 \( g( \0 Z% z4 H
1200 0 12 202 inf inf inf inf inf inf;0 T" C* x* N. Z0 r: J0 q- f7 w& P. c5 c
inf 12 0 inf 201 inf inf inf inf inf;$ d5 K4 s9 G" Q2 J1 Z* S ~8 t
inf 202 inf 0 31 20 inf inf inf inf;
' ^9 c. ~ d1 M$ W$ \- `! k/ ?: l; O2 D" S8 cinf inf 201 31 0 10 inf 205 inf inf;
1 i8 Y$ L! ^% e1 H$ s! A4 e- j) Jinf inf inf 20 10 0 195 inf inf inf;( N# B7 e/ [: t6 v3 `0 K E
inf inf inf inf inf 195 0 5 306 inf;/ T+ `# W s5 P- i1 ]% Z
inf inf inf inf 205 inf 5 0 inf 194;! j& P3 Z& j8 A1 T7 I
inf inf inf inf inf inf 306 inf 0 10;
* D3 B5 c8 t+ P4 G# e9 X+ k' V: Dinf inf inf inf inf inf inf 194 10 0];
5 Y- m. ]+ U; S2 Rn=size(w,1);9 Z5 o4 Q: E: n" p _# I) k
w1=w(1, ;
1 `/ H- s K2 W* H: N; q3 Rfor i=1:n4 t+ J1 H0 \4 X/ Q1 l4 |
l(i)=w1(i);4 l7 o( ?0 _1 N
z(i)=1;
1 A" ]8 b+ R: r Z/ J' [end
G# f; a9 g. T+ I1 ss=[];
' [2 U8 @; x0 v" }s(1)=1;
2 i4 H4 S) u: U$ wu=s(1);2 b; G% T& P8 I% b& p
k=1;1 k# b7 e- D; l
l;
. \; t8 `3 U: t, n0 u& P6 Sz;
1 F: Z$ B7 o" h9 Awhile k<n
0 z/ q, |, @6 k7 ^# g for i=1:n
; ]6 T' H' l5 s; ] for j=1:k
7 f9 U" ?. |( ]- ?/ | if i~=s(j)
. P, J3 p- u7 _) r+ q if l(i)>l(u)+w(u,i);
" K4 o0 W# m: k2 F; k l(i)=l(u)+w(u,i);# [; Y' N4 N! C- x* P
z(i)=u;1 G2 X2 w5 `. e
end
4 y: l9 T2 u9 V- _# ~+ X5 @ end- B! m( P% T6 T' p- D
end
# J7 ?0 A2 n8 R3 M0 oend5 g$ s# c% `( S5 Q( G+ l3 s6 _
l;
6 F: F9 ?, D& X& V6 M z;
3 D0 ^( p4 ~! ^' Z3 g' Bll=l;5 O- k* N! N6 j0 k. e( E2 A
for i=1:n
/ b# K* f+ l9 U- W& t) b for j=1:k* N6 u2 q- s2 D* j$ k$ k3 {
if i~=s(j)
+ e8 X& d; c, u4 i/ z ll(i)=ll(i);
: S9 n! p2 ^* d else3 l! m* \+ d. m' ]8 W1 A
ll(i)=inf;1 {' D& {, v5 T, L" I% {
end3 i5 ?( U- L. d3 X- k3 c+ D
end6 ?9 S4 f! C( \# g6 O
end
, `# n4 A" w; ]# `0 olv=inf;3 n3 e, r. M9 l4 J$ S
for i=1:n: Q, T7 Z1 y+ ]' A. o
if ll(i)<lv
/ O% n3 l3 N' O9 O; t# M lv=ll(i);; F: J! ]. l$ j* a. s
v=i;
6 r: S8 j" h0 d end' X* s$ Q$ }' H- ]4 n( s8 ]9 [, j
end
0 w; x. f$ f8 m/ W; vlv;
/ c- k4 Y/ P/ l& g' B; @8 g0 u8 vv;
: [$ Y$ @4 t9 t" o3 v! g3 Qs(k+1)=v;- L+ q! P$ l* ^0 M) ]* \
k=k+1;. B/ Y; m9 m7 Z% }8 x
u=s(k);
* m7 v2 a g, ^* C. Mend( c1 y, |! x. Y* D. V0 u
l
% u! `! Q. p- yz6 g" i. ^9 F# f0 j6 i$ F) {9 Q
4 G, R4 `& \: @$ V(2) Floyd算法 D2 ]$ n& b# `) z1 Y" h9 h5 X
road2.m文件源程序:
5 h$ g* L; Y5 g% wa=[0 1200 inf inf inf inf inf inf inf inf;, X$ P5 r5 }, S" X/ z' Y& V
1200 0 12 202 inf inf inf inf inf inf;
# l' w9 x% U- i: x4 P" Sinf 12 0 inf 201 inf inf inf inf inf;
7 G+ C* y+ f) t- c, winf 202 inf 0 31 20 inf inf inf inf;
( n5 q( h Y9 d- k1 ainf inf 201 31 0 10 inf 205 inf inf;( V6 D( K# {& `" H7 c
inf inf inf 20 10 0 195 inf inf inf;
& C$ H" Q( R8 d5 Winf inf inf inf inf 195 0 5 306 inf;
) y/ W# Y' S0 H4 tinf inf inf inf 205 inf 5 0 inf 194;
; U2 I0 E6 a( M# V/ [inf inf inf inf inf inf 306 inf 0 10;$ w: D K! V- s1 N6 q+ i
inf inf inf inf inf inf inf 194 10 0];4 X' ~8 z V( i6 m0 ?" w0 ~3 `
[D,R]=floyd(a)9 i" v1 J) j* w% }8 t
floyd.m文件源程序:
' F- U. s; K6 x7 \function[D,R]=floyd(a)
% [5 V. s Y# F, o0 kn=size(a,1);
7 ]! `% d7 n% [8 e% K4 }! w7 FD=a0 `, Q: [) _" x
for i=1:n9 ?/ v' I: o- d' F! E
for j=1:n- L& y5 T, E' N" r% r' p
R(i,j)=j;# l) y: B+ V. n* U
end
4 R% o3 m& }) dend2 q. Y2 O/ P( C0 X' h& D. c* m8 C
R
. t7 E: G7 K7 M7 h; V5 _0 P3 kfor k=1:n
$ ^, P- q2 ~# b8 F3 w% D for i=1:n( x& y- d1 L6 W5 { v
for j=1:n6 Z% R! ~0 [6 Q# Q) h, e6 ~: }
if D(i,k)+D(k,j)<D(i,j)
# D# k ?. S0 C9 d% T" A; u D(i,j)=D(i,k)+D(k,j);8 e: _/ n- b$ f( P1 k5 |
R(i,j)=R(i,k);( m' s9 z( K4 @) p* P% L
end1 r: g# }) b. f+ N+ G
end
+ h5 g* Z9 S! }- S end2 Z4 V7 r' e" U8 J- l! Q# B
k
. E4 H+ `+ n' S D( G, Y5 v/ E+ Y# K, j O
R
7 I( ~ d& F3 }, l: C6 B7 pend
, J" N d& n& _. A" k' k+ w9 h' U3 i五.结果分析; d1 W( @0 J, X
(1)Dijkstra算法
; L/ n$ ^$ `+ c) J运行结果:
. b) r% n7 Z; u# Hl = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812" o( G* b8 m2 i2 ~" @ o$ R
z =1 1 2 2 3 4 6 5 10 8
3 H2 i& e: f4 }: N
# n) H+ y: N# l结果分析:
! e5 f1 ?! Q( W1 l6 W通过运行结果: 到其他顶点的最短路的权 ,可看出," `! X' ~5 \1 y- K0 r
到 (即 到 )的最短距离为1812(km);
* m. M2 I1 N8 ]+ y0 [. u9 J* `. N 到 (即 到 )的最短距离为1618(km);* k1 C0 G. t/ h: s. E
) o; n% o/ S- q- x6 c
到 的最短路径为:V1→V2→V3→V5→V8→V10;" J3 r/ T# M8 V4 ] w
到 的最短路径为:V1→V2→V3→V5→V8。
. d8 \+ K6 l& Q* G3 }4 h
2 g8 Y: ?& @5 u N(2) Floyd算法8 a0 N0 [" Q" [+ v- o5 Y
运行结果:
B6 O; ?; o) _( u }9 L, l) @* BD =
* i$ T* R* V& O' v( r 0 1200 1212 1402 1413 1422 1617 1618 1822 1812
6 z3 c: u. F; V5 c) z) @ 1200 0 12 202 213 222 417 418 622 6127 l- q4 D3 o0 n" e4 x; A; q
1212 12 0 214 201 211 406 406 610 600; L+ n; g: v5 [
1402 202 214 0 30 20 215 220 424 414; C% ]4 M! T& Z; r2 z
1413 213 201 30 0 10 205 205 409 399* X6 y0 C( F- \) q6 [0 i: j3 w4 J
1422 222 211 20 10 0 195 200 404 394$ ?! _1 Z3 Y+ Z6 B. W; m! s5 v
1617 417 406 215 205 195 0 5 209 199: s: w# w3 s9 y) [$ \8 S1 ^ y
1618 418 406 220 205 200 5 0 204 194
- q/ E7 y9 _2 t3 x- t 1822 622 610 424 409 404 209 204 0 101 ^% N: J* R, |3 R$ X
1812 612 600 414 399 394 199 194 10 0. N2 K8 k& b. i y# _$ m
2 @* F7 ]6 X3 o( v) w
R =; o4 C0 V! v$ ?( ^
1 2 2 2 2 2 2 2 2 2
$ f0 W# t& |3 x$ ?( M8 Z0 i 1 2 3 4 3 4 4 3 3 3
" e" @: X! T% ]& s 2 2 3 2 5 5 5 5 5 5 f% @3 R+ F8 s9 O; q- C
2 2 2 4 6 6 6 6 6 6
5 ^* J9 f% _- P& p" q( J; Z& z 3 3 3 6 5 6 6 8 8 8* b/ k0 S/ m W0 p4 t7 y; A
4 4 5 4 5 6 7 7 7 7
8 I, i! }) ]) y! t# S7 m 6 6 6 6 6 6 7 8 8 83 |5 P, S4 v8 a/ ^- g
5 5 5 7 5 7 7 8 10 10
" L# b5 m$ [3 J# V& G& f6 ]' e 10 10 10 10 10 10 10 10 9 10) o6 l: r1 g1 ~; X% e) D* V
8 8 8 8 8 8 8 8 9 10. Z# S2 a$ t, }- ~* ?
结果分析:! i! H5 z, |$ e
通过运行结果:可看出,
. T E& _" T5 w 到 (即 到 )的最短距离为1812(km);
( X% K" T2 `( W0 \ R7 Q' f 到 的最短路径为:V1→V2→V3→V5→V8→V10;/ U$ B; z3 u0 N4 c( ?+ m
到 (即 到 )的最短距离为1618(km);
# Q9 |# S& @+ @+ f. f( x 到 的最短路径为:V1→V2→V3→V5→V8。
& t* }& P8 C' z9 O; e8 o9 O. q! W/ ?2 Z4 h
) A3 c4 ~$ ?5 S" Q% m( G
|
zan
|