lxsoft110 发表于 2009-2-5 21:21

谁能真正解决这个问题,送20个矩阵币

我编这段程序的目的是为了模拟火灾中,一个房间里面的人员的撤离情况,运行出来,蓝色的点是障碍物、黑色是可以空地、绿色代表人。
我用的算法是:1.建立一个60*60的网格,并且定义边界和出口
                    2.给每个格子赋一个状态。(0,0,0)代表空地。(0,1,0)代表人,(0,0,1)代表障碍物。
                     3.规定每隔一段时间,计算人的状态(看前后左右,哪个格子离门口近,而且无障碍物),就向那个格子移动。
                      4。看所有人离开房间需要多少时间。
下面附上MATLAB程序:盼大牛解答!!不胜感激!!!
               clc
clear
nx=60;
ny=60;
%定义固定障碍物的状态
z=zeros(nx,ny);
peo=z;
%peoNew=z;
wall=z;
wall(1,1:ny)=1;
wall(1:nx,1)=1;
wall(1:nx,ny)=1;
wall(nx,1:ny/2-2)=1;
wall(nx,ny/2+2:ny)=1;
wall(nx/4:nx/4+1,ny/4:ny/4+1)=1;
wall(3*nx/4:3*nx/4+1,ny/4:ny/4+1)=1;
wall(nx/4:nx/4+1,3*ny/4:3*ny/4+1)=1;
wall(3*nx/4:3*nx/4+1,3*ny/4:3*ny/4+1)=1;
%定义人的状态
for x=1:1:12
    for y=1:1:12
        x1=round(rand(1)*59+1);
        x2=round(rand(1)*59+1);
        if wall(x1,x2)~=1
           peo(x1,x2)=1;
       end
    end
end
%定义安全矩阵,指引人群运动
safe=zeros(60,60);
safe(nx,ny/2+1)=0;
safe(nx,ny/2+2)=0;
safe(nx,ny/2)=0;
safe(nx,ny/2-1)=0;
safe(nx,ny/2-2)=0;
for i=nx-1:-1:2
    for j=ny/2+3:-1:2
        safe(i,ny/2)=safe(i+1,ny/2)+1;
        safe(i,ny/2-1)=safe(i+1,ny/2-1)+1;
        safe(i,ny/2-2)=safe(i+1,ny/2-2)+1;
        safe(i,j)=safe(i,j+1)+1;
    end
end
for i=nx-1:-1:2
    for j=ny/2+3:1:ny-1
        safe(i,ny/2+1)=safe(i+1,ny/2+1)+1;
        safe(i,ny/2+2)=safe(i+1,ny/2+2)+1;
        safe(i,j)=safe(i,j-1)+1;
    end
end
        
imh=image(cat(3,z',peo',wall'));
set(imh,'erasemode', 'none')
axis equal
axis tight
%peoNew=peo;
xind=2:59;
yind=2:59;
for m=1:1000
    if peo(xind,yind)==1
       if safe(xind,yind-1)<safe(xind,yind)&wall(xind,yind-1)~=1
           peo(xind,yind-1)=1;
           peo(xind,yind)=0;
       elseif safe(xind,yind+1)<safe(xind,yind)&wall(xind,yind+1)~=1
           peo(xind,yind+1)=1;
           peo(xind,yind)=0;
       elseif safe(xind-1,yind)<safe(xind,yind)&wall(xind-1,yind)~=1
           peo(xind-1,yind)=1;
           peo(xind,yind)=0;
       elseif  safe(xind+1,yind)<safe(xind,yind)&wall(xind+1,yind)~=1
           peo(xind+1,yind)=1;
           peo(xind,yind)=0;
       end
         peo=peoNew;
         set(imh, 'cdata', cat(3,z',peo',wall') )
         drawnow
         end
end

etzhu 发表于 2009-2-5 21:32

实际上不用那么麻烦,
首先这个问题必然是满足 贪心 前提的,所以可以首先计算出每个人移动到门口的时间,然后排序,从小到大出门,考虑相等时的拥塞,就可以了。
当然,也有一点不足,这里没有考虑一个人挡在另一个人的路上的情况。

suxpert 发表于 2009-2-5 21:38

up,友情帮顶。

sphereballball 发表于 2009-2-5 21:46

现在是休息重要,别再动脑了

lxsoft110 发表于 2009-2-5 22:08

2# etzhu
呵呵~兄弟。你还是没有说明我这个算法错误在哪里啊~

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,友情帮顶。
页: [1]
查看完整版本: 谁能真正解决这个问题,送20个矩阵币