智能优化算法源代码

更新时间:2023-12-03 05:44:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

人工蚂蚁算法

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [x,y, minvalue] = AA(func)

% Example [x, y,minvalue] = AA('Foxhole') clc; tic;

subplot(2,2,1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% plot 1 draw(func);

title([func, ' Function']); %初始化各参数

Ant=100;%蚂蚁规模 ECHO=200;%迭代次数

step=0.01*rand(1);%局部搜索时的步长 temp=[0,0]; %各子区间长度 start1=-100; end1=100; start2=-100; end2=100;

Len1=(end1-start1)/Ant; Len2=(end2-start2)/Ant; %P = 0.2;

%初始化蚂蚁位置

for i=1:Ant

X(i,1)=(start1+(end1-start1)*rand(1)); X(i,2)=(start2+(end2-start2)*rand(1)); %func=AA_Foxhole_Func(X(i,1),X(i,2)); val=feval(func,[X(i,1),X(i,2)]);

T0(i)=exp(-val);%初始信息素,随函数值大,信息素浓度小,反之亦

然 %%%%%********************************************************************* end;

%至此初始化完成

for Echo=1:ECHO %开始寻优 %P0函数定义,P0为全局转移选择因子 a1=0.9;

b1=(1/ECHO)*2*log(1/2); f1=a1*exp(b1*Echo); a2=0.225;

b2=(1/ECHO)*2*log(2); f2=a2*exp(b2*Echo); if Echo<=(ECHO/2) P0=f1; else

P0=f2; end;

%P函数定义,P为信息素蒸发系数 a3=0.1;

b3=(1/ECHO).*log(9); P=a3*exp(b3*Echo);

lamda=0.10+(0.14-0.1)*rand(1);%全局转移步长参数

Wmax=1.0+(1.4-1.0)*rand(1);%步长更新参数上限

Wmin=0.2+(0.8-0.2)*rand(1);%步长更新参数下限

%寻找初始最优值 T_Best=T0(1); for j=1:Ant

if T0(j)>=T_Best T_Best=T0(j); BestIndex=j; end; end;

W=Wmax-(Wmax-Wmin)*(Echo/ECHO); %局部搜索步长更新参数

for j_g=1:Ant %全局转移概率求取,当该蚂蚁随在位置不是bestindex时 if j_g~=BestIndex

r=T0(BestIndex)-T0(j_g);

Prob(j_g)=exp(r)/exp(T0(BestIndex)); else %当j_g=BestIndex的时候进行局部搜索

if rand(1)<0.5

1

temp(1,1)=X(BestIndex,1)+W*step;

temp(1,2)=X(BestIndex,2)+W*step; else

temp(1,1)=X(BestIndex,1)-W*step;

temp(1,2)=X(BestIndex,2)-W*step; end;

Prob(j_g)=0;?stindex的蚂蚁不进行全局转移 end;

X1_T=temp(1,1); X2_T=temp(1,2);

X1_B=X(BestIndex,1); X2_B=X(BestIndex,2);

%func1 =

AA_Foxhole_Func(X1_T,X2_T); %%%%%%%%%%%***************************************************

?_T=func1;

F1_T=feval(func,[X(i,1),X(i,2)]);

F1_B=feval(func,[X1_B,X2_B]);

?_T=(X1_T-1).^2+(X2_T-2.2).^2+1;

%func2 =

AA_Foxhole_Func(X1_B,X2_B); %%%%%%%%%%%%%***************************************************

?_B=func2;

?_B=(X1_B-1).^2+(X2_B-2.2).^2+1;

if exp(-F1_T)>exp(-F1_B)

X(BestIndex,1)=temp(1,1);

X(BestIndex,2)=temp(1,2); end;

end;

for j_g_tr=1:Ant

if Prob(j_g_tr)

X(j_g_tr,1)=X(j_g_tr,1)+lamda*(X(BestIndex,1)-X(j_g_tr,1));%Xi=Xi+lamda*(Xbest-Xi)

X(j_g_tr,2)=X(j_g_tr,2)+lamda*(X(BestIndex,2)-X(j_g_tr,2));%Xi=Xi+lamda*(Xbest-Xi)

X(j_g_tr,1)=bound(X(j_g_tr,1),start1,end1);

X(j_g_tr,2)=bound(X(j_g_tr,2),start2,end2);

else

X(j_g_tr,1)=X(j_g_tr,1)+((-1)+2*rand(1))*Len1;%Xi=Xi+rand(-1,1)*Len1

X(j_g_tr,2)=X(j_g_tr,2)+((-1)+2*rand(1))*Len2;%Xi=Xi+rand(-1,1)*Len2

X(j_g_tr,1)=bound(X(j_g_tr,1),start1,end1);

X(j_g_tr,2)=bound(X(j_g_tr,2),start2,end2);

end; end; %信息素更新

subplot(2,2,2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plot 1 bar([X(BestIndex,1) X(BestIndex,2)],0.25); %colormap (cool);

axis([0 3 -40 40 ]) ;

title ({date;['Iteration ', num2str(Echo)]}); xlabel(['Min_x =

',num2str(X(BestIndex,1)),' ',

'Min_y = ', num2str(X(BestIndex,2))]);

2

for t_t=1:Ant

%func=AA_Foxhole_Func(X(t_t,1),X(t_t,2));

val1=feval(func,[X(t_t,1),X(t_t,2)]);

T0(t_t)=(1-P)*T0(t_t)+(exp(-val1)); %************************************************************************* end;

[c_iter,i_iter]=max(T0); %求取每代全局最优解

minpoint_iter=[X(i_iter,1),X(i_iter,2)];

%func3 =

AA_Foxhole_Func(X(i_iter,1),X(i_iter,2)); %%%%%%%%%***************************************************************************

val2=feval(func,[X(i_iter,1),X(i_iter,2)]);

minvalue_iter= val2;

%minvalue_iter=(X(i_iter,1)-1).^2+(X(i_iter,2)-2.2).^2+1;

min_local(Echo)=minvalue_iter;%保存每代局部最优解

subplot(2,2,3);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plot 2

plot(X(BestIndex,1),X(BestIndex,2),'rs','MarkerFaceColor','r', 'MarkerSize',8), grid on;

title (['Global Min Value = ', num2str(minvalue_iter)]);

hold on;

plot(X(:,1),X(:,2),'g.'), pause (0.02);

hold off ;

axis([-100 100 -100 100]); grid on;

%将每代全局最优解存到min_global矩阵中

if Echo >= 2 if

min_local(Echo)

min_global(Echo)=min_local(Echo); else

min_global(Echo)=min_global(Echo-1); end; else

min_global(Echo)=minvalue_iter; end;

subplot(2,2,4);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plot 3

min_global=min_global'; index(:,1)=1:ECHO;

plot(Echo, min_global(Echo),'y*') %axis([0 ECHO 0 10]); hold on;

title ([func,' (X) = ',

num2str(minvalue_iter)],'Color','r'); xlabel('iteration'); ylabel('f(x)'); grid on;

end;ìHO循环结束

[c_max,i_max]=max(T0);

minpoint=[X(i_max,1),X(i_max,2)]; %func3 =

AA_Foxhole_Func(X(i_max,1),X(i_max,2)); %%%*******************************

3

******************************************

%minvalue = func3;

minvalue=feval(func,[X(i_max,1),X(i_max,2)]);

x=X(BestIndex,1); y=X(BestIndex,2);

runtime=toc

人工免疫算法

function [x,y,fx,vfx,vmfit,P,vpm] = AI(func,gen,n,pm,per);

% Example [x,y,fx] = AI('Foxhole') subplot(2,2,1); draw(func);

title( [func, ' Function']); if nargin == 1, % gen = 200; n =

round(size(P,1)/2); pm = 0.0005; per = 0.0; fat = 10;

%gen = 250; n = size(P,1); pm = 0.01; per = 0.0; fat = .1; P = cadeia(200,44,0,0,0);

gen = 40; n = size(P,1); pm = 0.2; per = 0.0; fat = 0.1; end;

while n <= 0,

n = input('n has to be at least one. Type a new value for n: '); end;

xmin=-100; xmax=100; ymin=-100; ymax=100;

x = decode(P(:,1:22),xmin,xmax); y = decode(P(:,23:end),ymin,ymax); %fit = eval(f);

%fit=AI_Foxhole_Func(x,y);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

fit=feval(func,[x' y']);

%imprime(1,vxp,vyp,vzp,x,y,fit,1,1); % Hypermutation controlling parameters

pma = pm; itpm = gen; pmr = 0.8;

% General defintions

vpm = []; vfx = []; vmfit = []; valfx = 1;

[N,L] = size(P); it = 0; PRINT = 1;

% Generations

while it <= gen & valfx <= 100,

x = decode(P(:,1:22),xmin,xmax); y = decode(P(:,23:end),ymin,ymax); T = []; cs = [];

%fit = eval(f);

%fit=AI_Foxhole_Func(x,y);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

fit=feval(func,[x' y']); [a,ind] = sort(fit);

valx = x(ind(end-n+1:end)); valy = y(ind(end-n+1:end));

fx = a(end-n+1:end); % n best individuals (maximization)

% Reproduction

[T,pcs] = reprod(n,fat,N,ind,P,T);

% Hypermutation

M = rand(size(T,1),L) <= pm; T = T - 2 .* (T.*M) + M; T(pcs,:) = P(fliplr(ind(end-n+1:end)),:);

% New Re-Selection (Multi-peak solution)

4

x = decode(T(:,1:22),xmin,xmax); y = decode(T(:,23:end),ymin,ymax);

%fit=AI_Foxhole_Func(x,y);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

fit=feval(func,[x' y']); %fit = eval(f); pcs = [0 pcs]; for i=1:n,

[out(i),bcs(i)] =

min(fit(pcs(i)+1:pcs(i+1))); % Mimimazion

problem %%%************************* bcs(i) = bcs(i) + pcs(i); end;

P(fliplr(ind(end-n+1:end)),:) = T(bcs,:);

% Editing (Repertoire shift)

nedit = round(per*N); it = it + 1; P(ind(1:nedit),:) = cadeia(nedit,L,0,0,0);

pm = pmcont(pm,pma,pmr,it,itpm); valfx =

min(fx); %************************************************************* vpm = [vpm pm]; vfx = [vfx valfx]; vmfit = [vmfit mean(fit)];

disp(sprintf('It.: %d pm: %.4f x: %2.2f y: %2.2f Av.: %2.2f

f(x,y): %2.3f',it,pm,valx(1),valy(1),vmfit(1),valfx));

subplot(2,2,2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plot 1

bar([valx(1) valy(1)],0.25);

axis([0 3 -40 40 ]) ; title (['Iteration ', num2str(it)]); pause (0.1);

subplot(2,2,3); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plot 2

plot(valx(1),valy(1),'rs','MarkerFaceColor','r', 'MarkerSize',8) hold on;

%plot(x(:,1),x(:,2),'k.'); set(gca,'Color','g') hold off; grid on;

axis([-100 100 -100 100 ]) ;

title(['Global Min = ',num2str(valfx)]);

xlabel(['Min_x= ',num2str(valx(1)),' Min_y= ',num2str(valy(1))]);

subplot(2,2,4); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plot 3 plot(it,valfx ,'k.') axis([0 gen 0 10]); hold on;

title ([func ,'(X) = ', num2str(valfx)]);

xlabel('iteration'); ylabel('f(x)'); grid on;

end; % end while

%imprime(PRINT,vxp,vyp,vzp,x,y,fit,it,1);

x = valx(1); y = valy(1); fx =

min(fx); %***********************************************************************

% x = P(ind(end),1:22); y =

P(ind(end),23:44); fx = max(fx);

5

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plot 4

% --------------------- % % INTERNAL SUBFUNCTIONS % --------------------- %

% Print

function [] =

imprime(PRINT,vx,vy,vz,x,y,fx,it,mit); % x,fx -> actual values % vxplot, vplot -> original (base) function

if PRINT == 1,

if rem(it,mit) == 0,

mesh(vx,vy,vz); hold on; axis([-100 100 -100 100 0 500]); xlabel('x'); ylabel('y'); zlabel('f(x,y)');

plot3(x,y,fx,'k*'); drawnow; hold off; end; end;

% Reproduction function [T,pcs] =

reprod(n,fat,N,ind,P,T); % n -> number of clones % fat -> multiplying factor % ind -> best individuals

% T -> temporary population % pcs -> final position of each clone

if n == 1, cs = N;

T = ones(N,1) * P(ind(1),:); else,

for i=1:n,

% cs(i) = round(fat*N/i); cs(i) = round(fat*N); pcs(i) = sum(cs);

T = [T; ones(cs(i),1) * P(ind(end-i+1),:)];

end; end;

% Control of pm function [pm] =

pmcont(pm,pma,pmr,it,itpm); % pma -> initial value % pmr -> control rate

% itpm -> iterations for restoring if rem(it,itpm) == 0, pm = pm * pmr;

if rem(it,10*itpm) == 0, pm = pma; end; end;

% Decodify bitstrings

function x = decode(v,min,max);

% x -> real value (precision: 6) % v -> binary string (length: 22) v = fliplr(v); s = size(v);

aux = 0:1:21; aux = ones(s(1),1)*aux; x1 = sum((v.*2.^aux)');

x = min + (max-min)*x1 ./ 4194303;

function [ab,ag] =

cadeia(n1,s1,n2,s2,bip)

Tfault parameter value seeting if nargin == 2,

n2 = n1; s2 = s1; bip = 1; elseif nargin == 4, bip = 1; end;

% Antibody (Ab) chains

ab = 2 .* rand(n1,s1) - 1;%create n1 row s1 column array, its value range is between -1 or 1 if bip == 1,

ab = hardlims(ab); else,

ab = hardlim(ab); end;

% Antigen (Ag) chains

ag = 2 .* rand(n2,s2) - 1; if bip == 1,

6

ag = hardlims(ag); else,

ag = hardlim(ag); end;

% End Function CADEIA

%------免疫粒子群优化算法(Artificial Immune - Particle Swarm Optimization)

function [x,y,Result]=PSO_AI(func) % Example [x, y,minvalue] = PSO_AI('Foxhole') clc;

subplot(2,2,1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% plot 1 draw(func);

title([func, ' Function']); tic

format long;

%------给定初始化条件---------------------------------------------- c1=1.4962; %学习因子1 c2=1.4962; %学习因子2 w=0.7298; %惯性权重 MaxDT=200; %最大迭代次数 D=2; %搜索空间维数(未知数个数)

N=100; %初始化群体个体数目

eps=10^(-20); %设置精度(在已知最小值时候用)

DS=10; %每隔DS次循环就检查最优个体是否变优

replaceP=0.6; %粒子的概率大于replaceP将被免疫替换

minD=1e-015; %粒子间的最小距离

Psum=0; %个体最佳的和

range=100; count = 0;

%------初始化种群的个体------------

for i=1:N

for j=1:D x(i,j)=-range+2*range*rand; %随机初始化位置 v(i,j)=randn; %随机初始化速度

end end

%------先计算各个粒子的适应度,并初始化Pi和Pg----------------------

for i=1:N

%p(i)=Foxhole(x(i,:),D); %fitness是计算各个粒子适应度的函数,见文件fitness.m %%%%%%%%***************************************************** p(i)=feval(func,x(i,:));

y(i,:)=x(i,:); end

pg=x(1,:); %Pg为全局最优 for i=2:N if

feval(func,x(i,:))

%------进入主要循环,按照公式依次迭代,直到满足精度要求------------

for t=1:MaxDT for i=1:N

7

v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:)); x(i,:)=x(i,:)+v(i,:); if

feval(func,x(i,:))

p(i)=feval(func,x(i,:)); %%%%%%%%%%%%%%%**************************************************************************************

y(i,:)=x(i,:); end if

p(i)

subplot(2,2,2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plot 1

bar(pg,0.25);

axis([0 3 -40 40 ]) ; title (['Iteration ', num2str(t)]); pause (0.1);

subplot(2,2,3); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plot 2

plot(pg(1,1),pg(1,2),'rs','MarkerFaceColor','r', 'MarkerSize',8) hold on;

plot(x(:,1),x(:,2),'k.'); set(gca,'Color','g') hold off; grid on;

axis([-100 100 -100 100 ]) ;

title(['Global Min = ',num2str(p(i))]);

xlabel(['Min_x= ',num2str(pg(1,1)),' Min_y= ',num2str(pg(1,2))]); end end

Pbest(t)=feval(func,pg) ; %%%%%%%%************************************************************************************************************

% if

Foxhole(pg,D)

%-----------开始进行免疫---------------- if t>DS

if mod(t,DS)==0 && (Pbest(t-DS+1)-Pbest(t))<1e-020 %如果连续DS代数,群体中的最优没有明显变优,则进行免疫.

%在函数测试的过程中发现,经过一定代数的更新,个体最优不完全相等,但变化非常非常小,

%我认为这个时候也应用免疫了,所以我没有用“Pbest(t-DS+1)=Pbest(t)”作为判断条件,

%不过“(Pbest(t-DS+1)-Pbest(t))<1e-020”是否合理也值得探讨。

for i=1:N %先计算出个体最优的和

8

Psum=Psum+p(i); end

for i=1:N %免疫程序 for

j=1:N %计算每个个体与个体i的距离

distance(j)=abs(p(j)-p(i)); end num=0; for

j=1:N %计算与第i个个体距离小于minD的个数 if distance(j)

num=num+1; end end

PF(i)=p(N-i+1)/Psum; %计算适应度概率

PD(i)=num/N; %计算个体浓度

a=rand; %随机生成计算替换概率的因子

PR(i)=a*PF(i)+(1-a)*PD(i); %计算替换概率 end

for i=1:N

if PR(i)>replaceP x(i,:)=-range+2*range*rand(1,D);

subplot(2,2,4); axi; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plot 4

plot(x(i,1),x(i,2),'k*'); grid on;

axis([-100 100 -100 100 ]) ;

title(['New Min = ',num2str( feval(func,x(i,:)))]); %%%%%%%%%*******************************************************************************

xlabel(['Immune ',num2str(count)]); pause (0.2); count=count+1; end end end end end

%------最后给出计算结果

x=pg(1,1); y=pg(1,2);

Result=feval(func,pg); %%%%%%%%%%%***************************************************************************************************************** toc

%------算法结束-------------------------

function probabolity(N,i) PF=p(N-i)/Psum;%适应度概率 disp(PF); for jj=1:N

distance(jj)=abs(P(jj)-P(i)); end num=0;

for ii=1:N

if distance(ii)

PD=num/N; %个体浓度 PR=a*PF+(1-a)*PD; %替换概率 % result=PR;

9

差分进化算法

function [sol]= DE(func)

%% Example [sol]= DE('Foxhole') tic

popsize= 100; lb=[-100 -100]; ub=[100 100];

[sol ]= diffevolve(func, popsize, lb, ub); toc end

function [sol, fval, evals] = diffevolve(varargin)

%DIFFEVOLVE Differential Evolution Optimization %

% Usage:

% sol = DIFFEVOLVE(PROBLEM)

% sol = DIFFEVOLVE(func, popsize, lb, ub)

% sol = DIFFEVOLVE(func, popsize, lb, ub, 'option1', value1, ...) %

% [sol, fval] = DIFFEVOLVE(...) % [sol, fval, evals] = DIFFEVOLVE(...) %

% DIFFEVOLVE(func, popsize, lb, ub) tries to find the global optimum of % the fitness-function [func], using a transversal differential evolution

% strategy. The population size set by [popsize], and the boundaries for % each dimension are set by the

vectors [lb] and [ub], respectively. %

% [sol, fval, evals] =

DIFFEVOLVE(...) returns the trial vector found to

% yield the global minimum in [sol], and the corresponding function value % by [fval]. The total amount of function evaluations that the algorithm

% performed is returned in [evals]. %

% The function [func] must accept a vector argument of length [N], equal to

% the number of elements in the vectors [lb] or [ub]. Also, the function

% must be vectorized so that

inserting a matrix of [popsize]x[N] will return

% a vector of size [popsize]x[1] containing the corresponding function values

% for the [N] trial vectors. %

% The default control parameters DIFFEVOLVE uses, are %

% -1 < F < 1 scaling parameter for the difference vector. % By

default, it is randomly selected from the

% range [-1, 1] for each individual in each

% iteration. %

% crossconst = 0.9 Probability for crossover. %

% convergence = 100 Maximum amount of iterations the best %

individual ever found should remain the best

% individual before the algorithm converges. %

10

本文来源:https://www.bwwdw.com/article/135t.html

Top