数学建模社区-数学中国

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

作者: lxsoft110    时间: 2009-2-5 21:21
标题: 谁能真正解决这个问题,送20个矩阵币
我编这段程序的目的是为了模拟火灾中,一个房间里面的人员的撤离情况,运行出来,蓝色的点是障碍物、黑色是可以空地、绿色代表人。2 I' M  v6 r, n  M$ ?
我用的算法是:1.建立一个60*60的网格,并且定义边界和出口0 q! |( s/ E2 b( t5 S4 p
                    2.给每个格子赋一个状态。(0,0,0)代表空地。(0,1,0)代表人,(0,0,1)代表障碍物。
! M: f" G+ _$ ~, I0 g                     3.规定每隔一段时间,计算人的状态(看前后左右,哪个格子离门口近,而且无障碍物),就向那个格子移动。& z/ y4 _/ I6 U7 {
                      4。看所有人离开房间需要多少时间。; U+ r! }+ y7 q- h! w
下面附上MATLAB程序:盼大牛解答!!不胜感激!!!2 _. O4 {' T3 b5 h: N
               clc
. T+ |) X7 ?1 hclear- S- F' i: S0 X+ Q4 S
nx=60;+ ~& g" j. C# Z) m, }% R# k- L
ny=60; * F) W" ^6 V; h
%定义固定障碍物的状态9 ^: d' M1 A% h- o2 {" W2 D
z=zeros(nx,ny);
, f, E1 ^( o9 a) ^3 }; G( ~) y+ rpeo=z;' h8 X9 G% s; S! ~& k6 M
%peoNew=z;% Y% }+ I' w* Z4 x$ D
wall=z;' I% S& P  N, H1 ~) ^0 K& d
wall(1,1:ny)=1;
) z6 _. h- E& s3 o1 `) H, @wall(1:nx,1)=1;
6 g  Q3 @: z8 {8 x( j: Kwall(1:nx,ny)=1;
4 r& A0 O  g2 _* v8 T' qwall(nx,1:ny/2-2)=1;
" D  d& E; \# e2 A2 r0 z8 Pwall(nx,ny/2+2:ny)=1;8 t0 w1 z: ^4 ~; P) I9 a
wall(nx/4:nx/4+1,ny/4:ny/4+1)=1;2 M3 I. `1 S& }1 }5 O) O8 N3 O5 f
wall(3*nx/4:3*nx/4+1,ny/4:ny/4+1)=1;
) I5 S8 c. U/ e( nwall(nx/4:nx/4+1,3*ny/4:3*ny/4+1)=1;% {  B# d5 B6 l8 B! E4 n5 `) w
wall(3*nx/4:3*nx/4+1,3*ny/4:3*ny/4+1)=1;
: D: x' w9 D3 L! y( F%定义人的状态
: N# s% D0 r3 ?# R$ Q% _for x=1:1:12
4 _; f: G0 V# T$ k  V4 h, f    for y=1:1:128 E2 R. H7 ~# O& A4 ~; }2 M
        x1=round(rand(1)*59+1);
- H% S. c4 J$ E+ }/ N9 l) ]        x2=round(rand(1)*59+1);7 x. s* l. f, |, o( M) }8 Y
        if wall(x1,x2)~=1
) X9 D: F, A* G7 ~$ C* @+ L           peo(x1,x2)=1;
; G" e1 M* e' O% ~, o       end
' E9 b' @4 E: r- F0 K) z: m+ r    end
# }# O: K$ ?& O* y) R$ aend
$ r7 k* m  N. L4 M+ b%定义安全矩阵,指引人群运动
5 }/ u2 a! b: m7 X/ a) k7 hsafe=zeros(60,60);) {0 t1 i8 Z, P+ _- Z! h
safe(nx,ny/2+1)=0;
; E& ?6 S' A+ g! V* zsafe(nx,ny/2+2)=0;. u* ~( R2 T8 y% Q8 M/ \* e: O
safe(nx,ny/2)=0;& v+ a( L) C3 {: |2 n. K1 X: T$ ?7 |
safe(nx,ny/2-1)=0;. k1 l7 M# K6 q
safe(nx,ny/2-2)=0;4 `- _' }! z4 a- L; ]
for i=nx-1:-1:2
) a$ h5 Y% m% L# h: e  |% B    for j=ny/2+3:-1:24 {  G, e- Q% |; J$ B5 ^7 J6 V+ i' M
        safe(i,ny/2)=safe(i+1,ny/2)+1;/ {- |4 v$ o: ~# j3 s) c
        safe(i,ny/2-1)=safe(i+1,ny/2-1)+1;) H& s4 e* y. A7 H
        safe(i,ny/2-2)=safe(i+1,ny/2-2)+1;
) @' p6 i& l/ I1 q7 l        safe(i,j)=safe(i,j+1)+1;
4 v2 c) n' j$ L9 D* K% s    end
0 O+ d: ], c7 K# iend
' g; a1 W4 h$ i5 b" Hfor i=nx-1:-1:2
0 M8 ^9 T" M2 ~- \) B4 v    for j=ny/2+3:1:ny-1
* o/ ]! d- M# F7 G8 E- c  o        safe(i,ny/2+1)=safe(i+1,ny/2+1)+1;. L4 ^& h' K' m; E; {
        safe(i,ny/2+2)=safe(i+1,ny/2+2)+1;- W7 A: z. B/ K
        safe(i,j)=safe(i,j-1)+1;/ @% m1 X! A6 F6 R% c  J
    end: J# b, d( _" o: _' W1 g
end6 n3 M% }/ a7 l3 A& u( e; K# `
        % i% F, b8 s! z! A
imh=image(cat(3,z',peo',wall'));
' J( W# a! W: I) I' mset(imh,'erasemode', 'none')
5 }% u9 ~2 B9 N6 [( f% R3 r0 w5 f9 Paxis equal
4 Z( F  k4 d3 B( E4 L' i5 Laxis tight
) g4 I# h2 R1 I0 D0 _' z0 m6 y4 J%peoNew=peo;
: I, O4 q1 W1 ]. N: ]xind=2:59;
6 b: g! y" w% j% ~: tyind=2:59;
0 U! q) u  K* v  p8 [* k/ U+ E, v+ p+ jfor m=1:1000
4 z7 ^2 j( l/ z8 Z# f3 J: D  V    if peo(xind,yind)==1$ O2 i4 q$ U. C8 W4 R
       if safe(xind,yind-1)<safe(xind,yind)&wall(xind,yind-1)~=1
. e  d1 c8 i6 Q6 w           peo(xind,yind-1)=1;
4 r9 B" v2 A7 p3 C& W           peo(xind,yind)=0;
. r1 @! c5 m/ j) }+ E/ e, A       elseif safe(xind,yind+1)<safe(xind,yind)&wall(xind,yind+1)~=1$ e; A! E! S9 @4 l# O, e
           peo(xind,yind+1)=1;
9 M: |' S# v5 j+ N9 j           peo(xind,yind)=0;
* B1 ~/ S$ g  `$ w       elseif safe(xind-1,yind)<safe(xind,yind)&wall(xind-1,yind)~=1
0 z. u7 P" e! c. ]- {* r9 G           peo(xind-1,yind)=1;+ G2 ^& H4 P& r: S6 P
           peo(xind,yind)=0;' T; a& T. N) l' E0 n! @' `8 ^
       elseif  safe(xind+1,yind)<safe(xind,yind)&wall(xind+1,yind)~=1
) t/ V3 K9 ~0 B- R           peo(xind+1,yind)=1;
# v/ \/ [, t! M7 v( w3 }- P- j           peo(xind,yind)=0;) \9 V) s$ g6 L6 L: j+ f
       end
* N" h3 Q$ l; Y, x; J# e+ [; v         peo=peoNew;
; G3 i/ M$ e( g+ U% `+ I- k         set(imh, 'cdata', cat(3,z',peo',wall') )+ s' J+ J5 d, G$ u7 c! A
         drawnow
0 e; }  H' i( N: d, i         end7 z, m# i- |! n
end
作者: etzhu    时间: 2009-2-5 21:32
实际上不用那么麻烦,: s; ?6 `( L7 e- @8 n- x- E. ?
首先这个问题必然是满足 贪心 前提的,所以可以首先计算出每个人移动到门口的时间,然后排序,从小到大出门,考虑相等时的拥塞,就可以了。3 U+ T* L- I. P
当然,也有一点不足,这里没有考虑一个人挡在另一个人的路上的情况。
作者: suxpert    时间: 2009-2-5 21:38
up,友情帮顶。
作者: sphereballball    时间: 2009-2-5 21:46
现在是休息重要,别再动脑了
作者: lxsoft110    时间: 2009-2-5 22:08
2# etzhu , Q) a: o9 V9 J2 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