%差分进化算法的程序 %来自中南信息院
function [xb,fbest]=f_DE(fun,lx,lb,ub,Np,maxkss)
%lx为变量维数,lb为下界,ub为上界约束条件,maxkss为最大迭代次数,Np为种群规模 %fun是目标函数,fun函数的输入为行向量 %xb为最优解,fbest为最优解目标函数值 %lb,ub以行向量的形式输入 warning off% minpara=lb; maxpara=ub;
Pro=@(x)min(maxpara,max(minpara,x)); %Np=50;%种群规模 CR=0.7;%变异系数 K=0.5;% Px=[];
for k=1:Np;Px(k,:)=Pro(minpara+rand(1)*(maxpara-minpara));end; fPx=[]; for i=1:Np;
try fPx(i)=fun(Px(i,:));catch fPx(i)=Inf;end; end;
for kss=1:maxkss; %disp(fPx)
[fbest,lib]=min(fPx);xb=Px(lib,:);disp(fbest),
Pv=[];vary=1; for i=1:Np;
sb=randperm(Np);
r1=sb(1);r2=sb(2);r3=sb(3);
xr1=Px(r1,:);xr2=Px(r2,:);xr3=Px(r3,:); if vary==1;vi=xb+K*(xr1-xr2); elseif vary==2;vi=xr1+K*(xr2-xr3);
elseif vary==3;xi=Px(i,:);vi=xi+K*(xb-xi)+K*(xr1-xr2); end;
vi=Pro(vi); Pv(i,:)=vi; end;
Pu=Px;
for i=1:Np;%rnbri=randint(1,1,[1,lx]); rnbri=round(rand()*lx); for j=1:lx;
if (rand(1)<=CR)|(j==rnbri);Pu(i,j)=Pv(i,j);end; end;
end;
%族内竞争
Pxn=Px;fPxn=fPx; for i=1:Np;
ui=Pro(Pu(i,:));
try fPui=fun(ui);catch fPui=Inf;end;
if fPui<=fPx(i);Pxn(i,:)=ui;fPxn(i)=fPui;end; end;
Px=Pxn;fPx=fPxn; end;