clear;clc;
r=21;
c=21;
intau=20;
xstart=1;
ystart=3;
xend=20;
yend=18;
gd=1;
xt=[5,11,8,16,12,15,17,19];
yt=[9,15,7,3,12,8,15,12];
threat=8;
NCmax=200;
%初始化数据
Gamma_A=0.9;
Rho_A=0.2;
Alpha_A=1;
Beta_A=3;
Q=50;
m_A=15;
W_A=zeros(m_A,1);
WW_A=10000;%代价比较值
C_A=struct('x_A',0,'y_A',0);
for i_A=1:21
for j_A=1:21
C_A(i_A,j_A).x_A=i_A-1;
C_A(i_A,j_A).y_A=j_A-1;
end
end
for i_A=1:r
for j_A=1:c
Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+c)=intau;
Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+c+1)=intau;
Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+1)=intau;
end
end
Wbest_A=ones(1,NCmax);
Wbest_A=Wbest_A*100000;
%第二步,计算各路径代价并完成各自搜索
for nc=1:NCmax
x_A=[];y_A=[];
%种群数据
W_A=zeros(1,m_A);
for i_A=1:m_A
x_A(i_A,1)=xstart;
y_A(i_A,1)=ystart;
for j_A=2:100
if x_A(i_A,j_A-1)<=xend&&y_A(i_A,j_A-1)<=yend
for k=1:3
switch k
case 1,
wt_A(1)=0;
for line=1:9
for threat0=1:threat
d(threat0)=sqrt((x_A(i_A,j_A-1)-xt(threat0))^2+(y_A(i_A,j_A-1)+line/10*gd-yt(threat0))^2);
end
wt_A(1)=wt_A(1)+sum(1./d.^4);
end
wt_A(1)=wt_A(1)*gd;
wf_A(1)=gd;
w_A(1)=Gamma_A*wt_A(1)+(1-Gamma_A)*wf_A(1);
case 2,
wt_A(2)=0;
for line=1:9
for threat=1:8
d(threat)=sqrt((x_A(i_A,j_A-1)+line/10*gd-xt(threat))^2+(y_A(i_A,j_A-1)+line/10*gd-yt(threat))^2);
end
wt_A(2)=wt_A(2)+sum(1./d.^4);
end
wt_A(2)=sqrt(2)*wt_A(2)*gd;
wf_A(2)=sqrt(2)*gd;
w_A(2)=Gamma_A*wt_A(2)+(1-Gamma_A)*wf_A(2);
case 3,
wt_A(3)=0;
for line=1:9
for threat=1:8
d(threat)=sqrt((x_A(i_A,j_A-1)+line/10*gd-xt(threat))^2+(y_A(i_A,j_A-1)-yt(threat))^2);
end
wt_A(3)=wt_A(3)+sum(1./d.^4);
end
wt_A(3)=wt_A(3)*gd;
wf_A(3)=gd;
w_A(3)=Gamma_A*wt_A(3)+(1-Gamma_A)*wf_A(3);
end
end
part(1)=Tau_A((x_A(i_A,j_A-1))*c+y_A(i_A,j_A-1)+1,(x_A(i_A,j_A-1))*c+y_A(i_A,j_A-1)+c+1)^Alpha_A*(1/w_A(1))^Beta_A;
part(2)=Tau_A((x_A(i_A,j_A-1))*c+y_A(i_A,j_A-1)+1,(x_A(i_A,j_A-1))*c+y_A(i_A,j_A-1)+c+1+1)^Alpha_A*(1/w_A(2))^Beta_A;
part(3)=Tau_A((x_A(i_A,j_A-1))*c+y_A(i_A,j_A-1)+1,(x_A(i_A,j_A-1))*c+y_A(i_A,j_A-1)+1+1)^Alpha_A*(1/w_A(3))^Beta_A;
total=sum(part);
for s=1:3
p(s)=part(s)/total;
end
% [maxp,next]=max(p);
% next=choose(p,3);
p=cumsum(p); %cumsum,元素累加即求和
next=find(p>=rand);
switch next(1)
case 1,
x_A(i_A,j_A)=x_A(i_A,j_A-1);
y_A(i_A,j_A)=y_A(i_A,j_A-1)+1;
case 2,
x_A(i_A,j_A)=x_A(i_A,j_A-1)+1;
y_A(i_A,j_A)=y_A(i_A,j_A-1)+1;
case 3,
x_A(i_A,j_A)=x_A(i_A,j_A-1)+1;
y_A(i_A,j_A)=y_A(i_A,j_A-1);
end
W_A(i_A)=W_A(i_A)+w_A(next(1));
steps_A(i_A)=j_A;
if x_A(i_A,j_A)==xend&&y_A(i_A,j_A)==yend
finish_A(i_A)=1;
break;
end
else
finish_A(i_A)=0;
break;
% finish_A(i_A)=0;
% if x_A(i_A,j_A)==xend&&y_A(i_A,j_A)==yend
% finish_A(i_A)=1;
% break;
end
end
end
%第三步,信息素更新
%第一种群数据
for i_A=1:r-1
for j_A=1:c-1
Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+c)=(1-Rho_A)*Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+c);
Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+c+1)=(1-Rho_A)*Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+c+1);
Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+1)=(1-Rho_A)*Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+c+1);
end
end
for i_A=1:m_A
if finish_A(i_A)
for j_A=1:steps_A(i_A)-1
Tau_A((x_A(i_A,j_A))*c+y_A(i_A,j_A)+1,(x_A(i_A,j_A+1))*c+y_A(i_A,j_A+1)+1)=Tau_A((x_A(i_A,j_A))*c+y_A(i_A,j_A)+1,(x_A(i_A,j_A+1))*c+y_A(i_A,j_A+1)+1)+Rho_A*Q/W_A(i_A);
end
end
end
%第四步,记录迭代结果
k_AA=minnum(W_A,finish_A,m_A);%寻找完成全局的代价最小的那只蚂蚁
k_A=k_AA(1);
if k_A
for s=1:steps_A(k_A)-1
Tau_A((x_A(k_A,s))*c+y_A(k_A,s)+1,(x_A(k_A,s+1))*c+y_A(k_A,s+1)+1)=(1-Rho_A)*Tau_A((x_A(k_A,s))*c+y_A(k_A,s)+1,(x_A(k_A,s+1))*c+y_A(k_A,s+1)+1)+Rho_A*Q/W_A(k_A);
end
Wbest_A(nc)=W_A(k_A);
if WW_A>Wbest_A(nc)
WW_A=Wbest_A(nc);
X_A=x_A(k_A,:);
Y_A=y_A(k_A,:);
end
end
end
for i=1:length(X_A)
if X_A(i)
XX_A(i)=X_A(i);
YY_A(i)=Y_A(i);
end
end
V=[0,25,0,25];
axis(V);
plot(xt,yt,'ks',xstart,ystart,'bo',xend,yend,'bo',25,25,'wo')
hold on
%set(gca,'XTick',0:25);set(gca,'YTick',0:25);
plot(XX_A,YY_A,'r');
%grid on