多目标优化中的非支配排序算法

多目标优化中的非支配排序算法
以NSGA-II为例
多目标优化指的是针对多个目标函数,去寻找一组最优解,形式如下:
在这里插入图片描述其中*fi(x)*是各单一的目标函数
但是多目标优化问题通常面临多个目标函数无法同时达到最优,为了解决这一问题,提出了pareto-Optimality的概念,
针对pareto-Optimality,有几个概念:
1.非支配解:假设任何二解S1 及S2 对所有目标而言,S1均优于S2,则我们称S1 支配S2,若S1 的解没有被其他解所支配,则S1 称为非支配解(不受支配解),也称Pareto解
支配解:若解S2的所有目标均劣于S1,则称S1优于S2,也称S1支配S2,S2为受支配解。
因此现在的首要任务是寻找解空间里面所有的Pareto解,找到所有Pareto解之后,这些解组成的平面叫做Pareto前沿面(Non-dominated front)。在目标函数较多时,前沿面通常为超曲面。
非支配解排序(Non-dominated Sorting)

  1. 设所有解的集合为S,现从中找出非支配解集合,记为F1

  2. 令S=S-F1,从S中再找出非支配解集合,记为F2

  3. 重复第二步,直到S为空集

将每次找出的非支配解进行排序如下:

{F1,F2,…,Fn}
例如:有两个目标函数Time(f1(x)),Cost(f2(x)),通过求解,我们获得了一组pareto解集,如下图所示:
多目标优化中的非支配排序算法_第1张图片
对这个解集进行排序:
第一轮:我们发现A,B,D,F不能被其他解所支配,则这是第一组非支配解集;
然后我们针对剩余解集,C,E,G,H,I进行排序,C,E,G不能被其他解所支配,组成第二组非支配解集;
剩余的H,I,不能彼此支配,所以组成第三组非支配解集。
通过这个过程我们发现,非支配排序实际上就是“不断的剔除非支配解集,将目标值大的保留下来,然后进一步处理”。
matlab代码实现过程:

clear all
close all
functionvalue=[2 7.5;3 6;3 7.5;4 5;4 6.5;5 4.5;5 6;5 7;6 6.5];%当前的非支配解集
fnum=0;                                             %当前分配的前沿面编号,就是上述的第一轮,第二轮,第三轮
cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号
frontvalue=zeros(size(cz));                         %每个个体的前沿面编号
[functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序,第一位目标值相同,
%就对第二维目标进行排序
 while ~all(cz)
              fnum=fnum+1;
              d=cz;
              for i = 1:size(functionvalue,1)
                  if ~d(i)
                     for j=i+1:size(functionvalue,1)
                        if ~d(j)
                          k=1;
                          for m=2:size(functionvalue,2)
                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)%将目标值大的解保留下来,来进行下一次排序,
%该过程通过d(j)=true实现
                                    k=0;
                                    break
                                end
                            end
                            if k
k
                                d(j)=true;
                            end
                         end
                    end
                    frontvalue(newsite(i))=fnum;
                    cz(i)=true;
                end
            end                                     
         endhon

```python
本文的数据来源于https://zhuanlan.zhihu.com/p/125161075,感谢该博客的指导

你可能感兴趣的:(排序算法,算法,matlab)