数学建模社区-数学中国

标题: 最短路问题 [打印本页]

作者: 2395960434    时间: 2018-6-6 10:52
标题: 最短路问题
最短路问题及其算法% Y/ H8 R8 e5 R7 t" ]& z- Q' @( ]
一.实验目的:1 Q+ C6 T% B& H
1、了解与掌握图论的基本概念、相关MATLAB知识和最短路径算法;
% L0 x- d( ~- C9 e8 X: n2、学会使用MATLAB编写Dijkstra算法和Floyd算法程序求最短路径.- O3 R, D' q; K8 Y3 u8 X
二.实验内容:5 }/ ]& B( X4 K* G* x
要铺设一条A1→A2→…→A15的输送天然气的主管道,如图所示.经筛选后可以生产这种主管道的钢厂有S1,S2,…,S7.图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km).
/ O! R  A2 Y- h0 ^  b; H$ W为方便计,1km主管道钢管称为1单位钢管.9 h: U5 \. h/ X  ^
一个钢厂如果承担制造这种钢管,至少需要生产500单位钢厂 在指定期限内能生产刚钢管的最大数量为 个单位.钢管出厂销价1单位钢管为 万元,如下表:
3 X9 i! F( ?5 F6 E
2 d8 s; v7 M' W/ _* x7 n: I1        2        3        4        5        6        7
# r  G( o) j; O: Y8 [% V- \6 j ' n# I% h; f6 f
800        800        1000        2000        2000        2000        30002 e! ]0 ~6 a7 U6 m, r

, F+ W7 v  o; J3 ]; m160        155        155        160        155        150        160
, U1 d; H' k1 g  C0 W4 i0 r/ H3 Y. L0 y8 G+ N
1单位钢管的铁路运价如下表:6 i- T2 ~" `/ R' A9 w- W/ K
里程(km)          300
& [# C3 D9 G' J# g( m3 k2 S301-350        351-400        401-450        451-500
) K3 `: ^: J( T: R3 }8 M1 O3 @运价(万元)        20          23          26          29          32' N" w/ _3 Z3 [  ^/ v% q
里程(km)        501-600        601-700        701-800        801-900        901-1000
! R5 a& I) I" p  g# L8 X运价(万元)          37          44          50          55          60
9 K7 P. }* \1 {- b4 M- j5 {1000km以上每增加1至100km运价增加5万元.
: y1 ~; J0 p) p/ \) H, ^' V公路运输费用为1单位钢管0.1万元每千米(不足整千米部分按整千米计算).
+ A0 P* X* C6 l8 H+ i假设从钢厂 订购钢管运输到铺设地点 和 .钢厂 在指定期间内能生产该钢管的最大数量为 个单位,钢管出厂销价1单位钢管为155万元.) O8 F; G. Q1 \9 K, R
. o/ M( _4 L4 R7 l
试制定一个从钢厂 到铺设地点 和 的钢管的订购与运输计划,使总费用最小./ k/ _! H4 c7 m- u) ]
三. 模型建立
0 P( `! p1 n3 s, E0 U设 为 ,将上图按从上到下,从右到左的顺序依次命名如下.将上图改为如下赋权图形 :
6 E8 b2 p6 I6 L- v. j7 m" K
9 q7 f% ]7 @. r# Q+ z利用Dijkstra算法和Floyd算法:求 中从顶点 到其余顶点的最短路.而求钢厂 到铺设地点 和 的最短距离,即为 到 和 的最短距离5 p! t$ F! X7 w7 X
# I9 j# X8 d) K/ g/ N/ c2 Z
解:先写出带权邻接矩阵:
/ V( h4 M+ K9 Q6 M2 f 3 |+ i3 m% W( e' u. N
后分别用Dijkstra算法和Floyd算法步骤,求出 到 和 的最短路的权 以及 的父亲点标记 .2 j! m. |1 ^, O" F; ^9 {
四. 模型求解(含经调试后正确的源程序)8 a" N# ]: m, C6 ~. U- t
(1) Dijkstra算法5 w. [# a! E) {2 g5 O& {
road1.m文件源程序:
% |0 R0 V8 E1 M, l/ K8 Jw=[0 1200 inf inf inf inf inf inf inf inf;
! R" V; m% h5 f; r. \1200 0 12 202 inf inf inf inf inf inf;* e6 J0 b3 U) {
inf 12 0 inf 201 inf inf inf inf inf;- V, L, S" \! Q6 u: n  @( f
inf 202 inf 0 31 20 inf inf inf inf;2 R# e. K0 ]$ K* z; }8 K1 h
inf inf 201 31 0 10 inf 205 inf inf;$ G1 g: o5 N3 z6 U. N1 t5 D& ?
inf inf inf 20 10 0 195 inf inf inf;
+ q! h' r2 `& a/ Pinf inf inf inf inf 195 0 5 306 inf;
8 F1 _  k3 V) e" s/ M" Sinf inf inf inf 205 inf 5 0 inf 194;/ S8 [+ ~5 J" k, P$ u7 }- }
inf inf inf inf inf inf 306 inf 0 10;
$ h5 Q$ x% |$ z+ w# ~5 ninf inf inf inf inf inf inf 194 10 0]; 5 a- Z, {3 U6 t) x* O3 ^
n=size(w,1);" }' M( [( y1 @
w1=w(1,;
1 ^( L- o# p: U+ @: _for i=1:n
% X8 {2 h* X  t2 {; ^8 g    l(i)=w1(i);
9 k2 r! ]" R" v, Q* Q* g- S    z(i)=1;/ z4 T0 l3 v0 {; V& A* d) H
end7 h( D9 a- f7 K4 t( u" a( Q. `
s=[];3 @5 ~' w, }. u
s(1)=1;0 u. x2 W1 U/ u
u=s(1);% ^- S2 U& X2 \: i8 Q$ v/ u2 v! |
k=1;
5 Y* f+ O7 g  Y3 x0 vl;
2 q  Y+ n, j0 q+ @: Hz;
! g7 m) n8 x6 z4 M7 T8 u! \while k<n$ _3 V& M6 @3 X( r" ?8 }$ ^; K
    for i=1:n% J& C' Z+ S' a: R0 j1 k
    for j=1:k! ]/ g5 j# Q3 k$ u0 j
       if i~=s(j). d4 g) I% _% o$ X- M% Y- e! s
          if l(i)>l(u)+w(u,i);
4 t$ M; L  g) j; A             l(i)=l(u)+w(u,i);
' e3 Y* R3 n3 s             z(i)=u;
) Y1 R. j  s' Q  W+ l, m; p# j         end
/ y* i8 L# E3 _, W( H3 _" k     end& S, d" Z; x9 m
end
: |5 T' [8 L! k9 k+ I# gend
7 B+ j" E; B  v% M l;
* f$ g! S' p- S: p9 B6 u2 Y z;
+ P: L  X& r5 mll=l;! L. t+ `. R1 {6 W7 f: M; M$ s
for i=1:n$ }8 A& d/ d8 o. u8 E1 r8 D/ ]
for j=1:k8 |( k7 K) r0 V3 ?3 u7 \
    if i~=s(j)
: `0 u) v2 [4 j) E& j       ll(i)=ll(i);
2 _' a* |  Y, S% J   else
  y9 Q/ K% _/ u0 N3 W       ll(i)=inf;
0 P- f0 G+ B$ c, m. m   end. X, u. z& _. S5 [4 [: ?3 j
end
" e$ h( U* e6 ^% {! Gend7 y9 ]1 C/ M; w
lv=inf;) F* t8 k4 G; N) N4 O4 L: F
for i=1:n
" G! A) H* A3 z" g    if ll(i)<lv/ G- L! E, L" }9 ]
       lv=ll(i);
) i2 X1 O4 H6 ~6 Q. @  y! W       v=i;
1 q3 u5 Z" W( h, L4 F5 L   end( ^* x6 r) o; B
end
/ p4 X7 Y: S7 c$ Clv;
2 _4 R, s# a- V5 e; U' Kv;' v) V9 Y- o# L3 t8 }7 v0 J
s(k+1)=v;8 ~' w0 f$ C# k7 h; r
k=k+1;2 d- a- i6 B. s( O! g: h6 Y
u=s(k);1 |, b6 E% v* x
end
" e! p/ G" p$ l7 ~8 J, g+ el
6 O& O# y! A, M- h. O% s" p: {# Dz
2 M: ?4 G# y4 F. f7 m4 ?
) k1 X( _1 s1 g; w5 ?(2) Floyd算法8 o# ]( i8 K' z# j  I5 w
road2.m文件源程序:$ s8 V+ T0 [/ R& r: e
a=[0 1200 inf inf inf inf inf inf inf inf;0 R# L7 L( z* H  [, T/ d+ O* Y
1200 0 12 202 inf inf inf inf inf inf;
  k! T7 J$ X  A; }' w1 t' Yinf 12 0 inf 201 inf inf inf inf inf;% @6 O4 v" q! G' f
inf 202 inf 0 31 20 inf inf inf inf;% b$ i& k* g+ r; o4 f* J& u
inf inf 201 31 0 10 inf 205 inf inf;
# |/ i- E# J" C; q. r% z4 I* ^inf inf inf 20 10 0 195 inf inf inf;
1 v1 u' Z6 F6 p/ a! F4 _3 @inf inf inf inf inf 195 0 5 306 inf;
4 G$ m' K6 E2 E. o/ Y" z: Vinf inf inf inf 205 inf 5 0 inf 194;) }) B! L1 s# E8 }, a& u
inf inf inf inf inf inf 306 inf 0 10;6 f2 `7 {+ h9 r0 I8 |- b. B) t
inf inf inf inf inf inf inf 194 10 0];
7 I6 ?  _0 v8 J! X[D,R]=floyd(a)
0 k- p0 G$ |0 i" d! c. T0 k! ?floyd.m文件源程序:
* ?6 h  B' w+ e7 k1 \$ cfunction[D,R]=floyd(a)
" B; `" Q7 V& w' ?. vn=size(a,1);
( ?/ z4 B' Z8 g2 d* c# o+ |2 uD=a
; b2 R  e' w" D3 [8 x: ~for i=1:n
. p3 k# \+ k$ a! I& {7 T3 E    for j=1:n
& _% J0 @" P/ ?1 v: V/ l6 }5 p        R(i,j)=j;* y# o- [* v% d* e* L) Y
    end
* g. ?& Q" e( F) p9 Qend
9 v2 k# s; `/ p% D8 YR
  t+ ?9 y0 h3 U4 M: Cfor k=1:n  a9 N* t+ f5 M3 q, p) ]
    for i=1:n
7 d/ a8 V) H9 g& B        for j=1:n  E' f, h6 r6 m1 q9 M7 J6 z/ A" e
            if D(i,k)+D(k,j)<D(i,j)# ~$ b& R( @6 t9 L* [9 }  h
               D(i,j)=D(i,k)+D(k,j);
9 y; b0 |9 R1 _               R(i,j)=R(i,k);
) n% P: |, E' m) q# Z1 V! [           end& G- F" B! o9 K* j- X- L) v, O& S! P
       end3 Y# y+ W9 Y2 v3 o. k( M4 l
   end$ a. f% l& B* p2 C' j2 u! I7 y
   k
- q" t: b; c3 D   D% V" H9 ^- l0 r+ `/ R) A" m
   R& `% Y8 K7 ^2 L
end
$ h1 _! D! o2 j% z5 ]; U+ o: v五.结果分析
- c( ~& m7 Z( D(1)Dijkstra算法
0 M/ n5 m6 F! g: {1 M运行结果:5 f5 i" ?: U- k, X! E
l = 0   1200   1212   1402   1413   1422   1617   1618   1822   18126 g; T* J+ t& T/ `
z =1     1     2       2     3       4     6      5      10      8
9 d) r+ U: I8 e. j  Q9 y+ j9 K
3 @; i/ k! K+ @结果分析:
% T8 J1 J( i; {$ ?. r0 `, ^; z通过运行结果: 到其他顶点的最短路的权 ,可看出,) e' H+ k: S6 r: a+ Z
到 (即 到 )的最短距离为1812(km);
" C' X- n4 m$ P( K 到 (即 到 )的最短距离为1618(km);
6 [4 Y9 N' b3 X' W3 l
4 N5 K0 w6 \- S/ s( x1 q 到 的最短路径为:V1→V2→V3→V5→V8→V10;
& K3 u. F1 F4 `: M, D 到 的最短路径为:V1→V2→V3→V5→V8。+ W* k. H; f0 w: q+ ?) X8 S
* W* N/ _, M9 H6 ^/ K; m& \
(2) Floyd算法/ g4 s/ R8 Y$ s6 N' R0 _
运行结果:) b, e) C$ g( U# z. h, `/ j- g7 y7 M
D =
4 I' p. g: R" t" ^, l     0  1200  1212  1402  1413  1422  1617  1618  1822  1812# M- \# E( o7 r; Y! ^, c  u" @
  1200     0    12   202   213   222   417   418   622   612: v7 a1 l2 j) h; D% E  \
  1212    12     0   214   201   211   406   406   610   600
5 q' T- c+ D5 {+ q3 y  1402   202   214     0    30    20   215   220   424   4143 |) F8 Z: F' O* F* [8 S
  1413   213   201    30     0    10   205   205   409   399
8 ?' x- x0 {# h  1422   222   211    20    10     0   195   200   404   394/ h3 \+ v8 @$ Y: l
  1617   417   406   215   205   195     0     5   209   199
8 }8 h7 B0 I8 `1 G9 ~9 P  1618   418   406   220   205   200     5     0   204   1945 D1 Y2 e5 O8 \
  1822   622   610   424   409   404   209   204     0    10% n* h8 ~) M) Y. Z
  1812   612   600   414   399   394   199   194    10     01 U/ H3 u* ]- N7 c

( k' h( B, \. f6 b( AR =
$ M0 r0 M: D2 g6 C" O, s3 P   1   2   2   2   2   2   2   2   2   2
- c9 S+ q( `* i2 D" {   1   2   3   4   3   4   4   3   3   34 H& x- I3 X# B$ _( T
   2   2   3   2   5   5   5   5   5   5- L% B1 w4 G& u) @6 o) L9 G# z
   2   2   2   4   6   6   6   6   6   6
3 n  d# q* @  I, v   3   3   3   6   5   6   6   8   8   8
' f1 `; b1 d, Q; g5 K/ G( C6 N   4   4   5   4   5   6   7   7   7   7* z. b0 v  O) S3 z6 m3 t
   6   6   6   6   6   6   7   8   8   8! S, ]6 y$ f9 P) e) s' Y/ e! _
   5   5   5   7   5   7   7   8  10  10$ Z9 b1 R. |: i3 o
  10  10  10  10  10  10  10  10   9  10: Z& E- `+ x% X9 X* R
   8   8   8   8   8   8   8   8   9  10
8 C  m' D) x8 u( y结果分析:
8 b  X* G8 `4 ?: [, f5 h& M通过运行结果:可看出,- P" e6 n8 \! G7 @
到 (即 到 )的最短距离为1812(km);9 x/ n# H* \6 v& [& t
到 的最短路径为:V1→V2→V3→V5→V8→V10;9 \2 @/ h5 g5 B5 V; }, I1 v& W& m% x
到 (即 到 )的最短距离为1618(km);# V7 y- v) @* {3 J; ~
到 的最短路径为:V1→V2→V3→V5→V8。
7 K; l; ?; T; e$ H8 y3 o; P2 F* h- [, _2 g; l3 }) E
: Z4 Z. @. k1 ^% Y, f9 M

作者: 1430644259    时间: 2018-8-9 14:50
666666666666666666666666666664 J3 [' l3 T, ?+ `" m, @





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5