function [Gbest,GbestScore,Obj]=HROFCM(C,inDim,Data,maxIter,pop,x_min,x_max)
N = pop; %水稻群个数
D = C*inDim; %基因维度
maxTime=50; %最大杂交次数
Xmax=1; %位置最大值
Xmin=0; %位置最小值
lb = x_min;
ub = x_max;
maxIteration=maxIter;
iteration=1;
maleSterile = zeros(N/3,D);
maintainer = zeros(N/3,D);
restoreLine = zeros(N/3,D);
%初始化种群个体,
x = rand(N,D)*(Xmax-Xmin)+Xmin;
%计算各个体的适应度函数值
Obj=zeros(1,maxIteration);
while(iteration<maxIteration+1)
%calculate the fitness
for i=1:N
pbest(i)=fcmFitness(x(i,:),C,Data);
end
%Sort the population from best to worst by f(X).
[Spbest,index]= sort(pbest);%
Gbest=x(index(1),:);%%%谁让你在这找索引的最后一个了
Obj(iteration)=Spbest(1);
for j=1:N/3
% maleSterile(j,:)=x(index(j),:);%
% restoreLine(j,:)=x(index(N/3+j),:);%
% maintainer(j,:)=x(index(N/3+j+N/3),:);%
maintainer(j,:)=x(index(j),:);%
restoreLine(j,:)=x(index(N/3+j),:);%
maleSterile(j,:)=x(index(N/3+j+N/3),:);%
end
%%%%随机杂交形式
for i=1:N/3
xa=randperm(N/3,1);
xb=randperm(N/3,1);
x_new = zeros(1,D);%
%for j=1:D
r1 = -1+2*rand(1,D);%生成-1到1之间的随机数
r2 = -1+2*rand(1,D);%生成-1到1之间的随机数
% while(r1+r2==0)
% r2 = -1+2*rand(1,1);%r1+r2!=0
% end
%x_new(1,j)=(r1*maleSterile(i,j)+maintainer(xb,j)*r2)/(r1+r2);
x_new(1,:)=(r1.*maleSterile(i,:)+maintainer(xb,:).*r2)/(r1+r2);
% x1=limitedArrange(x_new(1,j),Xmin,Xmax);
% x_new(1,j)=x1;
Flag4ub=x_new>ub;
Flag4lb=x_new<lb;
x_new=(x_new.*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
% x1=limitedArrange(x_new(1,:),Xmin,Xmax);
% x_new=x1;
% end
if(fcmFitness(x_new,C,Data) < fcmFitness(maleSterile(i,:),C,Data))%%如果新产生的个体适应度值比
maleSterile(i,:)=x_new;
end
end
%%%%%自交过程
selfingTimes=zeros(1,N/3);%初始化所有恢复系水稻自交次数
% w=wMax-iter*((wMax-wMin)/Max_iteration);
for k=1:N/3
if(selfingTimes(k)<maxTime)
sr=randperm(N/3,1);
r3 = rand(1,D);
new_Restore=restoreLine(k,:)+r3.*(Gbest-restoreLine(sr,:));
Flag4ub=new_Restore>ub;
Flag4lb=new_Restore<lb;
x_new=(new_Restore.*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
if(fcmFitness(new_Restore,C,Data)<fcmFitness(restoreLine(k,:),C,Data))
restoreLine(k,:)=new_Restore;
if(fcmFitness(new_Restore,C,Data)<fcmFitness(Gbest,C,Data))
Gbest=new_Restore;
end
selfingTimes(k)=0;
else
selfingTimes(k)=selfingTimes(k)+1;
end
else
%%%%%%重置
restoreLine(k,:)=restoreLine(k,:)+rand(1,D)*(Xmax-Xmin)+Xmin;
end
end
iteration=iteration+1
% break
% end
x=[maintainer;restoreLine;maleSterile];
end
GbestScore=Obj(maxIteration);
%最优值
% figure
% x=1:iteration-1;
% plot(x,Obj(1,1:iteration-1))
% xlabel('迭代次数');
% ylabel('适应度值');
% title('适应度进化曲线');