- 在线时间
- 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]初来乍到
 |
最短路问题及其算法; G5 u, g; @% ^- D* o; y
一.实验目的:; w$ m- b& T' w+ }) ~, b0 Z
1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;
& e5 V& X. S1 G/ x' p+ i2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.% i5 a: Q$ C$ C: Y/ _7 {* T" w
二.实验内容:+ `! o3 d0 e9 Y
要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).
" m u: I8 x) |6 U0 X7 n, ]为方便计,1km主管道钢管称为1单位钢管.
6 z; w- K5 z( O) z4 u3 q, g4 Z一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表: p4 c) H* D. e f9 O8 t
( `7 W* ?% @! }: j2 q0 P( c
1 2 3 4 5 6 7
2 {! q% a/ I+ R) U0 X/ D : R* S8 M- _/ _) ]# V6 T- x
800 800 1000 2000 2000 2000 3000
, u4 u' {8 ~. u1 R3 V
! e3 d7 x: Q5 ?% Q( |# W9 k160 155 155 160 155 150 1609 c$ ?2 W+ ?1 W4 i
- Y! \% ?2 ^8 ^2 q1单位钢管的铁路运价如下表:0 q# Z% M" r8 O0 z! n- f
里程(km) 300
" k2 z. S5 c! H. r: a( p( k301-350 351-400 401-450 451-500+ K3 v, {: W Y
运价(万元) 20 23 26 29 329 Z, w J9 ~8 I& n
里程(km) 501-600 601-700 701-800 801-900 901-1000% B- Z i2 ^- j! h9 B# W
运价(万元) 37 44 50 55 60* y4 A2 ]5 V0 I2 |4 V* p* E9 ]$ }! x% B
1000km以上每增加1至100km运价增加5万元.
+ n, l, r4 [4 C9 U% i6 W% A公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).
% T8 @7 R$ X! e0 W假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.8 G& @8 E. E: H6 Z0 F! p' C9 M
. |+ _& r/ d) Z& F9 ], h% Q
试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小.: F& l% e: i% w* x" T
三. 模型建立. f/ j; Y2 _! Q- e% I: \% w
设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :. h# v3 M! w% K# h& H5 g7 G
, c4 J v" w5 i
利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离
; j: L) N1 r- x$ Q8 f! o + J0 b# x- y. ^/ |, R8 v% G5 A
解:先写出带权邻接矩阵:+ b' c1 i- |8 C
4 x! m8 y2 V U3 i9 t
后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .
$ n9 {5 Z7 p' \& r四. 模型求解(含经调试后正确的源程序)- i8 ]: E' x4 \/ t; {* x% t
(1) Dijkstra算法2 Q7 R/ h; E I! [8 \5 e
road1.m文件源程序:
( I% ]" `7 j! ~4 bw=[0 1200 inf inf inf inf inf inf inf inf;/ q( K/ d: p1 w- @/ Y. H1 }$ p
1200 0 12 202 inf inf inf inf inf inf;
& b, T. N( X- r! x9 l { Ninf 12 0 inf 201 inf inf inf inf inf;
5 k( H8 C' ~- y0 `) _3 ~# Y5 H2 `inf 202 inf 0 31 20 inf inf inf inf;
3 W e0 k {. n: z5 Uinf inf 201 31 0 10 inf 205 inf inf;4 \1 e: e% j/ D1 h+ j
inf inf inf 20 10 0 195 inf inf inf;
" t& T% f' `. r, R& u, | qinf inf inf inf inf 195 0 5 306 inf;
7 Z* M2 J. a( Y6 Z; |& iinf inf inf inf 205 inf 5 0 inf 194;8 @ M7 y" O! X& A: l/ v
inf inf inf inf inf inf 306 inf 0 10;2 V' q+ v2 T" K8 [2 W4 K
inf inf inf inf inf inf inf 194 10 0]; : L E) ?5 h5 H/ o; L8 n
n=size(w,1);* r7 u* M, v, T
w1=w(1, ;
# F: o7 c ^7 o" pfor i=1:n X( [; j1 p: m @6 S n
l(i)=w1(i);
h# q& D* c9 ^# [ z(i)=1;
5 I' G6 v: W* M( uend
. E/ D8 e6 o6 Ls=[];7 }, `% o4 Z# `) L1 z' c4 W W6 T
s(1)=1;0 D* t: n2 J: N% W6 q8 Z: @4 n
u=s(1);$ E0 y% l$ k2 C
k=1;4 k5 U/ `& S: b* _8 c. }( i
l;4 @8 N2 J! y0 B: C
z;
% ]# }7 v0 s& S, s5 xwhile k<n( c. _: a5 b$ q" E0 n' T
for i=1:n
# V- u: I3 f9 F6 }6 c- D9 L7 ?: ` for j=1:k$ V( G$ r4 n/ R8 U
if i~=s(j)* I4 H7 x) |' H( g3 Z/ _8 H
if l(i)>l(u)+w(u,i);
# o% I, [7 ~: U& M! X6 @ l(i)=l(u)+w(u,i);
% B2 h4 T6 z. d. ]8 A, W3 v z(i)=u;' w1 I) J2 r4 u' t1 {
end
, e$ A: t$ O2 N E# C end: J0 w% y% R, x, A6 N/ q
end
& y5 J$ P1 u7 ], F7 i& xend6 Y( [$ K: \6 b0 j9 }
l;
5 B6 |, g" N4 J* X9 H5 u z;
0 e. a0 ]) V" [ E2 s3 f3 x3 S( U& tll=l;
7 }4 H0 Z9 A i, c for i=1:n
* t1 H4 [- p% w. R for j=1:k
# s D b+ y: |( b9 w K if i~=s(j)4 W6 S( t+ m, b
ll(i)=ll(i);
* [ L1 J$ V% W7 H1 ?# A7 z else9 V# I8 z& r. I
ll(i)=inf;
- m z2 _& \9 n" |! d end+ J9 u; Q' t- w% M8 x
end
* i9 Z# p0 V' c5 k" ^end
. g) q) g2 ` _, W4 y" Dlv=inf;
1 P1 p o6 M$ H* rfor i=1:n% N# r% o0 D' Z( L3 Z3 p
if ll(i)<lv. D$ C3 R9 {8 D" M" B1 {) s
lv=ll(i);6 A- G: ]# z- z- N% U
v=i;
: |6 R& T" K- F. A: q% h end3 G( K& f5 _& u+ _, F0 Y" C& Y
end
, @9 |3 h- b6 N, vlv;6 O o. y" |; t6 h' m" W1 t
v;( }. }0 P4 \; Z0 P
s(k+1)=v;
% V7 _" K/ X& r- R( C+ b& c' Dk=k+1;
2 E4 s7 k7 t3 Gu=s(k);. {" f0 R% O9 k( o, A. J
end
! L' I9 {' I6 t5 Z8 al
2 w' r8 R* A# ~7 E7 p4 }$ o( }7 p* Fz
8 u" u) W" v" d3 E6 N7 t, t2 [. K# O+ T/ U
(2) Floyd算法* L8 F$ v# H) x3 H( Q) h l1 G
road2.m文件源程序:
) q2 y$ I8 }# E8 V- T2 M( V( |a=[0 1200 inf inf inf inf inf inf inf inf;8 h+ y% W; Z( X
1200 0 12 202 inf inf inf inf inf inf;
. I3 D3 g" r* \2 Sinf 12 0 inf 201 inf inf inf inf inf;3 B3 L9 I8 s! Y3 ?9 {, o- k
inf 202 inf 0 31 20 inf inf inf inf;8 a$ Y# Y3 N- [. g
inf inf 201 31 0 10 inf 205 inf inf;; ^5 F0 ]. e8 U4 p
inf inf inf 20 10 0 195 inf inf inf;; E b, R4 ~. u+ T- a* N
inf inf inf inf inf 195 0 5 306 inf;: \5 i$ @ ^. a" r$ M2 I* N
inf inf inf inf 205 inf 5 0 inf 194;
" R& y4 `! z# J9 t: r2 f8 k4 binf inf inf inf inf inf 306 inf 0 10;: y) A5 \ F9 C' W
inf inf inf inf inf inf inf 194 10 0];
" z- }% a6 [$ m$ ?[D,R]=floyd(a)' M7 C- [2 @9 K1 Z) \ V( L0 K7 A
floyd.m文件源程序:$ S* b$ l0 k; f: e T `, t
function[D,R]=floyd(a); J- |. V r# s; \
n=size(a,1);
; w0 \& S6 |9 R* I. |D=a
) s2 z7 w+ E: I7 W4 m: @* q8 x5 xfor i=1:n* b/ `$ I, _. D% v# p3 r
for j=1:n
q! w4 e2 D0 ^( a R(i,j)=j;
- k* ~/ E Z* ~- a; ^. i end
" G" E/ w8 P, C/ I3 ]+ Send
( N2 l m) z# {' E, _0 zR" l) u3 E1 `( ~/ y+ s4 r0 ^
for k=1:n
. _& f. Y8 S8 K for i=1:n# {8 i' Z; I' j, I4 k) r. `' X5 E
for j=1:n$ y8 g6 X& a% H9 U
if D(i,k)+D(k,j)<D(i,j)
" O9 T, S M) ~, T1 @ D(i,j)=D(i,k)+D(k,j);
! @( J Z& b- H8 j R(i,j)=R(i,k);. n- g$ y2 i' W' h/ U+ G
end
" a3 b: [4 g; ~ end. T+ @# [. ^# `0 r
end
" |6 ?4 d" C* B; b k
+ L4 x. o" S1 Y( k- o0 ?( k D: |6 l$ _" C6 Q( D7 o' N W3 o
R' \5 s8 X3 W* w0 X8 E1 m& p/ D% S
end
: C" d. o. I9 t: I9 A五.结果分析
! ^7 p* {. |5 U& l, r1 A(1)Dijkstra算法: {. [5 g4 K1 K3 X
运行结果:% n" a4 f$ x9 `) m9 H
l = 0 1200 1212 1402 1413 1422 1617 1618 1822 18125 w/ O0 X. M8 h3 ]# r
z =1 1 2 2 3 4 6 5 10 8
/ j# n' F1 N4 n3 N7 v' P
, _/ A% M- \# O, h- j结果分析:
. L' w( y' T/ ]1 h通过运行结果: 到其他顶点的最短路的权 ,可看出,4 M) a2 o# F) A: S* e) t
到 (即 到 )的最短距离为1812(km);
+ f9 u5 i5 ~: m$ O! S8 F 到 (即 到 )的最短距离为1618(km);
9 v2 k5 X: Y6 x" H1 w3 ~$ \! G3 X4 _) d( ?! ]2 p
到 的最短路径为:V1→V2→V3→V5→V8→V10;- T. n& R0 R* ?& [
到 的最短路径为:V1→V2→V3→V5→V8。
+ u) i P( b- ~1 ^" H
6 ~, g+ _- `0 {( w4 ?: z(2) Floyd算法
7 Q& ?2 x2 G' G7 `. j4 p运行结果:
! K4 ]3 @, j5 R; [6 ^0 v- ED =# \9 q2 e( v. b$ N! d9 ^
0 1200 1212 1402 1413 1422 1617 1618 1822 1812
$ A- |# N" |. o1 M8 X/ V8 d 1200 0 12 202 213 222 417 418 622 6127 G1 `" [) K& f4 b6 @6 U- P
1212 12 0 214 201 211 406 406 610 6008 E. A; N# u/ ?3 M/ H6 s' a
1402 202 214 0 30 20 215 220 424 414
$ h) m1 L0 K. d0 `1 I 1413 213 201 30 0 10 205 205 409 3996 S+ O- ~+ |# q9 J
1422 222 211 20 10 0 195 200 404 394
4 N0 A" K+ ]& D4 ~ e- }5 [) d 1617 417 406 215 205 195 0 5 209 199# M) A8 }& p9 r# \& D
1618 418 406 220 205 200 5 0 204 1941 D" ]2 T2 a5 V% b
1822 622 610 424 409 404 209 204 0 10, c/ {2 u9 D7 [: i/ s
1812 612 600 414 399 394 199 194 10 0( W3 z- b8 l W6 {. e# Y/ {, ~
! a/ L1 P$ ^0 K+ O+ m
R =8 B! `& ?. x* |8 [2 X4 x1 ~# r3 Y
1 2 2 2 2 2 2 2 2 2
( e' T. x9 r- w! e1 W# B. |% L 1 2 3 4 3 4 4 3 3 37 Y# S, U. R4 L; g$ q8 |) R0 Y8 j! T9 G
2 2 3 2 5 5 5 5 5 59 I: D2 y9 g% T5 ?
2 2 2 4 6 6 6 6 6 6
* s* y) _4 D+ V, T 3 3 3 6 5 6 6 8 8 8
/ q+ L9 j1 c+ N i [* p+ F1 k 4 4 5 4 5 6 7 7 7 7% _- N- Q I) H8 w- b; E2 o- d" y
6 6 6 6 6 6 7 8 8 8$ W1 l1 |& G$ r
5 5 5 7 5 7 7 8 10 10% B2 v3 Y4 I X! P
10 10 10 10 10 10 10 10 9 10. H% _/ T+ q. J/ L
8 8 8 8 8 8 8 8 9 10
/ N# q5 Q/ p) K j ]. d3 y结果分析:
) y( q, o" c4 s0 t通过运行结果:可看出,- Z. l6 R; i- y0 g
到 (即 到 )的最短距离为1812(km);
& A9 q5 G8 f+ N- W$ Y, w 到 的最短路径为:V1→V2→V3→V5→V8→V10;
- |. c: U' P* k7 e! Y 到 (即 到 )的最短距离为1618(km);* _7 T/ B4 S5 h) r
到 的最短路径为:V1→V2→V3→V5→V8。
5 r# _) I# ?7 K# J" a' n
' | g3 d. h4 ]9 |: k: y
% V( J; Y" `9 u8 g% g6 A3 I. T+ W |
zan
|