数学建模社区-数学中国

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

作者: lxsoft110    时间: 2009-2-5 21:21
标题: 谁能真正解决这个问题,送20个矩阵币
我编这段程序的目的是为了模拟火灾中,一个房间里面的人员的撤离情况,运行出来,蓝色的点是障碍物、黑色是可以空地、绿色代表人。- I/ \" K+ r7 t$ H2 \3 }* w
我用的算法是:1.建立一个60*60的网格,并且定义边界和出口; Y2 M* |6 |( H6 _
                    2.给每个格子赋一个状态。(0,0,0)代表空地。(0,1,0)代表人,(0,0,1)代表障碍物。
  ~9 O# H  s4 {6 @+ Q. s                     3.规定每隔一段时间,计算人的状态(看前后左右,哪个格子离门口近,而且无障碍物),就向那个格子移动。
; f0 w% ?# [" p, p                      4。看所有人离开房间需要多少时间。
; }# `1 E" S4 u9 M下面附上MATLAB程序:盼大牛解答!!不胜感激!!!
7 _6 C1 D- m( Y: h0 w1 c  ^               clc
. N+ `1 h4 d7 k: s3 J9 pclear
; M9 b$ y) t& h8 u1 _: L& Hnx=60;
( U# n) G( l- eny=60; # G7 r  V. C9 D0 m4 z# ]5 g
%定义固定障碍物的状态
7 i% G$ j4 s- ^3 X3 h1 vz=zeros(nx,ny);
9 d* F: R+ |2 A( J" m; k: `1 epeo=z;
" h- H. Y' J" W9 R9 g%peoNew=z;! f; b) K7 }1 h2 B: v% ~
wall=z;8 P: m  |9 f8 k( Z* Z: Y2 v3 [
wall(1,1:ny)=1;+ g9 l4 f: I# Y! C, Y+ y
wall(1:nx,1)=1;
( m$ p( F1 M0 \. G- A. b, ^wall(1:nx,ny)=1;# x, n6 @% y  F
wall(nx,1:ny/2-2)=1;- z. e  r. u2 B: g
wall(nx,ny/2+2:ny)=1;$ I8 |' r  P4 w7 s8 S; D
wall(nx/4:nx/4+1,ny/4:ny/4+1)=1;
) j: Q7 Z8 L7 q, Q1 u, u8 ?wall(3*nx/4:3*nx/4+1,ny/4:ny/4+1)=1;
& F6 m( ^  e+ I- ]- ewall(nx/4:nx/4+1,3*ny/4:3*ny/4+1)=1;" k8 \7 G& E. b1 N* {
wall(3*nx/4:3*nx/4+1,3*ny/4:3*ny/4+1)=1;; W% t( {) ^' V' p1 |+ u
%定义人的状态% `0 |# \+ o9 t) z: u  A
for x=1:1:12, P: J4 x3 [- ?: P7 f$ m
    for y=1:1:12
  z- |: V7 k! s# m9 ~: V  A7 R* c        x1=round(rand(1)*59+1);
' @1 B* |4 L: F! X/ R7 B        x2=round(rand(1)*59+1);
4 h) W. m; t; H4 J# o2 Q        if wall(x1,x2)~=1
- u. P& K$ V$ p: @# R# I           peo(x1,x2)=1;
" S/ X8 t  ?2 t; Z6 a       end& y. c9 a& q. s2 v
    end
( V# @; M0 U) T2 g" Aend* r; E2 v3 K8 N, t6 @- O) P" [$ q, d
%定义安全矩阵,指引人群运动! h, M; x. [/ M% ?2 Q3 a% P
safe=zeros(60,60);
0 S! k1 V' P0 u% D* o/ wsafe(nx,ny/2+1)=0;8 T, c- ?' m5 v. X* s
safe(nx,ny/2+2)=0;1 L2 H2 ~0 \4 ?4 c2 g+ t
safe(nx,ny/2)=0;0 W& N% u% s& B- \* }1 K2 C3 ]
safe(nx,ny/2-1)=0;
( \( @3 e+ U' w0 Q& m2 p' asafe(nx,ny/2-2)=0;
6 q: z& l8 U5 |0 f5 g4 e( vfor i=nx-1:-1:29 m8 M& O( U  [4 {" `& g* h4 M2 c
    for j=ny/2+3:-1:2
, p- c; o7 ]7 r) H5 ?        safe(i,ny/2)=safe(i+1,ny/2)+1;
1 e$ O( z1 Q" T( z/ k7 N        safe(i,ny/2-1)=safe(i+1,ny/2-1)+1;5 b+ C  _, m6 h* d: z. ]" u8 v
        safe(i,ny/2-2)=safe(i+1,ny/2-2)+1;* W& m0 `/ W5 Q: U" z0 N
        safe(i,j)=safe(i,j+1)+1;. w. v/ {+ G  i) r
    end
( V! q4 W& R1 Y: \# J  Nend
3 {' V) I# V8 ?% z0 Rfor i=nx-1:-1:2
7 f. S8 _* ^8 m    for j=ny/2+3:1:ny-1* E- S" \1 O# D2 S
        safe(i,ny/2+1)=safe(i+1,ny/2+1)+1;/ r5 h* p1 J7 D
        safe(i,ny/2+2)=safe(i+1,ny/2+2)+1;0 `1 \3 H/ i3 }4 Q' }+ E! l+ I
        safe(i,j)=safe(i,j-1)+1;
& S3 `! y+ `. P  K    end! U" _& l) U7 z+ u2 m& P% q
end# n- u  H# m/ h, P/ s
        . t2 A  _% Z" b6 Y1 K2 X
imh=image(cat(3,z',peo',wall'));- q4 O8 F! L9 w, H  y) M3 [
set(imh,'erasemode', 'none')8 ~) n0 T: Q. E3 s( Y
axis equal
) Z, m+ }, N" N6 R0 baxis tight! o6 q6 K" W, C7 u
%peoNew=peo;, h- Z' m/ L) T: l6 B& V% J
xind=2:59;
! W0 r" W: F( s8 ayind=2:59;
+ m% W) y; i* hfor m=1:1000
3 V/ u1 v/ d" z    if peo(xind,yind)==1. Z# |) B; O: g7 S2 F
       if safe(xind,yind-1)<safe(xind,yind)&wall(xind,yind-1)~=1
3 F. H2 f5 m9 q8 H+ U) m* x* o           peo(xind,yind-1)=1;: O* P7 R9 s5 x2 y- Y2 R4 z* r7 w1 _
           peo(xind,yind)=0;
& T% J7 E% Y; j/ m1 |1 @7 J       elseif safe(xind,yind+1)<safe(xind,yind)&wall(xind,yind+1)~=1* n, I+ ~7 U* r; }
           peo(xind,yind+1)=1;
' k3 S" R3 O* W* {, R* M           peo(xind,yind)=0;6 }7 w: v% p; W( p9 A
       elseif safe(xind-1,yind)<safe(xind,yind)&wall(xind-1,yind)~=1- ~' a4 W) M5 b
           peo(xind-1,yind)=1;
, C- F3 I7 h0 f3 b6 [) c% |8 C           peo(xind,yind)=0;
6 d+ c! a2 C( `/ O# V; V* N       elseif  safe(xind+1,yind)<safe(xind,yind)&wall(xind+1,yind)~=1
  W& a* G' _' \' b9 l8 E3 d           peo(xind+1,yind)=1;3 x$ K0 f$ f2 a: R; @
           peo(xind,yind)=0;
. p8 |6 q0 \# x) X+ p       end
# }) u* U" d# l. B5 L. m         peo=peoNew;2 J% I1 f6 Z4 y) b" m3 q! C
         set(imh, 'cdata', cat(3,z',peo',wall') )
8 Z0 d, k0 R) z3 u% e" E  V9 T         drawnow
" j( S$ @! v) u; R         end, ~3 r% D' A( n$ ^  Y8 L/ S! f
end
作者: etzhu    时间: 2009-2-5 21:32
实际上不用那么麻烦,
7 O; s" U# [# I6 s9 Q首先这个问题必然是满足 贪心 前提的,所以可以首先计算出每个人移动到门口的时间,然后排序,从小到大出门,考虑相等时的拥塞,就可以了。
2 \9 ~: B2 o" Y! F; E, e当然,也有一点不足,这里没有考虑一个人挡在另一个人的路上的情况。
作者: suxpert    时间: 2009-2-5 21:38
up,友情帮顶。
作者: sphereballball    时间: 2009-2-5 21:46
现在是休息重要,别再动脑了
作者: lxsoft110    时间: 2009-2-5 22:08
2# etzhu
$ a2 k% ]7 {; _' l, e1 c呵呵~兄弟。你还是没有说明我这个算法错误在哪里啊~
作者: 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