数学建模社区-数学中国

标题: 谁能真正解决这个问题,送20个矩阵币 [打印本页]

作者: lxsoft110    时间: 2009-2-5 21:21
标题: 谁能真正解决这个问题,送20个矩阵币
我编这段程序的目的是为了模拟火灾中,一个房间里面的人员的撤离情况,运行出来,蓝色的点是障碍物、黑色是可以空地、绿色代表人。4 R: |- b. g1 V6 v
我用的算法是:1.建立一个60*60的网格,并且定义边界和出口
, V" s; H1 F, x- w# L) U% P* N                    2.给每个格子赋一个状态。(0,0,0)代表空地。(0,1,0)代表人,(0,0,1)代表障碍物。
+ W4 b( f, ?4 Q; O& d                     3.规定每隔一段时间,计算人的状态(看前后左右,哪个格子离门口近,而且无障碍物),就向那个格子移动。
3 l) a0 d. ~0 c$ W; i+ [5 G                      4。看所有人离开房间需要多少时间。
# p+ J6 i( q7 J* C  n下面附上MATLAB程序:盼大牛解答!!不胜感激!!!
9 I; f( a5 l( q  V9 T5 F               clc9 p: D5 T: [& S* n# i
clear
% {  _* E' E+ G7 Hnx=60;
7 _+ T% l9 Q/ Y4 }* ^, Wny=60; ! P, @8 I* `" n7 _7 u% ~
%定义固定障碍物的状态
! |; h: G  z4 j% H: ~6 d( pz=zeros(nx,ny);# z. ^; @& S3 v+ b* P* V) s8 }
peo=z;
$ P) }% ?& i) {; J  s' ~%peoNew=z;: z% t* u  t  ?% P/ m+ C# Y3 \
wall=z;0 ~# \. q) i- H4 s, C8 f
wall(1,1:ny)=1;
6 D4 d( L0 {$ @, R6 Z" Wwall(1:nx,1)=1;- Z- J, M# g' i* ?9 B0 {; R
wall(1:nx,ny)=1;
; T7 j1 g( k% D. Pwall(nx,1:ny/2-2)=1;* @4 L6 u' Y: u# ]( D
wall(nx,ny/2+2:ny)=1;! q+ f; d- Y7 i, P4 A* {0 }
wall(nx/4:nx/4+1,ny/4:ny/4+1)=1;
- r4 r: @, F2 f& J, Fwall(3*nx/4:3*nx/4+1,ny/4:ny/4+1)=1;
* r6 W( A: ?: [+ Wwall(nx/4:nx/4+1,3*ny/4:3*ny/4+1)=1;. _& T: b+ F) G# o# g4 q. X% p
wall(3*nx/4:3*nx/4+1,3*ny/4:3*ny/4+1)=1;
% N3 Z- u3 x2 _. G2 k9 m%定义人的状态9 \1 {) E& A) n8 }# Y: h) g7 ^
for x=1:1:12
# X+ V. o& z& E: M3 d    for y=1:1:12, ?% W, H5 ^4 g/ z5 p
        x1=round(rand(1)*59+1);
- U! M1 n; G* d2 t        x2=round(rand(1)*59+1);$ [% R) g  `/ G9 |" n  j1 N, }; u
        if wall(x1,x2)~=1
; E$ }. Q1 b3 P7 a; W- F, e, N           peo(x1,x2)=1;
/ B1 `/ x3 A$ `. j, U: E$ D       end. g7 K9 |: u5 e: x1 |0 B1 z) H/ K2 D" \
    end" E/ `. P& w/ v; ]. u7 F
end
( ]0 U9 q0 M2 p) }1 w$ n%定义安全矩阵,指引人群运动0 w  i+ \9 ?9 H: K: E
safe=zeros(60,60);2 G  I- o* X0 Q; C& l6 A2 M8 [# ~7 |4 _
safe(nx,ny/2+1)=0;5 E5 g' p* z* H6 I
safe(nx,ny/2+2)=0;2 s; J7 \' p3 H9 N! K7 d$ s
safe(nx,ny/2)=0;( B& }  G# d5 d# O, U- u6 |/ ~
safe(nx,ny/2-1)=0;
2 v' T2 t$ O; n6 a4 }% Osafe(nx,ny/2-2)=0;8 z! j! H! N  f. W2 r+ T/ P- p1 R
for i=nx-1:-1:22 p5 M) D- q; o0 W6 n* R  p9 h' E' \" ?
    for j=ny/2+3:-1:2# a8 o, }) l" `6 z  C6 x! n
        safe(i,ny/2)=safe(i+1,ny/2)+1;
3 |$ X0 S$ z" a& T+ ]8 q2 d        safe(i,ny/2-1)=safe(i+1,ny/2-1)+1;
' ?, y( h3 ~1 F* l% P        safe(i,ny/2-2)=safe(i+1,ny/2-2)+1;
. T) t3 _0 M1 U( ^: X1 B        safe(i,j)=safe(i,j+1)+1;4 E- P9 O8 ~+ Q% s
    end; l. \0 @, X+ S( ]; R
end+ A8 H( L; m# B/ B3 g
for i=nx-1:-1:2, N7 s/ }9 P8 T" _
    for j=ny/2+3:1:ny-1
, C! J: j7 |, X; Q) n        safe(i,ny/2+1)=safe(i+1,ny/2+1)+1;
! ~/ I! C5 p( a6 x' G8 j7 B        safe(i,ny/2+2)=safe(i+1,ny/2+2)+1;: `7 @* H; `2 t3 H4 O
        safe(i,j)=safe(i,j-1)+1;
# u# y& O" ]! E3 _4 w# l5 j5 H5 d    end
# s9 g$ ^2 f4 G. \) Nend2 _$ p4 z3 P8 f7 H. k3 _
        
7 m5 D! m" X& m0 gimh=image(cat(3,z',peo',wall'));
- x" A+ N& @9 x$ Iset(imh,'erasemode', 'none'). f& H6 v; S2 z' v! q" Y
axis equal. Q+ }" @# z7 I/ y
axis tight
- U3 U) u4 F/ K) h; Q%peoNew=peo;; I, p( {# e+ ]4 p- b
xind=2:59;
. }/ B9 [4 q$ S1 P' t& \* g* Hyind=2:59;
& ?) f4 {" J" N! h; L6 a% j5 Yfor m=1:1000
; U- g$ x7 \" g7 ~( \    if peo(xind,yind)==1" ~, m0 n: M3 O% k* r4 q* J
       if safe(xind,yind-1)<safe(xind,yind)&wall(xind,yind-1)~=16 ?: ?! ?- E# }
           peo(xind,yind-1)=1;4 t. n! A% D, x9 d* C
           peo(xind,yind)=0;" s1 k) a* l' b) E4 w3 b. C/ v
       elseif safe(xind,yind+1)<safe(xind,yind)&wall(xind,yind+1)~=1
4 n+ j; R/ s& v" ], T/ Z3 R! g           peo(xind,yind+1)=1;1 ]3 u2 B" e$ f
           peo(xind,yind)=0;% i: w7 h3 o* a5 {( I& p8 t) c
       elseif safe(xind-1,yind)<safe(xind,yind)&wall(xind-1,yind)~=19 o6 ^2 F5 r0 J
           peo(xind-1,yind)=1;, g4 R8 N; y1 L" A. T2 y7 W0 ]' w
           peo(xind,yind)=0;
" N; ~4 ^# Z  o7 X       elseif  safe(xind+1,yind)<safe(xind,yind)&wall(xind+1,yind)~=1
0 ?2 N! |; o0 C' _6 K           peo(xind+1,yind)=1;, D# T5 F6 L0 O- f# h" e
           peo(xind,yind)=0;/ V: e9 g5 `$ o/ N/ V3 |
       end+ j$ n  _2 X! l6 Q+ ]. _9 \' f- W
         peo=peoNew;) P4 K$ X' e$ w+ m0 k2 C+ |5 y
         set(imh, 'cdata', cat(3,z',peo',wall') )6 v, s( G. i% v" Z
         drawnow 2 o) L. i; g! R! U' o
         end6 u9 E! z- z2 C5 H7 \! Q- O& Q% W: O7 V
end
作者: etzhu    时间: 2009-2-5 21:32
实际上不用那么麻烦,
3 I- f  [4 ?2 C* ?; k首先这个问题必然是满足 贪心 前提的,所以可以首先计算出每个人移动到门口的时间,然后排序,从小到大出门,考虑相等时的拥塞,就可以了。
' {8 s7 \/ H3 ~; A8 r) K当然,也有一点不足,这里没有考虑一个人挡在另一个人的路上的情况。
作者: suxpert    时间: 2009-2-5 21:38
up,友情帮顶。
作者: sphereballball    时间: 2009-2-5 21:46
现在是休息重要,别再动脑了
作者: lxsoft110    时间: 2009-2-5 22:08
2# etzhu ) \  o8 o2 H2 u. w8 v2 I
呵呵~兄弟。你还是没有说明我这个算法错误在哪里啊~
作者: qsoft_cn    时间: 2009-2-5 22:22
你调试一下可以发现,,if peo(xind,yind)==1 这个有问题,for循环里面的一次都没有执行。。。我正在想,应该有if find(peo(xind,yind)==1),,,厄,现在我该休息了。没时间再想了。元胞刚刚学习。。。。
作者: wxl1988    时间: 2009-2-5 22:33
我也要休息了~不看了~~好成绩·
作者: cldndx    时间: 2009-2-5 22:37
bless明天遇到顺手的题目!
作者: victoriajh    时间: 2009-2-5 22:37
注意休息啊 楼主
作者: terrance_ho    时间: 2009-2-5 22:40
up,友情帮顶。




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