function [Destination_fitness,bestPositionsX,bestPositionsY,Convergence_curve]=ISMA(N,Max_iter,lb,ub,dim,objfun,R,w)
disp('SMA is now tackling your problem')
% initialize position
bestPositionsX=zeros(1,dim);
bestPositionsY=zeros(1,dim);
Destination_fitness=-inf;%change this to -inf for maximization problems
AllFitness = -inf*ones(N,1);%record the fitness of all slime mold
weightX = ones(N,dim);%fitness weight of each slime mold
weightY = ones(N,dim);%fitness weight of each slime mold
%Initialize the set of random solutions
% X=initialization(N,dim,ub,lb);
for i = 1:N
PosX(i,:)=rand(1,dim).*(ub-lb)+lb;
PosY(i,:)=rand(1,dim).*(ub-lb)+lb;
end
Convergence_curve=zeros(1,Max_iter);
it=1; %Number of iterations
% lb=ones(1,dim).*lb; % lower boundary
% ub=ones(1,dim).*ub; % upper boundary
z=0.03; % parameter
% Main loop
while it <= Max_iter
display(['当前迭代次数为 : ', num2str(it)]);
%sort the fitness
for i=1:N
% Check if solutions go outside the search space and bring them back
Flag4ubX=PosX(i,:)>ub;
Flag4lbX=PosX(i,:)<lb;
PosX(i,:)=(PosX(i,:).*(~(Flag4ubX+Flag4lbX)))+ub.*Flag4ubX+lb.*Flag4lbX;
Flag4ubY=PosY(i,:)>ub;
Flag4lbY=PosY(i,:)<lb;
PosY(i,:)=(PosY(i,:).*(~(Flag4ubY+Flag4lbY)))+ub.*Flag4ubY+lb.*Flag4lbY;
AllFitness(i) = feval(objfun,PosX(i,:),PosY(i,:),R,w);
end
[SmellOrder,SmellIndex] = sort(AllFitness,'descend'); %Eq.(2.6)
worstFitness = SmellOrder(N);
bestFitness = SmellOrder(1);
S=bestFitness-worstFitness+eps; % plus eps to avoid denominator zero
%calculate the fitness weight of each slime mold
for i=1:N
for j=1:dim
if i<=(N/2) %Eq.(2.5)
weightX(SmellIndex(i),j) = 1+rand()*log10((bestFitness-SmellOrder(i))/(S)+1);
weightY(SmellIndex(i),j) = 1+rand()*log10((bestFitness-SmellOrder(i))/(S)+1);
else
weightX(SmellIndex(i),j) = 1-rand()*log10((bestFitness-SmellOrder(i))/(S)+1);
weightY(SmellIndex(i),j) = 1-rand()*log10((bestFitness-SmellOrder(i))/(S)+1);
end
end
end
%update the best fitness value and best position
if bestFitness > Destination_fitness
bestPositionsX=PosX(SmellIndex(1),:);
bestPositionsY=PosY(SmellIndex(1),:);
Destination_fitness = bestFitness;
end
a = atanh(-(it/Max_iter)+1); %Eq.(2.4)
b = 1-it/Max_iter;
% Update the Position of search agents
for i=1:N
if rand<z %Eq.(2.7)
PosX(i,:) = rand(1,dim).*(ub-lb)+lb;
PosY(i,:) = rand(1,dim).*(ub-lb)+lb;
else
% p =tanh(abs(AllFitness(i)-Destination_fitness)); %Eq.(2.2)
% ★★改进1:参数P的改进★★
p = SmellIndex(i)/N;
vbX = unifrnd(-a,a,1,dim); %Eq.(2.3)
vbY = unifrnd(-a,a,1,dim);
vcX = unifrnd(-b,b,1,dim);
vcY = unifrnd(-b,b,1,dim);
for j=1:dim
r = rand();
AX = randi([1,N]); % two positions randomly selected from population
AY = randi([1,N]);
BX = randi([1,N]);
BY = randi([1,N]);
if r<p %Eq.(2.1)
PosX(i,j) = bestPositionsX(j)+ vbX(j)*(weightX(i,j)*PosX(AX,j)-PosX(BX,j));
PosY(i,j) = bestPositionsY(j)+ vbY(j)*(weightY(i,j)*PosY(AY,j)-PosY(BY,j));
else
PosX(i,j) = vcX(j)*PosX(i,j);
PosY(i,j) = vcY(j)*PosY(i,j);
end
end
end
end
% ★★改进2:混沌精英突变★★
for j = 1:dim
faiX(1,j)=(bestPositionsX(j)-lb(j))/(ub(j)-lb(j));
newfaiX(1,j)=mod(faiX(1,j)+0.2-(0.25./pi),1);
faiY(1,j)=(bestPositionsY(j)-lb(j))/(ub(j)-lb(j));
newfaiY(1,j)=mod(faiY(1,j)+0.2-(0.25./pi),1);
end
H=1-(it/Max_iter);
for j = 1:dim
newbestPositionsX(1,j)=H*bestPositionsX(j)+(1-H)*bestPositionsX(j)*newfaiX(1,j);
newbestPositionsY(1,j)=H*bestPositionsY(j)+(1-H)*bestPositionsY(j)*newfaiY(1,j);
end
tempFit = feval(objfun,newbestPositionsX,newbestPositionsY,R,w);
if tempFit>feval(objfun,bestPositionsX,bestPositionsY,R,w);
bestPositionsX = newbestPositionsX;
bestPositionsY = newbestPositionsY;
Destination_fitness = tempFit;
end
Convergence_curve(it)=Destination_fitness;
it=it+1;
end
end
【WSN覆盖优化】基于改进黏菌算法的无线传感器网络覆盖 WSN覆盖优化【matlab代码】
版权申诉
45 浏览量
2024-03-13
22:55:15
上传
评论
收藏 12KB RAR 举报
天`南
- 粉丝: 1283
- 资源: 216