indrank1=find(parent_selected(:,N+M+2)==1); l_rank=length(indrank1); fminO=min(parent_selected(indrank1,N+1:N+M)); min_dis=Inf; for l=1:l_rank dista=norm(parent_selected(indrank1(l),N+1:N+M)-fminO); if dista<min_dis min_dis=dista; indbest=indrank1(l); end end parent_selected_best=parent_selected(indbest,:);
时间: 2024-04-08 20:32:31 浏览: 16
这段代码是用于在一组选择的父代中找到最优解的过程。代码首先找到满足条件的父代,其中`parent_selected`是选择的父代集合,`N`是一个参数,`M`是另一个参数。然后,代码计算了父代集合中满足条件的个数,并将其存储在变量`l_rank`中。
接下来,代码找到了父代集合中最小的目标函数值,并将其存储在变量`fminO`中。然后,代码初始化了一个变量`min_dis`,用于存储最小距离的初始值(无穷大)。
接着,代码使用一个循环遍历父代集合中满足条件的父代。在循环中,代码计算了当前父代与最小目标函数值之间的欧氏距离,并将其存储在变量`dista`中。如果当前距离小于最小距离`min_dis`,则更新最小距离和最优解下标`indbest`。
最后,代码使用`indbest`找到了最优解对应的父代,并将其存储在变量`parent_selected_best`中。
总体来说,这段代码通过计算父代集合中与最小目标函数值之间的欧氏距离,找到了最优解对应的父代。
相关问题
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
这段代码的功能是对染色体进行排序和归一化,并计算染色体之间的距离。下面是该代码的解释:
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中作为最终输出变量。
ind_rank1=find(parent_selected(:,N+M+2)==1);lrank1=length(ind_rank1);%非支配排序为1的解及个数 BestParent_pool=parent_selected(ind_rank1,:); if lrank1~=1 fmaxM=max(BestParent_pool(:,N+1:N+M)); fminM=min(BestParent_pool(:,N+1:N+M)); if fmaxM~=fminM fnsum=sqrt(((BestParent_pool(:,N+1)-fminM(1))/(fmaxM(1)-fminM(1))).^2+((BestParent_pool(:,N+2)-fminM(2))/(fmaxM(2)-fminM(2))).^2); indb1=find(fnsum==min(fnsum));indb=indb1(1); BS=parent_selected(indb,:); else BS=BestParent_pool(1,:); end else BS=parent_selected(ind_rank1,:); end
这段代码是在进行非支配排序的操作。首先,根据条件 `parent_selected(:,N+M+2)==1`,找到非支配排序为1的解并计算个数。然后,将这些解存储在变量 `BestParent_pool` 中。
接下来,如果非支配排序为1的解的个数不等于1,则执行以下操作:
1. 计算 `BestParent_pool` 中每个解在目标函数中各目标的最大值和最小值,分别存储在变量 `fmaxM` 和 `fminM` 中。
2. 如果 `fmaxM` 不等于 `fminM`,则计算每个解与最小值之间的标准化距离,并选择距离最小的解作为最优解。具体计算方式是将每个目标函数值减去最小值,然后除以最大值与最小值之差,最后计算欧氏距离。
3. 如果 `fmaxM` 等于 `fminM`,则直接选择 `BestParent_pool` 中的第一个解作为最优解。
如果非支配排序为1的解的个数等于1,则直接将该解赋值给变量 `BS`。
总之,这段代码的作用是找到满足非支配排序为1的最优解,并将其存储在变量 `BS` 中。