智能优化算法在现在的工程中越来越流行,可以解决工程应用中的最优值的求解问题,只需要在可行解范围里探索适应度最低的可行解,不需要函数的梯度信息,可以避免陷入局部最优解.在实验的过程中,智能优化算法对于高维数和高复杂度的函数都有着相对高的运行速度和高的精确度.
智能优化算法可以大致分为三类:
①Evolution-based:,遗传算法,差分进化算法等
②Physics-based:
③Swarm-based:粒子群算法
我最近将常见的一些智能优化算法的matlab程序从网上整理到一块,方便各位人员使用和指出错误.
鲸鱼优化算法(WOA)
粒子群算法(PSO)
差分进化算法(DE)
蝙蝠算法(BA)
灰狼优化算法(GWO)
蝗虫优化算法(GOA)
飞蛾优化算法(MFO)
遗传算法(GA)
蝴蝶优化算法(BOA)
其他智能优化算法比如说,免疫算法,蚁群算法,模拟退火算法,禁忌搜索算法或者神经网络算法可以私信我找matlab程序,主要参考书籍<智能优化算法及其MATLAB实例>包子阳和余继周 编著.
主程序代码:
clear all
clc
SearchAgents_no = 30; % Number of search agents
Function_name='F1'; % Name of the test function that can be from F1 to F23 (Table 1,2,3 in the paper)
Max_iteration = 500; % Maximum numbef of iterations
% Load details of the selected benchmark function
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
Positions = initialization(SearchAgents_no,dim,ub,lb);
WOA1 = clock;
[WOA_score,WOA_pos,WOA_cg_curve]=WOALR(SearchAgents_no,Max_iteration,lb,ub,dim,fobj,Positions);
WOA2 = clock;
WOA_time = etime(WOA2,WOA1)
PSO1 = clock;
[PSO_score,PSO_pos,PSO_cg_curve]=PSO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj,Positions);
PSO2 = clock;
PSO_time = etime(PSO2,PSO1)
DE1 = clock;
[DE_score,DE_pos,DE_cg_curve]=DEA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj,Positions);
DE2 = clock;
DE_time = etime(DE2,DE1)
BA1 = clock;
[BA_score,BA_pos,BA_cg_curve]=BA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj,Positions);
BA2 = clock;
BA_time = etime(BA2,BA1)
GWO1 = clock;
[GWO_score,GWO_pos,GWO_cg_curve]=GWO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj,Positions);
GWO2 = clock;
GWO_time = etime(GWO2,GWO1)
GOA1 = clock;
[GOA_score,GOA_pos,GOA_cg_curve]=GOA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj,Positions);
GOA2 = clock;
GOA_time = etime(GOA2,GOA1)
MFO1 = clock;
[MFO_score,MFO_pos,MFO_cg_curve]=MFO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj,Positions);
MFO2 = clock;
MFO_time = etime(MFO2,MFO1)
GA1 = clock;
[GA_score,GA_pos,GA_cg_curve]=GA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj,Positions);
GA2 = clock;
GA_time = etime(GA2,GA1)
BOA1 = clock;
[BOA_score,BOA_pos,BOA_cg_curve]=BOAL(SearchAgents_no,Max_iteration,lb,ub,dim,fobj,Positions);
BOA2 = clock;
BOA_time = etime(BOA2,BOA1)
figure('Position',[269 240 660 290])
%Draw search space
subplot(1,2,1);
func_plot(Function_name);
title('Parameter space')
xlabel('x_1');
ylabel('x_2');
zlabel([Function_name,'( x_1 , x_2 )'])
%Draw objective space
subplot(1,2,2);
%semilogy(WOA_cg_curve,'Color','r',WOA_cg_curve1,'Color','g')
plot(1:Max_iteration,WOA_cg_curve,...
1:Max_iteration,PSO_cg_curve,1:Max_iteration,DE_cg_curve(1:500),...
1:Max_iteration,BA_cg_curve,1:Max_iteration,GOA_cg_curve(1:500),'k',...
1:Max_iteration,GWO_cg_curve,1:Max_iteration,MFO_cg_curve,...
1:Max_iteration,GA_cg_curve,1:Max_iteration,BOA_cg_curve)
legend('WOA','PSO','DE','BA','GOA','GWO','MFO','GA','BOA')
title('Objective space')
xlabel('Iteration');
ylabel('Best score obtained so far');
axis tight
grid on
box on
%legend('BOA')
display(['The best solution obtained by WOA is : ', num2str(WOA_pos)]);
display(['The best optimal value of the objective funciton found by WOA is : ', num2str(WOA_score)]);
display(['The best solution obtained by PSO is : ', num2str(PSO_pos)]);
display(['The best optimal value of the objective funciton found by PSO is : ', num2str(PSO_score)]);
display(['The best solution obtained by DE is : ', num2str(DE_pos')]);
display(['The best optimal value of the objective funciton found by DE is : ', num2str(DE_score)]);
display(['The best solution obtained by BA is : ', num2str(BA_pos)]);
display(['The best optimal value of the objective funciton found by BA is : ', num2str(BA_score)]);
display(['The best solution obtained by GOA is : ', num2str(GOA_pos)]);
display(['The best optimal value of the objective funciton found by GOA is : ', num2str(GOA_score)]);
display(['The best solution obtained by GWO is : ', num2str(GWO_pos)]);
display(['The best optimal value of the objective funciton found by GWA is : ', num2str(GWO_score)]);
display(['The best solution obtained by MFO is : ', num2str(MFO_pos)]);
display(['The best optimal value of the objective funciton found by MFO is : ', num2str(MFO_score)]);
display(['The best solution obtained by GA is : ', num2str(GA_pos)]);
display(['The best optimal value of the objective funciton found by GA is : ', num2str(GA_score)]);
display(['The best solution obtained by BOA is : ', num2str(BOA_pos)]);
display(['The best optimal value of the objective funciton found by BOA is : ', num2str(BOA_score)]);
测试基函数
function [lb,ub,dim,fobj] = Get_Functions_details(F)
switch F
case 'F1'
fobj = @F1;
lb=-100;
ub=100;
dim=30;
case 'F2'
fobj = @F2;
lb=-10;
ub=10;
dim=30;
case 'F3'
fobj = @F3;
lb=-100;
ub=100;
dim=30;
case 'F4'
fobj = @F4;
lb=-100;
ub=100;
dim=30;
case 'F5'
fobj = @F5;
lb=-30;
ub=30;
dim=30;
case 'F6'
fobj = @F6;
lb=-100;
ub=100;
dim=30;
case 'F7'
fobj = @F7;
lb=-1.28;
ub=1.28;
dim=30;
case 'F8'
fobj = @F8;
lb=-500;
ub=500;
dim=30;
case 'F9'
fobj = @F9;
lb=-5.12;
ub=5.12;
dim=30;
case 'F10'
fobj = @F10;
lb=-32;
ub=32;
dim=30;
case 'F11'
fobj = @F11;
lb=-600;
ub=600;
dim=30;
case 'F12'
fobj = @F12;
lb=-50;
ub=50;
dim=30;
case 'F13'
fobj = @F13;
lb=-50;
ub=50;
dim=30;
case 'F14'
fobj = @F14;
lb=-65.536;
ub=65.536;
dim=2;
case 'F15'
fobj = @F15;
lb=-5;
ub=5;
dim=4;
case 'F16'
fobj = @F16;
lb=-5;
ub=5;
dim=2;
case 'F17'
fobj = @F17;
lb=[-5,0];
ub=[10,15];
dim=2;
case 'F18'
fobj = @F18;
lb=-2;
ub=2;
dim=2;
case 'F19'
fobj = @F19;
lb=0;
ub=1;
dim=3;
case 'F20'
fobj = @F20;
lb=0;
ub=1;
dim=6;
case 'F21'
fobj = @F21;
lb=0;
ub=10;
dim=4;
case 'F22'
fobj = @F22;
lb=0;
ub=10;
dim=4;
case 'F23'
fobj = @F23;
lb=0;
ub=10;
dim=4;
end
end
% F1
function o = F1(x)
o=sum(x.^2);
end
% F2
function o = F2(x)
o=sum(abs(x))+prod(abs(x));
end
% F3
function o = F3(x)
dim=size(x,2);
o=0;
for i=1:dim
o=o+sum(x(1:i))^2;
end
end
% F4
function o = F4(x)
o=max(abs(x));
end
% F5
function o = F5(x)
dim=size(x,2);
o=sum(100*(x(2:dim)-(x(1:dim-1).^2)).^2+(x(1:dim-1)-1).^2);
end
% F6
function o = F6(x)
o=sum(abs((x+.5)).^2);
end
% F7
function o = F7(x)
dim=size(x,2);
o=sum([1:dim].*(x.^4))+rand;
end
% F8
function o = F8(x)
o=sum(-x.*sin(sqrt(abs(x))));
end
% F9
function o = F9(x)
dim=size(x,2);
o=sum(x.^2-10*cos(2*pi.*x))+10*dim;
end
% F10
function o = F10(x)
dim=size(x,2);
o=-20*exp(-.2*sqrt(sum(x.^2)/dim))-exp(sum(cos(2*pi.*x))/dim)+20+exp(1);
end
% F11
function o = F11(x)
dim=size(x,2);
o=sum(x.^2)/4000-prod(cos(x./sqrt([1:dim])))+1;
end
% F12
function o = F12(x)
dim=size(x,2);
o=(pi/dim)*(10*((sin(pi*(1+(x(1)+1)/4)))^2)+sum((((x(1:dim-1)+1)./4).^2).*...
(1+10.*((sin(pi.*(1+(x(2:dim)+1)./4)))).^2))+((x(dim)+1)/4)^2)+sum(Ufun(x,10,100,4));
end
% F13
function o = F13(x)
dim=size(x,2);
o=.1*((sin(3*pi*x(1)))^2+sum((x(1:dim-1)-1).^2.*(1+(sin(3.*pi.*x(2:dim))).^2))+...
((x(dim)-1)^2)*(1+(sin(2*pi*x(dim)))^2))+sum(Ufun(x,5,100,4));
end
% F14
function o = F14(x)
aS=[-32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32;,...
-32 -32 -32 -32 -32 -16 -16 -16 -16 -16 0 0 0 0 0 16 16 16 16 16 32 32 32 32 32];
for j=1:25
bS(j)=sum((x'-aS(:,j)).^6);
end
o=(1/500+sum(1./([1:25]+bS))).^(-1);
end
% F15
function o = F15(x)
aK=[.1957 .1947 .1735 .16 .0844 .0627 .0456 .0342 .0323 .0235 .0246];
bK=[.25 .5 1 2 4 6 8 10 12 14 16];bK=1./bK;
o=sum((aK-((x(1).*(bK.^2+x(2).*bK))./(bK.^2+x(3).*bK+x(4)))).^2);
end
% F16
function o = F16(x)
o=4*(x(1)^2)-2.1*(x(1)^4)+(x(1)^6)/3+x(1)*x(2)-4*(x(2)^2)+4*(x(2)^4);
end
% F17
function o = F17(x)
o=(x(2)-(x(1)^2)*5.1/(4*(pi^2))+5/pi*x(1)-6)^2+10*(1-1/(8*pi))*cos(x(1))+10;
end
% F18
function o = F18(x)
o=(1+(x(1)+x(2)+1)^2*(19-14*x(1)+3*(x(1)^2)-14*x(2)+6*x(1)*x(2)+3*x(2)^2))*...
(30+(2*x(1)-3*x(2))^2*(18-32*x(1)+12*(x(1)^2)+48*x(2)-36*x(1)*x(2)+27*(x(2)^2)));
end
% F19
function o = F19(x)
aH=[3 10 30;.1 10 35;3 10 30;.1 10 35];cH=[1 1.2 3 3.2];
pH=[.3689 .117 .2673;.4699 .4387 .747;.1091 .8732 .5547;.03815 .5743 .8828];
o=0;
for i=1:4
o=o-cH(i)*exp(-(sum(aH(i,:).*((x-pH(i,:)).^2))));
end
end
% F20
function o = F20(x)
aH=[10 3 17 3.5 1.7 8;.05 10 17 .1 8 14;3 3.5 1.7 10 17 8;17 8 .05 10 .1 14];
cH=[1 1.2 3 3.2];
pH=[.1312 .1696 .5569 .0124 .8283 .5886;.2329 .4135 .8307 .3736 .1004 .9991;...
.2348 .1415 .3522 .2883 .3047 .6650;.4047 .8828 .8732 .5743 .1091 .0381];
o=0;
for i=1:4
o=o-cH(i)*exp(-(sum(aH(i,:).*((x-pH(i,:)).^2))));
end
end
% F21
function o = F21(x)
aSH=[4 4 4 4;1 1 1 1;8 8 8 8;6 6 6 6;3 7 3 7;2 9 2 9;5 5 3 3;8 1 8 1;6 2 6 2;7 3.6 7 3.6];
cSH=[.1 .2 .2 .4 .4 .6 .3 .7 .5 .5];
o=0;
for i=1:5
o=o-((x-aSH(i,:))*(x-aSH(i,:))'+cSH(i))^(-1);
end
end
% F22
function o = F22(x)
aSH=[4 4 4 4;1 1 1 1;8 8 8 8;6 6 6 6;3 7 3 7;2 9 2 9;5 5 3 3;8 1 8 1;6 2 6 2;7 3.6 7 3.6];
cSH=[.1 .2 .2 .4 .4 .6 .3 .7 .5 .5];
o=0;
for i=1:7
o=o-((x-aSH(i,:))*(x-aSH(i,:))'+cSH(i))^(-1);
end
end
% F23
function o = F23(x)
aSH=[4 4 4 4;1 1 1 1;8 8 8 8;6 6 6 6;3 7 3 7;2 9 2 9;5 5 3 3;8 1 8 1;6 2 6 2;7 3.6 7 3.6];
cSH=[.1 .2 .2 .4 .4 .6 .3 .7 .5 .5];
o=0;
for i=1:10
o=o-((x-aSH(i,:))*(x-aSH(i,:))'+cSH(i))^(-1);
end
end
function o=Ufun(x,a,k,m)
o=k.*((x-a).^m).*(x>a)+k.*((-x-a).^m).*(x<(-a));
end
初始化种群
function Positions=initialization(SearchAgents_no,dim,ub,lb)
Boundary_no= size(ub,2); % numnber of boundaries
% If the boundaries of all variables are equal and user enter a signle
% number for both ub and lb
if Boundary_no==1
Positions=rand(SearchAgents_no,dim).*(ub-lb)+lb;
end
% If each variable has a different lb and ub
if Boundary_no>1
for i=1:dim
ub_i=ub(i);
lb_i=lb(i);
Positions(:,i)=rand(SearchAgents_no,1).*(ub_i-lb_i)+lb_i;
end
end
画基函数的二维图形:
function func_plot(func_name)
[lb,ub,dim,fobj]=Get_Functions_details(func_name);
switch func_name
case 'F1'
x=-100:2:100; y=x; %[-100,100]
case 'F2'
x=-100:2:100; y=x; %[-10,10]
case 'F3'
x=-100:2:100; y=x; %[-100,100]
case 'F4'
x=-100:2:100; y=x; %[-100,100]
case 'F5'
x=-200:2:200; y=x; %[-5,5]
case 'F6'
x=-100:2:100; y=x; %[-100,100]
case 'F7'
x=-1:0.03:1; y=x %[-1,1]
case 'F8'
x=-500:10:500;y=x; %[-500,500]
case 'F9'
x=-5:0.1:5; y=x; %[-5,5]
case 'F10'
x=-20:0.5:20; y=x;%[-500,500]
case 'F11'
x=-500:10:500; y=x;%[-0.5,0.5]
case 'F12'
x=-10:0.1:10; y=x;%[-pi,pi]
case 'F13'
x=-5:0.08:5; y=x;%[-3,1]
case 'F14'
x=-100:2:100; y=x;%[-100,100]
case 'F15'
x=-5:0.1:5; y=x;%[-5,5]
case 'F16'
x=-1:0.01:1; y=x;%[-5,5]
case 'F17'
x=-5:0.1:5; y=x;%[-5,5]
case 'F18'
x=-5:0.06:5; y=x;%[-5,5]
case 'F19'
x=-5:0.1:5; y=x;%[-5,5]
case 'F20'
x=-5:0.1:5; y=x;%[-5,5]
case 'F21'
x=-5:0.1:5; y=x;%[-5,5]
case 'F22'
x=-5:0.1:5; y=x;%[-5,5]
case 'F23'
x=-5:0.1:5; y=x;%[-5,5]
end
L=length(x);
f=[];
for i=1:L
for j=1:L
if strcmp(func_name,'F15')==0 && strcmp(func_name,'F19')==0 && strcmp(func_name,'F20')==0 && strcmp(func_name,'F21')==0 && strcmp(func_name,'F22')==0 && strcmp(func_name,'F23')==0
f(i,j)=fobj([x(i),y(j)]);
end
if strcmp(func_name,'F15')==1
f(i,j)=fobj([x(i),y(j),0,0]);
end
if strcmp(func_name,'F19')==1
f(i,j)=fobj([x(i),y(j),0]);
end
if strcmp(func_name,'F20')==1
f(i,j)=fobj([x(i),y(j),0,0,0,0]);
end
if strcmp(func_name,'F21')==1 || strcmp(func_name,'F22')==1 ||strcmp(func_name,'F23')==1
f(i,j)=fobj([x(i),y(j),0,0]);
end
end
end
surfc(x,y,f,'LineStyle','none');
end
鲸鱼优化算法:
function [Leader_score,Leader_pos,Convergence_curve]=WOA(SearchAgents_no,Max_iter,lb,ub,dim,fobj,Positions)
% initialize position vector and score for the leader
Leader_pos=zeros(1,dim);
Leader_score=inf; %change this to -inf for maximization problems
%Initialize the positions of search agents
%Positions=initialization(SearchAgents_no,dim,ub,lb);
Convergence_curve=zeros(1,Max_iter);
t=0;% Loop counter
% Main loop
while tub;
Flag4lb=Positions(i,:) for maximization problem
Leader_score=fitness; % Update alpha
Leader_pos=Positions(i,:);
end
end
a=2-t*((2)/Max_iter); % a decreases linearly fron 2 to 0 in Eq. (2.3)
% a2 linearly dicreases from -1 to -2 to calculate t in Eq. (3.12)
a2=-1+t*((-1)/Max_iter);
% Update the Position of search agents
for i=1:size(Positions,1)
r1=rand(); % r1 is a random number in [0,1]
r2=rand(); % r2 is a random number in [0,1]
A=2*a*r1-a; % Eq. (2.3) in the paper
C=2*r2; % Eq. (2.4) in the paper
b=1; % parameters in Eq. (2.5)
l=(a2-1)*rand+1; % parameters in Eq. (2.5)
p = rand(); % p in Eq. (2.6)
for j=1:size(Positions,2)
if p<0.5
if abs(A)>=1
rand_leader_index = floor(SearchAgents_no*rand()+1);
X_rand = Positions(rand_leader_index, :);
D_X_rand=abs(C*X_rand(j)-Positions(i,j)); % Eq. (2.7)
Positions(i,j)=X_rand(j)-A*D_X_rand; % Eq. (2.8)
elseif abs(A)<1
D_Leader=abs(C*Leader_pos(j)-Positions(i,j)); % Eq. (2.1)
Positions(i,j)=Leader_pos(j)-A*D_Leader; % Eq. (2.2)
end
elseif p>=0.5
distance2Leader=abs(Leader_pos(j)-Positions(i,j));
% Eq. (2.5)
Positions(i,j)=distance2Leader*exp(b.*l).*cos(l.*2*pi)+Leader_pos(j);
end
end
end
t=t+1;
Convergence_curve(t)=Leader_score;
end
PSO优化算法:
function [leader_score,g,gb] = PSO(Search_num,T_max,lb,ub,dim,fobj,Positions)
c1 = 2;
c2 = 2;
w = 0.8;
vmax = 0.5;
vmin = -0.5;
D = dim;
N = Search_num;
T = T_max;
%x = initialization(Search_num,dim,ub,lb);
x = Positions;
v = rand(N,D)*(vmax-vmin)+vmin;
p = x;
pbest = ones(T,1);
for i = 1:N
pbest(i) = fobj(x(i,:));
end
g = ones(1,D);
gbest = inf;
for i = 1:N
if(pbest(i)vmax)||(v(j,ii)ub)||(x(j,ii)Xs)
u(n,m) = rand()*(Xs-Xx)+Xx;
end
end
end
for m = 1:NP
Ob1(m) = fobj(u(:,m));
end
for m = 1:NP
if Ob1(m)r(i)
Stemp=bestS-1+2*rand(1,dim);
end
fitTemp = fobj(Stemp);
if (fitTemp<=pfitness(i))&&(rand()ub;
Flag4lb=Positions(i,:)Alpha_score && fitnessAlpha_score && fitness>Beta_score && fitnessub';Tm=GrassHopperPositions(i,:)ub;
Flag4lb=Moth_pos(i,:)Flame_no % Upaate the position of the moth with respct to one flame
% Eq. (3.13)
distance_to_flame=abs(sorted_population(i,j)-Moth_pos(i,j));
b=1;
t=(a-1)*rand+1;
% Eq. (3.12)
Moth_pos(i,j)=distance_to_flame*cos(t.*2*pi)+sorted_population(Flame_no,j);
end
end
end
Convergence_curve(Iteration)=Best_flame_score;
% Display the iteration and best optimum obtained so far
% if mod(Iteration,50)==0
% display(['At iteration ', num2str(Iteration), ' the best fitness is ', num2str(Best_flame_score)]);
% end
Iteration=Iteration+1;
end
data = [data;Best_flame_score];
GA优化算法:
function [Best_flame_score,Best_flame_pos,Convergence_curve]=GA(N,Max_iteration,lb,ub,dim,fobj,Positions)
%display('GA is optimizing your problem');
%Initialize the positions of GA
%GA_pos=initialization(N,dim,ub,lb);
GA_pos = Positions;
Convergence_curve=zeros(1,Max_iteration);
data = [];
Best_flame_score =1;
fitness_function= fobj;
population_size=N;
parent_number=dim;
mutation_rate=0.1;
maximal_generation=Max_iteration;
minimal_cost=1.0e-40;
cumulative_probabilities = cumsum((parent_number:-1:1) / sum(parent_number:-1:1)); % 1个长度为parent_number的数列
number_of_variables=dim;
% 最佳适应度
% 每一代的最佳适应度都先初始化为1
% Best_flame_score = ones(maximal_generation, 1);
% 精英
% 每一代的精英的参数值都先初始化为0
% Best_flame_pos = zeros(1, number_of_variables);
% 子女数量
% 种群数量 - 父母数量(父母即每一代中不发生改变的个体)
child_number = population_size - parent_number; % 每一代子女的数目
% 初始化种群
% population_size 对应矩阵的行,每一行表示1个个体,行数=个体数(种群数量)
% number_of_variables 对应矩阵的列,列数=参数个数(个体特征由这些参数表示)
population = GA_pos;
last_generation = 0; % 记录跳出循环时的代数
generation=1;
% Main loop
while generation rand, 1); % 选择一个较优秀的母亲
father = find(cumulative_probabilities > rand, 1); % 选择一个较优秀的父亲
% ceil(天花板)向上取整
% rand 生成一个随机数
% 即随机选择了一列,这一列的值交换
crossover_point = ceil(rand*number_of_variables); % 随机地确定一个染色体交叉点
% 假如crossover_point=3, number_of_variables=5
% mask1 = 1 1 1 0 0
% mask2 = 0 0 0 1 1
mask1 = [ones(1, crossover_point), zeros(1, number_of_variables - crossover_point)];
mask2 = not(mask1);
% 获取分开的4段染色体
% 注意是 .*
mother_1 = mask1 .* population(mother, :); % 母亲染色体的前部分
mother_2 = mask2 .* population(mother, :); % 母亲染色体的后部分
father_1 = mask1 .* population(father, :); % 父亲染色体的前部分
father_2 = mask2 .* population(father, :); % 父亲染色体的后部分
% 得到下一代
population(parent_number + child, :) = mother_1 + father_2; % 一个孩子
population(parent_number+child+1, :) = mother_2 + father_1; % 另一个孩子
end % 染色体交叉结束
% 染色体变异开始
% 变异种群
mutation_population = population(2:population_size, :); % 精英不参与变异,所以从2开始
number_of_elements = (population_size - 1) * number_of_variables; % 全部基因数目
number_of_mutations = ceil(number_of_elements * mutation_rate); % 变异的基因数目(基因总数*变异率)
% rand(1, number_of_mutations) 生成number_of_mutations个随机数(范围0-1)组成的矩阵(1*number_of_mutations)
% 数乘后,矩阵每个元素表示发生改变的基因的位置(元素在矩阵中的一维坐标)
mutation_points = ceil(number_of_elements * rand(1, number_of_mutations)); % 确定要变异的基因
% 被选中的基因都被一个随机数替代,完成变异
mutation_population(mutation_points) = rand(1, number_of_mutations); % 对选中的基因进行变异操作
population(2:population_size, :) = mutation_population; % 发生变异之后的种群
Convergence_curve(generation)=Best_flame_score;
% 染色体变异结束
% Display the iteration and best optimum obtained so far
% if mod(generation,50)==0
% % display(['At iteration ', num2str(generation), ' the best fitness is ', num2str(Best_flame_score)]);
% display(['At iteration ', num2str(generation)]);
% end
generation=generation+1;
end
data = [data;Best_flame_score];
BOA优化算法:
function [fmin,best_pos,Convergence_curve]=BOAL(n,N_iter,Lb,Ub,dim,fobj,Positions)
% n is the population size
% N_iter represnets total number of iterations
p=0.8; % probabibility switch
power_exponent=0.1;
sensory_modality=0.01;
%Initialize the positions of search agents
%Sol=initialization(n,dim,Ub,Lb);
Sol = Positions;
for i=1:n
Fitness(i)=fobj(Sol(i,:));
end
% Find the current best_pos
[fmin,I]=min(Fitness);
best_pos=Sol(I,:);
S=Sol;
% Start the iterations -- Butterfly Optimization Algorithm
for t=1:N_iter
for i=1:n % Loop over all butterflies/solutions
%Calculate fragrance of each butterfly which is correlated with objective function
Fnew=fobj(S(i,:));
FP=(sensory_modality*(Fnew^power_exponent));
%Global or local search
if randUb;
ns_tmp(J)=Ub;
% Update this new move
s=ns_tmp;
function y=sensory_modality_NEW(x,Ngen)
y=x+(0.025/(x*Ngen));