📄 dis.m
字号:
function dis(max,m)%max为迭代最大次数,m为每次蚂蚁的数量
safe=0.9;%飞机安全性的权重
r=21;%行的点数
c=21;%列的点数
initiate=10;%激素浓度的初始值
x0=1;%初始点的坐标
y0=2;
xend=19;%终点的坐标值
yend=18;
lm=1;%每格的长度
e=4;
pp=0.5;
a=1;
b=1.1;
Q=15;
W=zeros(m,1);
add=4;
%以1km为步长
xt=[7,11,9,18,13,15,14,20];%威胁点的横坐标
yt=[20,14,6,2,4,18,17,14];%威胁点的纵坐标
threat=8;
C=struct('x',0,'y',0);%定义坐标点结构体
for i=1:21
for j=1:21
C(i,j).x=i-1;
C(i,j).y=j-1;
end
end
%还要初始化两个点之间的权重
%坐标为(i,j)的点为第(i*c+j)+1=i*c+j+1个点,c为列数
for i=1:r%这个不是横坐标,相当于横坐标+1
for j=1:c%这个相当于纵坐标+1
t1((i-1)*c+j,(i-1)*c+j+c)=initiate;%上边的点
t1((i-1)*c+j,(i-1)*c+j+c+1)=initiate;%右上角的点
t1((i-1)*c+j,(i-1)*c+j+1)=initiate;%右边的点
end
end
Wbest=ones(1,max);%第nc次迭代的最佳权重
Wbest=Wbest*10000000;
for nc=1:max%迭代了第nc次
W=zeros(1,m);%记录每次m个蚂蚁的权重
for i=1:m%第nc次循环的第i只蚂蚁出发
x(i,1)=x0;
y(i,1)=y0;
for j=2:5000%第j步
if x(i,j-1)<=xend&y(i,j-1)<=yend
%下面来计算选取将要走的三个点的哪个
for k=1:3
switch k
case 1,%上边的点
%计算总代价
%先计算威胁代价
wt(1)=0;
for line=1:9%将线段分9段计算,以代替积分
for threat=1:threat%threat个威胁点
%计算每个威胁点与节点line的距离的平方
d(threat)=sqrt((x(i,j-1)-xt(threat))^2+(y(i,j-1)+line/10*lm-yt(threat))^2);
end
wt(1)=wt(1)+sum(1./d.^4);
end
wt(1)=wt(1)*lm*add;%往第一个点的即上边的点的危险代价
wf(1)=lm;%往第一个点的即上边的点的路程代价
w(1)=safe*wt(1)+(1-safe)*wf(1);%往第一个点的总代价
case 2,%右上角的点,要注意的是第二个点与之前点的距离变为sqrt(2)*lm,即对角线的长度
%先计算威胁代价
wt(2)=0;
for line=1:9%将线段分9段计算,以代替积分
for threat=1:8%8个威胁点
%计算每个威胁点与节点line的距离的平方
d(threat)=sqrt((x(i,j-1)+line/10*lm-xt(threat))^2+(y(i,j-1)+line/10*lm-yt(threat))^2);
end
wt(2)=wt(2)+sum(1./d.^4);
end
wt(2)=sqrt(2)*wt(2)*lm*add;%往第二个点的即上边的点的危险代价
wf(2)=sqrt(2)*lm;%往第二个点的即上边的点的路程代价
w(2)=safe*wt(2)+(1-safe)*wf(2);%往第二个点的总代价
case 3,%右边的点
%先计算威胁代价
wt(3)=0;
for line=1:9%将线段分9段计算,以代替积分
for threat=1:8%8个威胁点
%计算每个威胁点与节点line的距离的平方
d(threat)=sqrt((x(i,j-1)+line/10*lm-xt(threat))^2+(y(i,j-1)-yt(threat))^2);
end
wt(3)=wt(3)+sum(1./d.^4);
end
wt(3)=wt(3)*lm*add;%往第一个点的即上边的点的危险代价
wf(3)=lm;%往第一个点的即上边的点的路程代价
w(3)=safe*wt(3)+(1-safe)*wf(3);%往第一个点的总代价
end%switch
end%for k=1:3,
%算完了分别到三个点的代价,下面计算具体选哪个点
%t((i-1)*c+j,(i-1)*c+j+c+1)=initiate;%右上角的点
%t((i-1)*c+j,(i-1)*c+j+1)=initiate;%右边的点
part(1)=t1((x(i,j-1))*c+y(i,j-1)+1,(x(i,j-1))*c+y(i,j-1)+c+1)^a*(1/w(1))^b;%上边的点
part(2)=t1((x(i,j-1))*c+y(i,j-1)+1,(x(i,j-1))*c+y(i,j-1)+c+1+1)^a*(1/w(2))^b;%右上角的点
part(3)=t1((x(i,j-1))*c+y(i,j-1)+1,(x(i,j-1))*c+y(i,j-1)+1+1)^a*(1/w(3))^b;%右边的点
total=sum(part);
for s=1:3
p(s)=part(s)/total;
end
next=choose(p,3);%采用赌盘方式决定下一个
%坐标为(i,j)的点为第((i-1)*c+j-1)+1=(i-1)*c+j个点,c为列数
switch next
case 1,%下一步是上边的点
x(i,j)=x(i,j-1);
y(i,j)=y(i,j-1)+1;
case 2,%下一步是右上角的点
x(i,j)=x(i,j-1)+1;
y(i,j)=y(i,j-1)+1;
case 3,%下一步是右边的点
x(i,j)=x(i,j-1)+1;
y(i,j)=y(i,j-1);
end% switch next
W(i)=W(i)+w(next);%记录第i只蚂蚁的代价
steps(i)=j;%记录第i只蚂蚁的步数
if x(i,j)==xend&y(i,j)==yend %到达终点中止,让下一只蚂蚁出发
finish(i)=1;%第i只是完成了
break;
end%if x[i][j]==xend&y[i][j]==yend
else%if x[i][j]<=r&y[i][j]<=c
finish(i)=0;%第i只跑出界了,没有完成任务。
break;
end
end% for j=2:5000%第j步
end% for i=1:m%第nc次循环的第i只蚂蚁出发
%第nc次的蚁群循环结束,下面来更新激素浓度
%先是自然挥发
for i=1:r-1
for j=1:c-1
t1((i-1)*c+j,(i-1)*c+j+c)=(1-pp)*t1((i-1)*c+j,(i-1)*c+j+c);%上边的点
t1((i-1)*c+j,(i-1)*c+j+c+1)=(1-pp)*t1((i-1)*c+j,(i-1)*c+j+c+1);%右上角的点
t1((i-1)*c+j,(i-1)*c+j+1)=(1-pp)*t1((i-1)*c+j,(i-1)*c+j+c+1);%右边的点
end
end
%根据每只蚂蚁爬过的路线增强激素
for i=1:m%第i只蚂蚁
if finish(i)
for j=1:steps(i)-1%第j步
t1((x(i,j))*c+y(i,j)+1,(x(i,j+1))*c+y(i,j+1)+1)=t1((x(i,j))*c+y(i,j)+1,(x(i,j+1))*c+y(i,j+1)+1)+pp*Q/W(i);
end
end
end
k=minnum(W,finish,m);%看代价最小的蚂蚁看是哪只,但是注意finish[k]=1,加上代价最小的蚂蚁的影响
if k
for s=1:steps(k)-1
t1((x(k,s))*c+y(k,s)+1,(x(k,s+1))*c+y(k,s+1)+1)=t1((x(k,s))*c+y(k,s)+1,(x(k,s+1))*c+y(k,s+1)+1)+pp*e*Q/W(k);
end
%下面记录第nc次最好的结果
Wbest(nc)=W(k);%第nc次最好的代价
%Xbest(nc)=x(k),%第nc次最好的路径的横坐标
for s=1:steps(k)
Xbest(nc,s)=x(k,s);
end
%Ybest(nc)=y(k).%第nc次最好的路径的纵坐
for s=1:steps(k)
Ybest(nc,s)=y(k,s);
end
Steps(nc)=steps(k);%第nc次最好的路径的步数
end%if k
end%for nc=1:max%迭代了第nc次
bestnc=minnum1(Wbest,max);%从max次循环中找到最好的一次
for s=1:Steps(bestnc)
xbest(s)=Xbest(bestnc,s);
ybest(s)=Ybest(bestnc,s);
end
V=[0,30,0,30];
axis(V);
plot(xt,yt,'m*',x0,y0,'b*',xend,yend,'b*',25,25,'w*',xbest,ybest,'r');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -