蚁群算法的程序代码
function [BESTX,BESTY,ALLX,ALLY]=ACOUCP(K,N,Rho,Q,Lambda,LB,UB)
K=20%迭代次数
N=20%蚁群规模
Rho=0.85%信息素蒸发系数
Q=0.80%信息素增加强度
Lambda=0.3%蚂蚁爬行速度
LB=[40,0.6]'%决策变量的下界
UB=[120,0.8]'%决策变量的上界
%第一步:初始化
M=length(LB);%决策变量的个数
%蚁群位置初始化
X=zeros(M,N);
for i=1:M
x=unifrnd(LB(i),UB(i),1,N);
X(i,:)=x;
end
%输出变量初始化
ALLX=cell(K,1);%细胞结构,记录每一代的个体
ALLY=zeros(K,N); % KXN矩阵,记录每一代评价函数值
BESTX=cell(K,1);%细胞结构,记录每一代的最优个体
BESTY=ones(K,1); % KX1矩阵,记录每一代的最优个体的评价函数值
k=1;%迭代计数器初始化
Tau=zeros(1,N);%信息素初始化
Y=zeros(1,N);%适应值初始化
%第二步:迭代过程
While k
YY=zeros(1,N);
for n=1:N
x=X(:,n);
YY(n)=FIT(x);
end
maxYY=min(YY);
temppos=find(YY==maxYY);
POS=temppos(1);
%蚂蚁随机探路
for n=1:N
if n~=POS
x=X(:,n);
Fx=FIT(x)
mx=GaussMutation(x,LB,UB)
Fmx=FIT(mx)
if Fmx
X (:,n)=mx;
Y(n)=Fmx;
elseif rand>1-(1/(sqrt(k)))
X(:,n)=mx;
Y(n)=Fmx;
X(:,n)=x;
Y(n)=Fx;
end
end
end
for n=1:N
if n~=POS
x=X(:,n);
Fx=FIT(x);
mx=GaussMutation(x,LB,UB);
Fmx=FIT(mx);
if Fmx
Y(n)=Fmx;
else if rand>1-(1/(sqrt(k)))
X(:,n)=mx;
Y(n)=Fmx;
else
X(: , n)=x;
Y(n)=Fx;
end
end
end
%朝信息素最大的地方移动
for n=1:N
if n~=POS
x=X(:,n);
r=(K+k)/(K+K);
p=randperm(N);
t=ceil(r*N)
pos=p(1:t)
TempTau=Tau(pos)
maxTempTau=max(TempTau)
post=find(TempTau==maxTempTau)
pos3=pos(pos2(1))
x2=X(:,pos3(1))
x3=(1-Lambda)*x+Lambda*x2
Fx=FIT(x);
Fx3=FIT(mx);
if Fx3
X(:,n)=x3;
Y(n)=Fx3;
else if rand>1一(1/(sqrt(k)))
X(:,n)=x3;
Y(n)=Fx3;
else
X(:,n)=x;
Y(n)=Fx;
end
end
end
%更新信息素并记录
Tau=Tau* (1-Rho)
maxY=max(Y)
mint=min(Y)
DeltaTau=(maxY-Y)/(maxY-minY);
Tau=Tau+Q * DeltaTau
ALLX {k}=X;
ALLY(k,:)=Y;
mint=min(Y);
pos4=find(Y==minY);
BESTX{k}=X(:,pos4(1));
BESTY(k)=minY;
disp(k);
k= k+l;
end
%交叉变异
function mx=GaussMutation(x,LB,UB)
aph=max(randU,0.618);
mx=LB+aph* (UB-LB);
%绘图
plot(BESTY,'-ko','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',2);
ylabel('Objective function values')
xlabel('Iteration times')
grid on