数学建模社区-数学中国

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

作者: lxsoft110    时间: 2009-2-5 21:21
标题: 谁能真正解决这个问题,送20个矩阵币
我编这段程序的目的是为了模拟火灾中,一个房间里面的人员的撤离情况,运行出来,蓝色的点是障碍物、黑色是可以空地、绿色代表人。5 Y: f0 n) s) b& c% n
我用的算法是:1.建立一个60*60的网格,并且定义边界和出口9 r0 v- P6 v. {8 N% l
                    2.给每个格子赋一个状态。(0,0,0)代表空地。(0,1,0)代表人,(0,0,1)代表障碍物。
( m! k3 r4 M7 e4 z                     3.规定每隔一段时间,计算人的状态(看前后左右,哪个格子离门口近,而且无障碍物),就向那个格子移动。
6 z: c; U5 X& U! o* @0 r                      4。看所有人离开房间需要多少时间。
# g2 w1 T1 m2 l" z下面附上MATLAB程序:盼大牛解答!!不胜感激!!!
: a6 V" C: d+ M5 |+ }2 m4 j; Q               clc# W+ Y3 O1 d9 _8 |) `% ]7 u7 @
clear: J* P. [9 h5 u' ]' ~
nx=60;
9 N' ^0 A. j( k, |$ B$ Bny=60;
; q$ {6 x2 V1 F: q8 ~6 B%定义固定障碍物的状态; D% A7 B: T7 `  q2 h$ Y6 q% e
z=zeros(nx,ny);
* u* E. E! J5 Z1 q5 [$ L3 f, Npeo=z;# Q: f3 f9 u# W/ `1 k6 Z" X3 A
%peoNew=z;
% o/ Y6 ]6 N8 kwall=z;
2 e6 L  v' N3 r7 i: }7 B( iwall(1,1:ny)=1;
- n1 m2 h2 u1 Twall(1:nx,1)=1;" L  T+ V( F: I9 O' ?
wall(1:nx,ny)=1;
( |  Q: P% ~+ v5 B+ l1 @7 b2 dwall(nx,1:ny/2-2)=1;
) K. I  Z# W0 v6 z2 Q" Vwall(nx,ny/2+2:ny)=1;
6 N, Q! H+ l4 u0 q5 r( g; J( ywall(nx/4:nx/4+1,ny/4:ny/4+1)=1;
1 o; z$ q8 G" A& J; B/ X4 Iwall(3*nx/4:3*nx/4+1,ny/4:ny/4+1)=1;
1 \+ I, F! x! W/ @; p' r4 U4 ywall(nx/4:nx/4+1,3*ny/4:3*ny/4+1)=1;
2 T; }9 a1 @, b* G, K  g6 G! I- ewall(3*nx/4:3*nx/4+1,3*ny/4:3*ny/4+1)=1;( ^# f5 A! i% H; x& O; G
%定义人的状态4 i( O* T2 ]0 A2 ^
for x=1:1:125 F) ]$ @. y; X6 i. ]% J, F
    for y=1:1:12) C' _! z6 r$ s& l" V9 V# D. q5 R8 z& u
        x1=round(rand(1)*59+1);6 }$ K) F* l9 _# f2 v: A  r. f" V
        x2=round(rand(1)*59+1);9 J6 F# I  U0 _, s. N7 n
        if wall(x1,x2)~=1
: M8 h& ^' \: q3 ?           peo(x1,x2)=1;( `* }+ p; b5 i6 m9 D3 u0 v
       end
8 c5 ]1 W; w2 d    end
9 K& P) L1 a; h9 U0 {end. v$ X' a. [' o
%定义安全矩阵,指引人群运动
3 _* [3 p/ d- Z' e2 W- fsafe=zeros(60,60);) B; J$ r# S  C- Z* r4 s$ N, }
safe(nx,ny/2+1)=0;7 \* G! W$ U' v3 A5 r! |
safe(nx,ny/2+2)=0;' _" [. F6 }  e
safe(nx,ny/2)=0;
4 @  ]" X  y) P  D( W% isafe(nx,ny/2-1)=0;: x/ J$ j! }. x+ K. O; {
safe(nx,ny/2-2)=0;+ W& m3 f% m+ e% P) i
for i=nx-1:-1:2; t% r- n- O# T* E/ u; j0 N8 \+ M
    for j=ny/2+3:-1:2
- I) d* \* ]1 ?+ n; m        safe(i,ny/2)=safe(i+1,ny/2)+1;
0 r2 I" g: \% X; s( B- R" b        safe(i,ny/2-1)=safe(i+1,ny/2-1)+1;! {% b8 W" E+ H& I# `& d6 W! F
        safe(i,ny/2-2)=safe(i+1,ny/2-2)+1;
& t; p" U. \. ]8 r        safe(i,j)=safe(i,j+1)+1;
* c; D3 {5 `# A) ~/ r7 Y    end; C6 n5 J% F! S0 O, m3 [
end
& j8 q9 a0 D" T+ {8 x9 nfor i=nx-1:-1:2
1 H5 F& d7 Q; p+ h: D1 C/ q    for j=ny/2+3:1:ny-1
8 J9 s6 _5 e' R  l        safe(i,ny/2+1)=safe(i+1,ny/2+1)+1;
2 r6 H1 ]' g$ E/ `( x  Z/ `        safe(i,ny/2+2)=safe(i+1,ny/2+2)+1;
8 A3 H* Z7 K$ J& J( K        safe(i,j)=safe(i,j-1)+1;* ~. A, c* D8 X
    end. R; }9 |; }3 r, Z8 N
end$ v& ~2 d& g. P. N
        
& b* v0 V, A8 B4 B" @) p5 r! _6 Fimh=image(cat(3,z',peo',wall'));! p+ |" z; J  r6 g
set(imh,'erasemode', 'none')) A" X$ {. ?  E* q! x( ~
axis equal2 c# B. G7 }' e- |0 Y# g$ X
axis tight- b; L- j, Q0 S( P* i3 s5 Q) L  X
%peoNew=peo;1 R1 c& D7 T& g1 g# M
xind=2:59;( e" @7 t/ J: u# T: _
yind=2:59;
- g" Z5 J3 I& g; @/ b& s1 Bfor m=1:1000$ @% ?* f7 z3 r3 T
    if peo(xind,yind)==16 F3 A$ K7 L7 f2 A& C/ J
       if safe(xind,yind-1)<safe(xind,yind)&wall(xind,yind-1)~=17 S8 I, P. {- ^! T4 ]& o
           peo(xind,yind-1)=1;
3 t2 d7 s* |5 T- B' K) j' h3 B, Q* f5 `           peo(xind,yind)=0;
# i. O4 T0 g( w( I( z& K3 o       elseif safe(xind,yind+1)<safe(xind,yind)&wall(xind,yind+1)~=1
, P& d- `5 [; D8 b4 M5 @& x           peo(xind,yind+1)=1;
. Z9 O. k  V# v8 @- h           peo(xind,yind)=0;
% B' K* J  I8 u0 K4 ?9 R# a       elseif safe(xind-1,yind)<safe(xind,yind)&wall(xind-1,yind)~=1
+ z1 O3 w" Z' {' x7 L" ]           peo(xind-1,yind)=1;
( P+ ]  r, i! r           peo(xind,yind)=0;( H) }" p  C" g7 C6 j- \& p! v2 L
       elseif  safe(xind+1,yind)<safe(xind,yind)&wall(xind+1,yind)~=1
3 d/ J1 d) w% e           peo(xind+1,yind)=1;
* ~. A* d" [9 a" ~! C           peo(xind,yind)=0;( ?! J4 {' H7 u" j% K3 f" x
       end
3 O/ w7 z2 i5 H5 S- v; K6 K3 }  N         peo=peoNew;+ Q! a+ ~5 `! o6 U, L
         set(imh, 'cdata', cat(3,z',peo',wall') )5 V# i& c6 [) H8 `- R
         drawnow $ M; j$ I$ a5 @
         end
: O7 t6 K. Z8 j- @* c7 |* O2 dend
作者: etzhu    时间: 2009-2-5 21:32
实际上不用那么麻烦,
6 u1 `/ B% H$ t: S+ j" Z首先这个问题必然是满足 贪心 前提的,所以可以首先计算出每个人移动到门口的时间,然后排序,从小到大出门,考虑相等时的拥塞,就可以了。! a/ X4 \$ E/ a& t, H$ L$ M3 _
当然,也有一点不足,这里没有考虑一个人挡在另一个人的路上的情况。
作者: suxpert    时间: 2009-2-5 21:38
up,友情帮顶。
作者: sphereballball    时间: 2009-2-5 21:46
现在是休息重要,别再动脑了
作者: lxsoft110    时间: 2009-2-5 22:08
2# etzhu + [  {" D+ Q1 ^! A$ A- T
呵呵~兄弟。你还是没有说明我这个算法错误在哪里啊~
作者: 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