rowsindex=0; for i=1:rank-1 l_f=length(front(i).fr); if rowsindex+l_f>popsize Sol=chromosome_sorted(1:rowsindex+l_f,:); %normalization fobjmin=min(Sol(:,N+1:N+M)); fobjmax=max(Sol(:,N+1:N+M)); for lr=1:rowsindex+l_f Sol(lr,N+M+2:N+M+3)=(Sol(lr,N+1:N+2)-fobjmin)./(fobjmax-fobjmin); end ind_mind=zeros(1,rowsindex+l_f); disM=Inf*ones(rowsindex+l_f,rowsindex+l_f); for lp=1:rowsindex+l_f-1 for lq=lp+1:rowsindex+l_f disM(lp,lq)=norm(Sol(lp,N+M+2:N+M+3)-Sol(lq,N+M+2:N+M+3)); disM(lq,lp)=disM(lp,lq); end end for lr=1:rowsindex+l_f indlr1=find(disM(lr,:)==min(disM(lr,:)));indlr=indlr1(1); ind_mind(lr)=indlr;%与个体lr距离最小的个体为indlr chromosome_sorted(lr,N+M+4)=min(disM(lr,:)); end indb1=find(Sol(:,N+1)==min(Sol(:,N+1))); indb2=find(Sol(:,N+2)==min(Sol(:,N+2))); chromosome_sorted(indb1,N+M+4)=Inf; chromosome_sorted(indb2,N+M+4)=Inf; break; end rowsindex=rowsindex+l_f; end % chromosome_sorted(:,N+M+4)=sum(chromosome_sorted(:,N+M+2:N+M+3),2); % chromosome_sorted(:,N+M+4)=sqrt(chromosome_sorted(:,N+M+2).^2+chromosome_sorted(:,N+M+3).^2); chromosome_NDS_CD1=[chromosome_sorted(:,1:N+M) zeros(popsize1,1) chromosome_sorted(:,N+M+1) chromosome_sorted(:,N+M+4)]; % Final Output Variable end
时间: 2024-04-11 18:33:06 浏览: 114
这段代码的功能是对染色体进行排序和归一化,并计算染色体之间的距离。下面是该代码的解释:
1. 首先,定义变量rowsindex为0,用于记录已处理的染色体数量。
2. 使用循环遍历rank-1个前沿(front)。
3. 计算当前前沿的长度l_f。
4. 判断如果当前处理的染色体数量加上当前前沿长度超过了popsize(总染色体数量),则执行以下操作:
- 提取已处理的染色体Sol,包括前N列(表示基因)和第N+1到N+M列(表示目标函数值)。
- 对Sol中的目标函数值进行归一化,即将目标函数值映射到[0, 1]的范围内。首先找出Sol中目标函数值的最小值和最大值,并分别存储在fobjmin和fobjmax中。然后对Sol中每个个体的目标函数值进行归一化计算,将结果存储在Sol的第N+M+2到N+M+3列中。
- 初始化变量ind_mind为长度为rowsindex+l_f的零向量,用于存储每个个体与距离最近的个体的索引。
- 初始化距离矩阵disM为(rowsindex+l_f)×(rowsindex+l_f)的全为正无穷的矩阵。
- 使用两层循环计算每对个体之间的欧氏距离,并将结果存储在disM矩阵中。
- 对于每个个体lr,找到与它距离最近的个体的索引indlr,将indlr存储在ind_mind(lr)中,并将个体lr与indlr之间的距离存储在chromosome_sorted的第N+M+4列中。
- 找出目标函数值最小的两个个体的索引,分别存储在indb1和indb2中。然后将这两个个体在chromosome_sorted的第N+M+4列中的值设为正无穷,以排除它们的影响。
- 跳出循环。
5. 如果染色体数量没有超过popsize,则将rowsindex增加l_f,继续处理下一个前沿。
6. 最后,将chromosome_sorted中的染色体基因部分、第N+M+1列(表示拥挤度)以及第N+M+4列(表示距离)提取出来,存储在chromosome_NDS_CD1中作为最终输出变量。
阅读全文