function [D,Dp]=GP1(D)
A=zeros(29,22);%生成一个29行22列的零矩阵,并且处理好后的A矩阵将表示每个元胞对门口的渴望程度
B=ones(25,22);%生成25行22列的每个位置是1的矩阵,这个是为了处理
U=zeros(29,22);%生成一个29行22列的零矩阵,作为障碍矩阵
A(5:29,:)=sqrt((cumsum(B,1)-1).^2+(cumsum(B,2)-1).^2);%运用计算技巧计算好每个元胞距门口的距离
C=ones(4,22);%生成4行22列的每个位置是1的矩阵
A(1:4,:)=sqrt((cumsum(C,1)-5).^2+(cumsum(C,2)-1).^2);%运用计算技巧计算好每个元胞距门口的距离
M=ceil(sqrt(113^2+26^2));%取整个楼层的对角线的向上取整作为最远的距离,这里也是编写完走廊之后为了将两个程序拼写在一起才做的微调,否则取房间的对角线向 上取整即可
A(:,[1 22])=M;
A([1 29],:)=M;%给出墙壁的障碍量
U(:,[1 22])=2*M;
U([1 29],:)=2*M;%给出墙壁的障碍量
A(5,1)=0;%给出门口的位置
U(5,1)=0;%给出门口的位置
U(29,11)=0;%学生出来的门口
X=zeros(29,22); %给出目标矩阵,即人作出的选择,下一刻,即将要走向的位置
Y=zeros(29,22); %给出想要运动到X中的同一目标(x,y)的人所在的位置,其上值为x*sqrt(2)+y*sqrt(3)表示目标要到(x,y)去
Z=rand(29,22);%生成一张随机数表,用于最后的决策判断,注意这个表所应该放置的位置
H=zeros(29,22);%生成矩阵H式为了作为最后成功抢到位置的人所在的位置
A(5,1)=0;%给出初始值
D(5,1)=0;%给出D的门口的位置
X(5,1)=0;
Y(5,1)=0;
Z(5,1)=0;
global flag;
for x=2:29;%给出x的循环范围
for y=2:21;%给出y的循环范围
if flag<20
if D(29,11)==0
D(29,11)=M;
flag=flag+1;
end
end
if D(5,1)==M
D(5,1)=0;
end
if x~=29 %如果不在出口处,为8邻域
if D(x,y)==M %九宫格的中心如果是人的话才进行如下操作
E=max(A,D);%取A和D中对应值的最大的表示此刻人也在教室,同时除本人所在的位置之外的每个元胞的值表示此人距门口的距离
F=E((x-1):1:(x+1),(y-1):(y+1));%取出以(x,y)为中心的九宫格
F(2,2)=A(x,y);%九宫格的中心对别人有影响,对自己没有,所以改回原来的值
G=sort(F);%对列排序
b=G(1,:);%取行向量
d=sort(b);%对行向量排序
if length(find(F==d(1)))==1 %先考虑找到的最小值为1个的情况
[r,c]=find(F==d(1)); %找到最小值的位置
if r==2&&c==2 %最小值恰好在中心
X(x,y)=D(x,y);%目标矩阵是其本身,保持不变
Y(x,y)=x*sqrt(2)+y*sqrt(3);%给出到达目标矩阵(x,y)的位置上的值
else
p=x-2+r; %最小值不在中心的时候找到的最小值位置即为目标位置
q=y-2+c;
if p~=1
X(p,q)=M;%给出目标矩阵
Y(x,y)=p*sqrt(2)+q*sqrt(3);%给出到达目标矩阵(x,y)的位置上的值
else
X(x,y)=D(x,y);
Y(x,y)=x*sqrt(2)+y*sqrt(3);
end
end
elseif length(find(F==d(1)))==2;
[r,c]=find(F==d(1));
s=rand(1);
if s>0.5
p=x-2+r(1);
q=y-2+c(1);
if p~=1;
X(p,q)=M;
Y(x,y)=p*sqrt(2)+q*sqrt(3);
else
X(x,y)=D(x,y);
Y(x,y)=x*sqrt(2)+y*sqrt(3);
end
else
p=x-2+r(2);
q=y-2+c(2);
if p~=1;
X(p,q)=M;
Y(x,y)=p*sqrt(2)+q*sqrt(3);
else
X(x,y)=D(x,y);
Y(x,y)=x*sqrt(2)+y*sqrt(3);
end
end
end
end
else %在出口处为5邻域
if D(x,y)==M %九宫格的中心如果是人的话才进行如下操作
E=max(A,D);%取A和D中对应值的最大的表示此刻人也在教室,同时除本人所在的位置之外的每个元胞的值表示此人距门口的距离
F=E((x-1):(x),(y-1):(y+1));%取出以(x,y)为中心的九宫格
F(2,2)=A(x,y);%九宫格的中心对别人有影响,对自己没有,所以改回原来的值
G=sort(F);%对列排序
b=G(1,:);%取行向量
d=sort(b);%对行向量排序
if length(find(F==d(1)))==1 %先考虑找到的最小值为1个的情况
[r,c]=find(F==d(1)); %找到最小值的位置
if r==2&&c==2 %最小值恰好在中心
X(x,y)=D(x,y);%目标矩阵是其本身,保持不变
Y(x,y)=x*sqrt(2)+y*sqrt(3);%给出到达目标矩阵(x,y)的位置上的值
else
p=x-2+r; %最小值不在中心的时候找到的最小值位置即为目标位置
q=y-2+c;
if p~=1
X(p,q)=M;%给出目标矩阵
Y(x,y)=p*sqrt(2)+q*sqrt(3);%给出到达目标矩阵(x,y)的位置上的值
else
X(x,y)=D(x,y);
Y(x,y)=x*sqrt(2)+y*sqrt(3);
end
end
elseif length(find(F==d(1)))==2;
[r,c]=find(F==d(1));
s=rand(1);
if s>0.5
p=x-2+r(1);
q=y-2+c(1);
if p~=1;
X(p,q)=M;
Y(x,y)=p*sqrt(2)+q*sqrt(3);
else
X(x,y)=D(x,y);
Y(x,y)=x*sqrt(2)+y*sqrt(3);
end
else
p=x-2+r(2);
q=y-2+c(2);
if p~=1;
X(p,q)=M;
Y(x,y)=p*sqrt(2)+q*sqrt(3);
else
X(x,y)=D(x,y);
Y(x,y)=x*sqrt(2)+y*sqrt(3);
end
end
end
end
end
end
end
for x=2:28;%给出x的循环范围
for y=2:21;%给出y的循环范围
if X(x,y)>0;
Y1=Y((x-1):1:(x+1),(y-1):(y+1));%对目标(x,y)给出九宫格
Y2=Z((x-1):1:(x+1),(y-1):(y+1));%给出九宫格的随机数作为之后的判断
w=x*sqrt(2)+y*sqrt(3);%(Y1==w)*Y2;%从九宫格中找到以中心为目标的人所对应的随机数
t=max(max((Y1==w).*Y2));%找到以中心为目标的人所对应位置的最大值
[r1,c1]=find((Y1==w).*Y2==t);%找到最大值的位置
H(x-2+r1,y-2+c1)=M;%将抢到中心的位置在H中的位置值改为M
end
end
end
%对以(5,1)为目标的应该如何讨论 (对于出口点都这么讨论)
for x=2:28;%给出x的循环范围
for y=1;%给出y的循环范围
if X(x,y)>0;
Y1=Y((x-1):1:(x+1),y:(y+1));%对目标(x,y)给出九宫格
Y2=Z((x-1):1:(x+1),y:(y+1));%给出九宫格的随机数作为之后的判断
w=x*sqrt(2)+y*sqrt(3);%(Y1==w)*Y2;%从九宫格中找到以中心为目标的人所对应的随机数
t=max(max((Y1==w).*Y2));%找到以中心为目标的人所对应位置的最大值
[r1,c1]=find((Y1==w).*Y2==t);%找到最大值的位置
H(x-2+r1,c1)=M;%将抢到中心的位置在H中的位置值改为M
end
end
end
D=D+X-H;%应用一个十分简单地公式给出下一个时间步的教室中的人员分布情况
Dp=D+U;
end
评论1