数学建模社区-数学中国

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

作者: lxsoft110    时间: 2009-2-5 21:21
标题: 谁能真正解决这个问题,送20个矩阵币
我编这段程序的目的是为了模拟火灾中,一个房间里面的人员的撤离情况,运行出来,蓝色的点是障碍物、黑色是可以空地、绿色代表人。
; B' [) W- U  O我用的算法是:1.建立一个60*60的网格,并且定义边界和出口/ ?/ y6 o* ]5 ]9 T% q; t
                    2.给每个格子赋一个状态。(0,0,0)代表空地。(0,1,0)代表人,(0,0,1)代表障碍物。9 y  E& Z7 E  i  w5 t
                     3.规定每隔一段时间,计算人的状态(看前后左右,哪个格子离门口近,而且无障碍物),就向那个格子移动。
2 d! V, {% q" x                      4。看所有人离开房间需要多少时间。% M: m; F0 L0 b  K7 r
下面附上MATLAB程序:盼大牛解答!!不胜感激!!!
2 r. ~" k+ `/ @* [               clc$ g/ S2 g( V, ]) A( B1 R* x7 B
clear
4 k4 f+ u3 t. A# i4 Y. xnx=60;
4 @9 D4 Y0 j/ Q/ R: e, N( s% c. `ny=60;
& H8 z2 ]8 Q3 G, H5 l%定义固定障碍物的状态( j/ ?- D4 |$ H, ?( X3 A( j
z=zeros(nx,ny);
- g- e" x5 T9 U4 zpeo=z;
: l; I: P& [0 z6 Y) R* b7 Z%peoNew=z;
8 e: q" U5 Z+ |2 Z5 z; I$ k6 J7 rwall=z;
* G7 S" F: \$ Q, B0 S% @wall(1,1:ny)=1;
6 n2 y2 q! F( L6 M' ~8 Z' qwall(1:nx,1)=1;
8 R& J5 }0 V* b' \% m$ ?wall(1:nx,ny)=1;4 a( {% G/ S- f0 o5 q' @8 O
wall(nx,1:ny/2-2)=1;
/ J+ P! {7 K/ S4 c0 hwall(nx,ny/2+2:ny)=1;0 X- e7 V' P8 `* t, K% |% N
wall(nx/4:nx/4+1,ny/4:ny/4+1)=1;
7 e* n, s3 u) [, kwall(3*nx/4:3*nx/4+1,ny/4:ny/4+1)=1;; D/ _1 o3 ~3 U$ H& h
wall(nx/4:nx/4+1,3*ny/4:3*ny/4+1)=1;
& ~7 T  u* }: M& ?" ?* Owall(3*nx/4:3*nx/4+1,3*ny/4:3*ny/4+1)=1;' u% W7 k2 T9 T+ S9 d: m" n
%定义人的状态
4 f) c, v# b2 i7 J+ @for x=1:1:12* d" u; r) s! y
    for y=1:1:125 k* g, k7 S+ A+ s) d# d3 u% R9 Q
        x1=round(rand(1)*59+1);
$ I. [" I4 P2 w! O7 C; J        x2=round(rand(1)*59+1);
" O# S0 A0 e6 {; v% L! c        if wall(x1,x2)~=1% a/ {$ J1 U" l
           peo(x1,x2)=1;/ Y8 W0 J# ~6 }! n2 I* k% b+ K
       end
1 A) |, P3 P  C! E: J    end  w6 v+ z+ ^( f: [& x0 d
end
7 {) g3 `7 u3 t4 _) z! R' ^8 L%定义安全矩阵,指引人群运动& X, _( _2 M6 P& V" b  i& [
safe=zeros(60,60);  `; [' G% r) M8 x" {0 w
safe(nx,ny/2+1)=0;
6 ^! o* v; o! O' M9 Osafe(nx,ny/2+2)=0;
* C; t' m1 u, |safe(nx,ny/2)=0;
4 r/ M3 U) y# T3 C+ {$ Usafe(nx,ny/2-1)=0;! o2 }9 y9 h; w( V# m
safe(nx,ny/2-2)=0;
. z$ d' E* _/ t8 {' G, ^; Afor i=nx-1:-1:2
+ F3 R, @4 U% R    for j=ny/2+3:-1:29 ~/ q4 |; R- G; o- m% [( X# W+ K
        safe(i,ny/2)=safe(i+1,ny/2)+1;% o. b9 |/ y7 e; r% R
        safe(i,ny/2-1)=safe(i+1,ny/2-1)+1;  k  l4 z) M) W/ H
        safe(i,ny/2-2)=safe(i+1,ny/2-2)+1;: b" j2 _4 v( t+ B6 d$ I
        safe(i,j)=safe(i,j+1)+1;
0 h; G! c3 f- G1 @+ g0 y) t7 i    end: V) E3 Q( q4 R; S3 F+ S5 b1 o
end
2 E3 ~; U" a$ ^, ^2 i7 n+ ifor i=nx-1:-1:2( i% x1 f1 A; Q2 T7 d
    for j=ny/2+3:1:ny-13 ~) o- _6 z' V; `
        safe(i,ny/2+1)=safe(i+1,ny/2+1)+1;' p! ^5 f. s$ k( x7 }$ k: R
        safe(i,ny/2+2)=safe(i+1,ny/2+2)+1;# v; D& X; Y9 M8 P+ h  e/ |; _
        safe(i,j)=safe(i,j-1)+1;
; q* {3 a  V: U/ p- s; b- |' j4 R    end
8 G4 o2 Z; D! V7 K5 Y+ pend% O6 q) ?+ \0 o( s
        
9 r8 C/ h1 X- _- ?5 ?) y) wimh=image(cat(3,z',peo',wall'));
- ?+ B/ h: R5 ^( p4 K4 ?; t9 r  }. yset(imh,'erasemode', 'none'); x9 s8 ~" O# j+ F% `. z
axis equal
. v: O9 I& B5 U7 R( @1 Gaxis tight
5 M. R0 l% s) m  w; L+ a%peoNew=peo;
/ H+ s7 r+ m2 @7 c  ]+ V) \3 Dxind=2:59;9 O. |6 W% X' i) |5 v; S
yind=2:59;) x  w& ~9 C5 u& S4 u
for m=1:1000
. b" j( ?' H* i  k0 O3 |& n    if peo(xind,yind)==16 R4 d1 s0 I4 A( p9 T" P8 g
       if safe(xind,yind-1)<safe(xind,yind)&wall(xind,yind-1)~=1+ q0 a2 F/ [6 j$ T' B( p" h6 P
           peo(xind,yind-1)=1;
8 {+ \0 S) b* d, ^/ u           peo(xind,yind)=0;
! A! N/ d0 r! J* m  i& T" E( H       elseif safe(xind,yind+1)<safe(xind,yind)&wall(xind,yind+1)~=1, U7 |; F6 S( O& s4 f5 p
           peo(xind,yind+1)=1;
0 c% `; v' P* C& _& O9 Z" U           peo(xind,yind)=0;9 p- J0 ~0 j7 b  m4 x9 b
       elseif safe(xind-1,yind)<safe(xind,yind)&wall(xind-1,yind)~=1/ w9 Z( f, T4 g
           peo(xind-1,yind)=1;; b3 I9 t; }" k. [+ f
           peo(xind,yind)=0;7 b, {, p  k( h- C5 S8 b
       elseif  safe(xind+1,yind)<safe(xind,yind)&wall(xind+1,yind)~=1
. Q- Y6 M( t5 H/ P! O           peo(xind+1,yind)=1;) M( c; v  @; Q
           peo(xind,yind)=0;1 j3 Y6 x0 y, U. N, S
       end
/ N" a0 B% y2 M- X         peo=peoNew;
3 h" C2 W% `/ Y. k- `         set(imh, 'cdata', cat(3,z',peo',wall') )
# m/ i, W! u  _  V0 Y- R9 `( m         drawnow : b* p9 ~0 t  m; @
         end
/ }# v2 L" r& ?  N6 _end
作者: etzhu    时间: 2009-2-5 21:32
实际上不用那么麻烦,
; R; j+ \9 a; Q8 z9 S+ A7 e$ R2 w首先这个问题必然是满足 贪心 前提的,所以可以首先计算出每个人移动到门口的时间,然后排序,从小到大出门,考虑相等时的拥塞,就可以了。' H6 l/ Z; w6 s* F, R3 P; ?& s+ W
当然,也有一点不足,这里没有考虑一个人挡在另一个人的路上的情况。
作者: suxpert    时间: 2009-2-5 21:38
up,友情帮顶。
作者: sphereballball    时间: 2009-2-5 21:46
现在是休息重要,别再动脑了
作者: lxsoft110    时间: 2009-2-5 22:08
2# etzhu
, }5 ^2 D& y9 s5 \; w4 o4 s  a0 u- p! w呵呵~兄弟。你还是没有说明我这个算法错误在哪里啊~
作者: 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