- 在线时间
- 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]初来乍到
 |
最短路问题及其算法
5 W x1 M3 O5 E5 Q* P一.实验目的:! _. G k; s: v4 k. o
1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;
7 y# U/ m9 H' O B1 m! Q0 h$ q. n2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.1 C6 ?; s& J. G1 n7 B( v
二.实验内容:3 J, x( Q! W, ^& N* x, V0 Q9 s
要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).) x5 d( Y9 Y% N& L- R; l
为方便计,1km主管道钢管称为1单位钢管.
8 O9 C0 @1 D2 p; ~一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:
; Y2 r: ^# D5 E : C' a% N6 C) }5 g2 ^
1 2 3 4 5 6 7
- g p; m: C- G% F 4 V7 q$ e8 [2 `& `9 c# v
800 800 1000 2000 2000 2000 3000
: I# R8 J e8 C: b; }
& t: \$ F" ]( s u160 155 155 160 155 150 160, d; Q7 E. X, |* I+ y, [4 e
. u+ \1 T/ P/ D2 m, O4 P' r' V
1单位钢管的铁路运价如下表:
% A; R$ O& z% w- h" D% q9 G V' b里程(km) 300
5 [- a* w9 B- q+ P- L2 Z301-350 351-400 401-450 451-500
4 } T/ v3 Z/ c. o运价(万元) 20 23 26 29 32
7 C j. L# k9 s/ h" i8 B6 W* R+ d里程(km) 501-600 601-700 701-800 801-900 901-1000
! z6 E B4 F3 V% E, O' }) M7 y运价(万元) 37 44 50 55 60( R! d& S$ z; Q
1000km以上每增加1至100km运价增加5万元.
3 |% r! V: r }! a公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).* y- u2 C" d3 U9 ~8 S+ V
假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.9 Z% v. r' V2 I5 p# d' O$ i
( O1 c" r! m- s0 y
试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.
C7 S# B8 V- v) t: y* s三. 模型建立
( a+ b6 v. D: m p3 d/ w设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :% C* H! M- x# t+ f) n& H+ `
! z# ?8 T! E) }) L6 f% @
利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离
* W& U7 K7 R' ^& R* I/ k8 j
( S- w# B4 m2 @5 Y: e/ q8 X) \解:先写出带权邻接矩阵:0 t* d; F) `4 c9 F0 D& X$ F
7 O0 e9 g- J3 h0 ~
后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .$ h+ U! `: {2 C7 a5 F
四. 模型求解(含经调试后正确的源程序)
# e/ A8 [) ~7 s, T% E(1) Dijkstra算法0 q# _* o5 x6 W( B+ n4 C
road1.m文件源程序:
S2 c& T0 g7 f: qw=[0 1200 inf inf inf inf inf inf inf inf;; B+ J1 I4 }4 i4 v, F
1200 0 12 202 inf inf inf inf inf inf;! _# n _/ {$ E* \* b# F
inf 12 0 inf 201 inf inf inf inf inf;' |& r" f x9 s/ \; C
inf 202 inf 0 31 20 inf inf inf inf;- T) B4 ~# L8 i9 B0 k5 q; l' o4 k
inf inf 201 31 0 10 inf 205 inf inf;8 D) U7 b6 R8 r
inf inf inf 20 10 0 195 inf inf inf;
: t/ z' p( ~8 X4 Einf inf inf inf inf 195 0 5 306 inf;
! n- M9 z' s9 E* _inf inf inf inf 205 inf 5 0 inf 194;
' L. b# c( q9 [- j- d6 Rinf inf inf inf inf inf 306 inf 0 10;
: e. t+ ]) {6 O2 Sinf inf inf inf inf inf inf 194 10 0]; v( e, b$ }. k$ {" g
n=size(w,1);
/ D' p$ f( M5 |w1=w(1, ;
$ J0 a0 \5 o8 y( b7 afor i=1:n
+ R* F7 [; r) J% F l(i)=w1(i); I4 ^' H7 W( l% u, [, l3 U# k( e
z(i)=1;
, U5 k! ^2 ]; t( s; [- l; E* Iend
9 K: n' k2 W2 y8 Xs=[];
/ s- b, g% f- L, E2 i& Ts(1)=1;
/ m5 U& W% L3 j" I H0 R! o$ bu=s(1);
: j7 t( J5 B- e: @+ N; j7 }5 O! Ek=1;' H/ W6 E% x+ m8 v( S3 S0 H
l;
4 W$ F& s! |1 H# \3 O7 Bz;# c* u& O: u' q t" G
while k<n' w4 j/ e: z1 m9 y( p/ W T/ J! J
for i=1:n2 e) `0 P6 Z5 |( X9 T3 c2 ^( e0 b
for j=1:k* W" ^) d' a$ [) s
if i~=s(j) X' e# ?; a: |$ R+ h0 g
if l(i)>l(u)+w(u,i);* K7 K* b) u q. e E: h' g
l(i)=l(u)+w(u,i);- t; c- t, G! w5 R- h" r
z(i)=u;
0 U0 u% q. ^+ V% @ end; Q4 C$ q2 P7 Q# t) z
end
5 G1 E+ P4 H1 K' `+ P end1 B+ U2 t* ]: a5 F# u4 X
end. P$ N$ o, L8 U# A) O# h: l& C
l;
# _6 B: M$ r8 ]' A8 i. k* c- Y z;1 }+ @+ t8 I# f5 N2 t1 ]1 ~
ll=l;
3 X- k, H# M7 u$ Q0 j" {! q H y for i=1:n2 B7 W) Y( d* y1 F9 r j6 y( c& h
for j=1:k
; y4 L6 J: ]9 @ v if i~=s(j)6 k! k V7 t9 q, G! `+ ?
ll(i)=ll(i); A" n v5 G2 ]+ A; T
else6 [, E9 D9 W8 M# _: d8 E% b) }$ {
ll(i)=inf;% U# v# [5 Z9 O. X5 _
end
& E: l {( b- t" I: V- ^9 Send# V- e; }2 m# j. {, x& q) N
end' u- I' Y2 }9 V! g# {
lv=inf;
# r V) l2 y' k! H( t5 Jfor i=1:n
, C" ^8 x1 L. p0 K& z if ll(i)<lv( Z. @9 M2 c1 D
lv=ll(i);+ H2 O# g4 C; G) M/ R' q& x
v=i;9 P, s9 R [7 B$ z. f
end2 S6 T$ y9 k6 m
end
) Q" {; A$ f2 }lv;
0 g% N% R( I: s: O9 {v;/ s. ? N3 g+ @4 ~7 A( c
s(k+1)=v;
2 I0 l9 ]% }6 L, f3 J0 ]k=k+1;, E J ]9 S6 L8 i
u=s(k);+ Q$ w% V- k6 E4 b- u' X0 T5 c
end
! |: c: e- r3 Cl6 T( |- u8 ^& J( j; Y
z
0 Z. I$ _- ?1 D! m' R4 L7 D! r4 b' `( [4 }8 b" M
(2) Floyd算法
. `8 M5 r h1 C8 Xroad2.m文件源程序:8 `, } ^( e9 K% A3 j# `5 T
a=[0 1200 inf inf inf inf inf inf inf inf;
$ e3 {. n6 T$ I3 S; c, a8 |1200 0 12 202 inf inf inf inf inf inf;. g4 @! C s- `4 e( [
inf 12 0 inf 201 inf inf inf inf inf;3 \. v" m, M" C! R9 z. c8 |0 D( ]$ u( E
inf 202 inf 0 31 20 inf inf inf inf; G: m4 m2 R4 K) x! H8 Y+ D
inf inf 201 31 0 10 inf 205 inf inf;
3 }7 Z$ t4 }9 D7 n* g/ P- V) h2 Ginf inf inf 20 10 0 195 inf inf inf;! I8 Y' m% ^: g/ ^9 v: N$ e
inf inf inf inf inf 195 0 5 306 inf;
. t2 m& l& p# Q% Y9 G7 z6 |inf inf inf inf 205 inf 5 0 inf 194;
# ^4 [# i4 C z2 \) u; ^inf inf inf inf inf inf 306 inf 0 10;* _/ X4 i' v- d0 j6 O% Y2 ]
inf inf inf inf inf inf inf 194 10 0];
5 b/ X, t) h6 `[D,R]=floyd(a)" p! y: c* [8 i, N
floyd.m文件源程序:
8 g% s, H2 s- cfunction[D,R]=floyd(a)
& p: r+ G0 y" i6 T6 m1 q! un=size(a,1);
5 @! X5 C; L6 n* C9 _: g* v8 F% E1 ED=a
7 c. m9 m: i1 |$ T4 @for i=1:n F' f( t1 j- e2 S" Q' P
for j=1:n
' a w- M5 z* f# i1 ` R(i,j)=j;
# m7 q/ _3 Y) ^ x end
- R5 A1 W. t0 n8 \end) [3 ]: ^1 O5 O; r
R
/ j; `9 B5 d f8 P) q0 ffor k=1:n* `5 k; {+ s% d& ^ K8 t. {
for i=1:n9 ]5 t" Q8 _$ F3 u8 |
for j=1:n% B8 C5 r+ F! \7 E9 T# U1 `1 l
if D(i,k)+D(k,j)<D(i,j)- F- G/ W2 L9 Y; V" i: ~% K4 d9 ~
D(i,j)=D(i,k)+D(k,j);
. n3 T4 r9 n' r, A7 o+ s5 z R(i,j)=R(i,k);
- q5 ]" j/ @9 j4 |0 v3 x V end
; Q$ T5 g7 h# H. p, T m- g1 ?. Z end$ W$ _0 }: Q% P8 e" |7 V
end: D- k9 v3 R% w/ h/ U& R
k
" j& f9 D" a. D/ h D z% p$ {6 k$ J0 H4 a* D5 K
R X8 p- ^7 a$ |7 O* V/ ^' R3 ]6 }
end
, o b7 Z$ n1 D9 v4 `; A( L, b五.结果分析0 `# a7 Q( m& d! ], s
(1)Dijkstra算法- r4 s4 J% ]5 o* ~/ ?# @* G
运行结果:. ~$ H4 q y, D3 S; t4 U2 b: W
l = 0 1200 1212 1402 1413 1422 1617 1618 1822 1812' Q N) R7 W# n* [6 u
z =1 1 2 2 3 4 6 5 10 8. c6 `- {, P' @% {- I/ B- i
; P5 A5 t/ N5 e6 t$ n$ I/ f
结果分析:
* w# K% Z6 w: W通过运行结果: 到其他顶点的最短路的权 ,可看出,) r0 Y" N M- y, T, E4 ?: e; R; R
到 (即 到 )的最短距离为1812(km);3 x; K0 A4 ?+ _7 a
到 (即 到 )的最短距离为1618(km);
+ O, h, |, d8 _! _& a% Y( ~, O6 ]& u! u# m$ @6 p& O) ^
到 的最短路径为:V1→V2→V3→V5→V8→V10;
3 `5 }7 [0 g9 v9 Z; M7 y% O# U: H 到 的最短路径为:V1→V2→V3→V5→V8。
$ Y2 |. i, w/ Q! M
/ e" f3 _) {0 ^9 C8 d/ X(2) Floyd算法1 y) a. V: \$ E, M. X
运行结果:
9 }5 R) V: k1 S/ A8 Y5 mD =' o4 U! a8 ^ |. X4 U2 Z& n
0 1200 1212 1402 1413 1422 1617 1618 1822 1812* J2 ?6 B# m) h: Q
1200 0 12 202 213 222 417 418 622 612
2 b4 x+ R6 c9 Q+ X9 U% e, b1 j 1212 12 0 214 201 211 406 406 610 600- a! O3 |8 w/ }# V
1402 202 214 0 30 20 215 220 424 414
) e# K2 a# g0 C0 L p& ~ 1413 213 201 30 0 10 205 205 409 399) P( B; e( s! e( t' K8 B
1422 222 211 20 10 0 195 200 404 3941 X$ M' Z# v3 p% x6 v
1617 417 406 215 205 195 0 5 209 199
h! j. t5 [' c9 t+ {/ h3 I 1618 418 406 220 205 200 5 0 204 194
" ]$ u' ?% x" j 1822 622 610 424 409 404 209 204 0 10
3 s( H( L' p" K3 R. K7 f 1812 612 600 414 399 394 199 194 10 0
/ u: ~& B3 e# {. z( A5 R9 N; B# l
2 _- k8 J3 C( ^9 cR =$ p# p& B# m7 U, N+ ?4 k
1 2 2 2 2 2 2 2 2 2
( N) U' Q+ B( \- z/ R 1 2 3 4 3 4 4 3 3 3( p( q4 i# `( @* l: X& a
2 2 3 2 5 5 5 5 5 5% [$ b* |' k5 D* J
2 2 2 4 6 6 6 6 6 6
0 N+ h% l+ b- N. i9 K 3 3 3 6 5 6 6 8 8 8( { R0 a4 M( X6 c
4 4 5 4 5 6 7 7 7 77 o7 z. b( ]# D3 a4 G9 Z6 ?
6 6 6 6 6 6 7 8 8 87 O4 h1 h) N( M6 v( x" g$ O6 z
5 5 5 7 5 7 7 8 10 10
1 e; f- d, K9 r. L' n 10 10 10 10 10 10 10 10 9 10
6 |* @- e- j5 E( Q, h 8 8 8 8 8 8 8 8 9 10 N* v$ h7 ^; R L8 x2 `, e
结果分析:
0 c( F* w8 e# X+ C2 y, ~* d通过运行结果:可看出,3 j! k/ N" G& k4 }
到 (即 到 )的最短距离为1812(km);& T8 n/ X! [# a4 u F4 c
到 的最短路径为:V1→V2→V3→V5→V8→V10;
; }, X1 ~% M; n0 _* c B3 o 到 (即 到 )的最短距离为1618(km);, h* g5 l) W5 g. D" @
到 的最短路径为:V1→V2→V3→V5→V8。; R5 U7 L% m: F5 t3 A2 h
( f1 a8 I1 [' o) S5 d# B; j' ^9 l1 W+ G6 w
+ E" P) M: p. r) ^ |
zan
|