数学建模社区-数学中国

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

作者: lxsoft110    时间: 2009-2-5 21:21
标题: 谁能真正解决这个问题,送20个矩阵币
我编这段程序的目的是为了模拟火灾中,一个房间里面的人员的撤离情况,运行出来,蓝色的点是障碍物、黑色是可以空地、绿色代表人。
& Q3 @( A5 }, q! ~我用的算法是:1.建立一个60*60的网格,并且定义边界和出口5 C* b( N: l1 B+ ~
                    2.给每个格子赋一个状态。(0,0,0)代表空地。(0,1,0)代表人,(0,0,1)代表障碍物。
% R, v9 m$ t/ z* `* a; n: }* ?$ h                     3.规定每隔一段时间,计算人的状态(看前后左右,哪个格子离门口近,而且无障碍物),就向那个格子移动。: ]% i5 K3 Y  b# P5 O' S
                      4。看所有人离开房间需要多少时间。" R% z$ R6 C0 m6 ~: y+ C, q
下面附上MATLAB程序:盼大牛解答!!不胜感激!!!
+ M) y# M2 e: A! a* v  @: L6 \3 s               clc
; [6 X) }  W! I# T( Jclear$ l% ^- @/ ?% T% @  Y5 w- L
nx=60;  o$ w. ]: Y# _9 W. d' C
ny=60; ! x9 s4 t( ?! }# h
%定义固定障碍物的状态
& {% z, ?) Y, l  D/ Q' Bz=zeros(nx,ny);
& D4 x  B& O% [; apeo=z;
/ y4 w7 e7 T1 W%peoNew=z;9 u( v0 G% `  k  e
wall=z;
: {$ c  v2 h7 ^wall(1,1:ny)=1;
$ \" S4 m3 K; B# U& E/ hwall(1:nx,1)=1;: C, p2 I8 @* `, G3 g  R
wall(1:nx,ny)=1;: S) x8 f, F* _
wall(nx,1:ny/2-2)=1;/ O5 t# e. Z8 |% R3 p
wall(nx,ny/2+2:ny)=1;
4 `8 s! V) m/ v" A7 P5 awall(nx/4:nx/4+1,ny/4:ny/4+1)=1;* v! w9 ?; o% `/ w
wall(3*nx/4:3*nx/4+1,ny/4:ny/4+1)=1;
+ J/ Q- z! M9 ?. z0 h) h/ dwall(nx/4:nx/4+1,3*ny/4:3*ny/4+1)=1;+ H4 t6 A6 v- k$ \) n
wall(3*nx/4:3*nx/4+1,3*ny/4:3*ny/4+1)=1;# F# v$ b6 E+ p: H( G
%定义人的状态* h$ r5 Y0 f* U# F
for x=1:1:12
) g+ T) @, [  S    for y=1:1:12( W) V( O- s$ U" |; z# T. Q, C
        x1=round(rand(1)*59+1);
; `% _, T; l0 s1 v2 v+ c: p        x2=round(rand(1)*59+1);
$ k  x( l  Y) B        if wall(x1,x2)~=13 q& n5 R0 Y( Z2 s6 K/ P  X
           peo(x1,x2)=1;3 ]/ T1 f# [, g2 F1 G. H6 H
       end8 V3 _" E2 N5 U5 @# i
    end
6 x1 ^2 ]1 k0 S+ _1 |/ H/ {5 ^- vend
" q7 n" N6 e4 _! c* E8 g: b%定义安全矩阵,指引人群运动
+ B  G/ }+ \8 H/ f0 isafe=zeros(60,60);
  b- X0 M$ x# h; ]) j/ E6 @safe(nx,ny/2+1)=0;# G- S! _/ M) C# |& F2 u5 v1 }
safe(nx,ny/2+2)=0;2 Q6 n: Q6 G" p4 i8 Q2 k! t
safe(nx,ny/2)=0;
( ?! _1 c' q: @' ~& |safe(nx,ny/2-1)=0;
6 r' o  \2 I: Z! e  {safe(nx,ny/2-2)=0;) e$ B; j' s- K7 A: k
for i=nx-1:-1:2
% Q8 u5 ^! a" {8 v8 N    for j=ny/2+3:-1:24 n5 p+ Y5 X  r7 L  [$ l/ c
        safe(i,ny/2)=safe(i+1,ny/2)+1;" ?3 ?6 V9 w2 c( A8 o8 z
        safe(i,ny/2-1)=safe(i+1,ny/2-1)+1;
0 ^5 E' w4 I3 e9 m! [        safe(i,ny/2-2)=safe(i+1,ny/2-2)+1;
6 c' S. {4 l. g, y7 x        safe(i,j)=safe(i,j+1)+1;
; c1 x9 e/ C1 g2 J    end( x+ ?3 d% U& n; k( X! t3 i
end# L9 O9 q4 K8 j; \
for i=nx-1:-1:2
# {( @0 d+ G3 Z! g) [% D& R# n    for j=ny/2+3:1:ny-13 Y$ I0 f& l9 n& S7 K
        safe(i,ny/2+1)=safe(i+1,ny/2+1)+1;( R5 `. x  g8 T5 Q1 m6 ?+ B! `2 W
        safe(i,ny/2+2)=safe(i+1,ny/2+2)+1;( V8 R7 X* U5 F
        safe(i,j)=safe(i,j-1)+1;. T5 D! [" [1 Y4 g
    end! J/ N6 x) B: T7 q) I2 u
end
2 F# i2 |; v0 j* \9 k        
& R( F! Q$ ~2 ?, v2 Timh=image(cat(3,z',peo',wall'));
9 Y% L0 e$ m- Sset(imh,'erasemode', 'none')5 z8 y* y- v" U4 p9 V2 Y* G
axis equal! u2 w! V& B: y1 K" ^
axis tight
, q, I% |6 V: Y' _%peoNew=peo;
3 L/ Y: F4 m7 P' S3 T2 B- Q: B) jxind=2:59;
# ~$ v* i) q9 j8 F4 R* Gyind=2:59;
7 ^# L' F+ z9 l  M' h  c/ w8 {2 d+ kfor m=1:1000
$ u# {$ V4 T: r! d% T1 `7 f8 L    if peo(xind,yind)==1) j+ N7 R% d; T- |3 Y; V) E
       if safe(xind,yind-1)<safe(xind,yind)&wall(xind,yind-1)~=17 ]5 j- g$ L' n
           peo(xind,yind-1)=1;4 A. V( }0 T# [# ?  i) c- Q! M
           peo(xind,yind)=0;
9 T. \2 Z7 P1 R$ \) [! \* z0 D       elseif safe(xind,yind+1)<safe(xind,yind)&wall(xind,yind+1)~=17 g$ i! i( w6 P' g
           peo(xind,yind+1)=1;
0 x) H& c3 j/ v" V           peo(xind,yind)=0;, _" g5 ]9 T0 d4 w
       elseif safe(xind-1,yind)<safe(xind,yind)&wall(xind-1,yind)~=1+ e5 w# r7 Y" G" \/ \) h$ e0 P
           peo(xind-1,yind)=1;5 o' l1 z5 l; N# {
           peo(xind,yind)=0;* u! Q& W7 ?& U1 f
       elseif  safe(xind+1,yind)<safe(xind,yind)&wall(xind+1,yind)~=1+ u2 Z9 V1 M/ o& `* r. N
           peo(xind+1,yind)=1;: b: f* k, g) M; ~
           peo(xind,yind)=0;8 P0 K3 \: `* G
       end
; }# X7 h% ?7 G, h0 y$ x9 p         peo=peoNew;9 N* ~& T2 l5 t& F; {) Q
         set(imh, 'cdata', cat(3,z',peo',wall') )
3 f% `/ K( C* X! `5 v         drawnow * o/ Q+ E# n3 |: k/ z- G& v' g
         end
/ P5 d2 _& q! o0 Xend
作者: etzhu    时间: 2009-2-5 21:32
实际上不用那么麻烦,1 l# o/ l* w  i; E, q* y
首先这个问题必然是满足 贪心 前提的,所以可以首先计算出每个人移动到门口的时间,然后排序,从小到大出门,考虑相等时的拥塞,就可以了。0 [$ a0 e9 J. u( R  J
当然,也有一点不足,这里没有考虑一个人挡在另一个人的路上的情况。
作者: suxpert    时间: 2009-2-5 21:38
up,友情帮顶。
作者: sphereballball    时间: 2009-2-5 21:46
现在是休息重要,别再动脑了
作者: lxsoft110    时间: 2009-2-5 22:08
2# etzhu
, j/ c! T$ s# b: p" v呵呵~兄弟。你还是没有说明我这个算法错误在哪里啊~
作者: 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