function [fbest,fbest_index] = H4DE(Np,tao1,D,G,Xmin,Xmax,f,fJud,min0,typo)
% rand('seed',sum(100*clock)); %随机数种子
%%%%%%%初始化种群%%%%%%%
X=zeros(Np,D); %定义空种群的规模Np*D(Np个D维向量)
fbest=zeros(1,G+1); %贯穿整个进化的最优解
fbest_index=fbest; %最优解对应的索引号
% CR=zeros(1,Np);
% CR_pre=CR+0.9;
for n=1:Np
for m=1:D
X(n,m)=Xmin+rand()*(Xmax-Xmin); %Xmin和Xmax都是1X1的数
end
end
np1=Np/4; %1-np1-np2-np3-Np
np2=2*np1;
np3=3*np1;
SliPoint=[np1,np2,np3,Np];
NpSize=[np1,np2-np1,np3-np2,Np-np3];
%%%%%%一共将种群分为四份,初始每份含np个个体,应用?(搜索型)&?(开发型)的策略%%%%%%
fx=f(X); %fx存储g代适应度值
fx_ex=[]; %fx_ex存储g-1代适应度值
%%%%%%%计算个体适应度值%%%%%%%
%%%%%找出适应度值最好的值%%%%%
if typo==1
fbest(1)=min(fx); %最小值优化
end
if typo==2
fbest(1)=max(fx); %最大值优化
end
fbest_index(1)=find(fx==fbest(1)); %找出适应度值最好的值对应的行号(向量标号)
%%%%%%%开始迭代%%%%%%%
for g=1:G
jud=fJud(fbest,g,min0);
if jud==1
break;
end
fx_ex=f(X);
%%%%%%%变异%%%%%%%
% if fbest(g)<tao1
% F=-0.7/G*g+0.9;
% else
% F=rand();
% end
if fbest(g)<tao1
F=-0.7/G*g+0.9;
else
F=rand();
end
% if g~=1 && NpSize(1)==Np/4 && NpSize(2)==Np/4 && NpSize(3)==Np/4 && NpSize(4)==Np/4
% V=DE_rand_1_bin_____2(1,Np,F,X,V);
% else
V=zeros(Np,D); %初始化变异向量种群
V=DE_rand_1_bin_____2(1,SliPoint(1),F,X,V); %%至少含有四个向量
V=DE_best_2_bin_____4(SliPoint(1)+1,SliPoint(2),F,X,fbest_index,g,V); %%至少含有四个向量
V=DE_rand_2_bin_____5(SliPoint(2)+1,SliPoint(3),F,X,V); %%至少含有六个向量
V=DE_ctob_1_bin_____3(SliPoint(3)+1,SliPoint(4),F,X,fbest_index,g,V); %%至少含有两个向量
% end
%%%%%检查是否在可搜索范围内%%%%%
Jud2=[]; %初始化判断向量,用于找出超出搜索范围的位置
Jud2=find((V>Xmax)|(V<Xmin)); %|和&用于向量运算;||和&&用于值运算
L_Jud2=length(Jud2);
if L_Jud2~=0
for ii=1:L_Jud2
V(Jud2(ii))=Xmin+rand()*(Xmax-Xmin);
end
end
%%%%%%%杂交%%%%%%%
U=[];
if fbest(g)<tao1
CR=-0.6/G*g+0.8;
else
CR=rand(1,1);
end
for i=1:Np
rand_j=randperm(D,D);
for j=1:D
randn=rand();
if randn<=CR || j==rand_j(j)
U(i,j)=V(i,j);
else
U(i,j)=X(i,j);
end
end
end
% U=[];
% for i=1:Np
% if rand()<tao2
% CR(i)=CR_pre(i);
% else
% CR(i)=rand();
% end
% CR_pre(i)=CR(i);
% rand_j=randperm(D,D);
% for j=1:D
% randn=rand();
% if randn<=CR(i) || j==rand_j(j)
% U(i,j)=V(i,j);
% else
% U(i,j)=X(i,j);
% end
% end
% end
%%%%%%%选择%%%%%%%
fx_cur=f(X); %分别计算当代每个X和U个体的适应度值
fu_cur=f(U);
if typo==1
temp_index=find(fu_cur<fx_cur); %最小值优化
X(temp_index,:)=U(temp_index,:);
end
if typo==2
temp_index=find(fu_cur>fx_cur);
X(temp_index,:)=U(temp_index,:); %最大值优化
end
%选择后得到了下一代的新种群(覆盖上一代)
%%%%%%%选出新一代中的最优个体,并和当前最优值比较%%%%%%%
fx_cur=f(X);
fx=fx_cur;
%%%%%%%调整不同算子的种群大小%%%%%%%
JNp1=length(find(fx(1:SliPoint(1))<fx_ex(1:SliPoint(1)))); %找到子种群1中适应度值进步的个数
JNp2=length(find(fx((SliPoint(1)+1):SliPoint(2))<fx_ex((SliPoint(1)+1):SliPoint(2)))); %找到子种群2中个数
JNp3=length(find(fx((SliPoint(2)+1):SliPoint(3))<fx_ex((SliPoint(2)+1):SliPoint(3))));
JNp4=length(find(fx((SliPoint(3)+1):SliPoint(4))<fx_ex((SliPoint(3)+1):SliPoint(4))));
if JNp1==0 & JNp2==0 & JNp3==0 & JNp4==0
SliPoint=[Np/4,Np/2,Np*3/4,Np];
NpSize=[Np/4,Np/4,Np/4,Np/4]
else
rate1=JNp1/NpSize(1);
rate2=JNp2/NpSize(2);
rate3=JNp3/NpSize(3);
rate4=JNp4/NpSize(4);
RateP=[rate1;rate2;rate3;rate4];
[SliPoint,NpSize] = Adjust_SliPoint(RateP,SliPoint); %更新np的划分
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if typo==1 %最小值优化
fbest_cur=min(fx_cur);
fbest_index_cur=find(fx_cur==fbest_cur);
if fbest_cur<fbest(g)
fbest(g+1)=fbest_cur;
fbest_index(g+1)=fbest_index_cur(1);
else
fbest(g+1)=fbest(g);
fbest_index(g+1)=fbest_index(g);
end
end
if typo==2 %最大值优化
fbest_cur=max(fx_cur);
fbest_index_cur=find(fx_cur==fbest_cur);
if fbest_cur>fbest(g)
fbest(g+1)=fbest_cur;
fbest_index(g+1)=fbest_index_cur(1);
else
fbest(g+1)=fbest(g);
fbest_index(g+1)=fbest_index(g);
end
end
end
end