SortPopulation
function [pop, F] = SortPopulation(pop)
% Sort Based on Crowding Distance
[~, CDSO] = sort([pop.CrowdingDistance], 'descend');
pop = pop(CDSO);
% Sort Based on Rank
[~, RSO] = sort([pop.Rank]);
pop = pop(RSO);
% Update Fronts
Ranks = [pop.Rank];
MaxRank = max(Ranks);
F = cell(MaxRank, 1);
for r = 1:MaxRank
F{r} = find(Ranks == r);
end
end
输入参数
pop: 一个结构数组,表示种群,其中每个个体有两个属性CrowdingDistance和Rank。
输出参数
pop: 按照拥挤距离和等级排序后的种群。F: 一个细胞数组,其中每个元素表示一个前沿的索引集合。
代码详解
function [pop, F] = SortPopulation(pop)
定义了函数 SortPopulation,输入是 pop,输出是 pop 和 F。
1. 按拥挤距离降序排序
[~, CDSO] = sort([pop.CrowdingDistance], 'descend');
pop = pop(CDSO);
[pop.CrowdingDistance]将pop中每个个体的拥挤距离提取出来,形成一个数组。sort(..., 'descend')按照拥挤距离降序排序,并返回排序的索引CDSO。pop = pop(CDSO)根据索引CDSO对pop进行重排,使得拥挤距离大的个体排在前面。
2. 按等级升序排序
[~, RSO] = sort([pop.Rank]);
pop = pop(RSO);
[pop.Rank]将pop中每个个体的等级提取出来,形成一个数组。sort(...)按照等级升序排序,并返回排序的索引RSO。pop = pop(RSO)根据索引RSO对pop进行重排,使得等级低的个体排在前面。
3. 更新前沿
Ranks = [pop.Rank];
MaxRank = max(Ranks);
F = cell(MaxRank, 1);
for r = 1:MaxRank
F{r} = find(Ranks == r);
end
[pop.Rank]获取排序后的种群的等级数组。MaxRank = max(Ranks)找出最高等级(即前沿的数量)。F = cell(MaxRank, 1)初始化一个细胞数组F,其中每个单元格将存储一个前沿。for r = 1:MaxRank循环从1到最高等级:F{r} = find(Ranks == r)找出等级为r的个体索引,并将这些索引存储在F{r}中。
代码总结
函数 SortPopulation 的作用是先按照拥挤距离对种群进行降序排序,再按照等级进行升序排序,然后将种群划分为不同的前沿。最终输出的是排序后的种群和前沿的索引集合。
代码优化
要优化这个函数,可以从多个方面入手,包括减少冗余计算、优化排序操作等。以下是优化版本的 SortPopulation 函数:
function [pop, F] = SortPopulation(pop)
% Extract Rank and CrowdingDistance arrays
Ranks = [pop.Rank];
CrowdingDistances = [pop.CrowdingDistance];
% Sort based on Rank and Crowding Distance
[~, sortedIndices] = sortrows([Ranks(:), -CrowdingDistances(:)], [1 2]);
pop = pop(sortedIndices);
% Update Fronts
MaxRank = max(Ranks);
F = cell(MaxRank, 1);
for r = 1:MaxRank
F{r} = find(Ranks(sortedIndices) == r);
end
end
详细优化步骤
-
提取
Rank和CrowdingDistance数组- 减少重复访问
pop结构体的次数,提取出Rank和CrowdingDistance数组。
Ranks = [pop.Rank]; CrowdingDistances = [pop.CrowdingDistance]; - 减少重复访问
-
同时排序
Rank和CrowdingDistance- 使用
sortrows函数对Rank和CrowdingDistance数组进行多列排序。这样可以在一次排序中同时满足两个排序条件。 sortrows([Ranks(:), -CrowdingDistances(:)], [1 2])按照Rank升序和CrowdingDistance降序进行排序。
[~, sortedIndices] = sortrows([Ranks(:), -CrowdingDistances(:)], [1 2]); pop = pop(sortedIndices); - 使用
-
更新前沿
- 使用排序后的索引数组
sortedIndices来更新前沿。这样可以避免多次计算相同的排序结果。
MaxRank = max(Ranks); F = cell(MaxRank, 1); for r = 1:MaxRank F{r} = find(Ranks(sortedIndices) == r); end - 使用排序后的索引数组
性能优化分析
- 减少冗余计算:通过一次性提取
Rank和CrowdingDistance数组,减少对结构体数组pop的多次访问。 - 优化排序操作:使用
sortrows函数一次性完成基于两个标准的排序,减少排序次数。 - 简化前沿更新:直接使用排序后的索引数组进行前沿更新,避免了在排序后再次访问未排序的数组。
这个优化版本在计算效率上更高,代码也更简洁清晰。
浙公网安备 33010602011771号