非支配快速排序算法详解

对NSGA-II的一个学习记录
        

为易于理解,只用三个点举例子。

Np=3;                       %三个点
current_vector = [1:1:Np]'; %当前向量
current_pf=1;               %先找F1
RANK = zeros(Np,1);         %RANK初始化
all_perm = [repmat([1:1:Np]',Np',1), reshape(repmat([1:1:Np],Np,1),Np^2,1)];%生成两列
all_perm(all_perm(:,1)==all_perm(:,2),:) = [];                              %每个点和其余比较
d=[0 1 0 0 1 1];            %假设支配关系
dominated_particles = unique(all_perm(d==1,2));%依次找到各个点是否受人支配,不在乎受几个人支配,只要受人支配了,那他就不是当前要找的等级。
non_dom_idx = ~ismember(current_vector,dominated_particles);%找到非支配的点的位置,这是一个逻辑值
RANK(current_vector(non_dom_idx)) = current_pf;             %让这些位置成为当前等级
all_perm(ismember(all_perm(:,1),current_vector(non_dom_idx)),:) = [];%找到以后,删除,因为一个点只能属于一个等级
all_perm(ismember(all_perm(:,2),current_vector(non_dom_idx)),:) = [];%找到以后,删除,因为一个点只能属于一个等级
current_vector(non_dom_idx) = [];%当前向量中删除那些非支配点
current_pf = current_pf + 1;     %等级+1,找下一个等级。



思路以及程序实现过程即为上述。其实在非支配快速排序中还要判断是否已经把所有粒子给分好等级了。有两个跳出循环的地方
1、判断当前向量中是否只有一个点了,要是就一个点了,那他就是最后一个等级了,直接跳出就好了;
2、判断当前向量中,是否没有更多空间去放等级了。(没看太明白,这块直接跳出了,等级也没加,可能就是一个判断的过程。)不影响分等级。

有两个函数,快速非支配排序和比较函数

function [RANK] = FastNonDominatedSorting_Vectorized(fitness)% InitializationNp = size(fitness,1);RANK = zeros(Np,1);current_vector = [1:1:Np]';current_pf = 1;all_perm = [repmat([1:1:Np]',Np',1), reshape(repmat([1:1:Np],Np,1),Np^2,1)];all_perm(all_perm(:,1)==all_perm(:,2),:) = []; %每个个体去和别人比。  一个个体有两个目标函数值% Computing each Pareto Frontwhile ~isempty(current_vector)                 %非空,就是我这100个个体还没分完等级呢。% Check if there is only a single particleif length(current_vector) == 1RANK(current_vector) = current_pf;break;end% Non-dominated particles% Note: nchoosek has an exponential grow in computation time, so% it's better to take all the combinations including repetitions using a% loops (quasi-linear grow) or repmats (linear grow)%all_perm = nchoosek(current_vector,2);   %all_perm = [all_perm; [all_perm(:,2) all_perm(:,1)]];     d = dominates(fitness(all_perm(:,1),:),fitness(all_perm(:,2),:));%d是一个逻辑值,他判断了所有个体和单个个体的支配关系。第一列是2到200,第二列全是1,先判断2到200是不是支配了1。以此类推。dominated_particles = unique(all_perm(d==1,2)); % 找到被人支配的,unique就是不管是谁支配了1,不管有几个,我只计数一个% Check if there is no room for more Pareto Frontsif sum(~ismember(current_vector,dominated_particles)) == 0break;end% Update ranks and current_vector  更新等级non_dom_idx = ~ismember(current_vector,dominated_particles); %找出那些没有人支配的所在的位置,然后在current_vector中挑出来,就是第一等级RANK(current_vector(non_dom_idx)) = current_pf;              %把这些定为第一等级,其余位置都是0,我不在乎他是第几等级。用逻辑值来判断all_perm(ismember(all_perm(:,1),current_vector(non_dom_idx)),:) = [];all_perm(ismember(all_perm(:,2),current_vector(non_dom_idx)),:) = [];%判断完的就把剔除出去current_vector(non_dom_idx) = [];                                    %判断完的就剔除出去了current_pf = current_pf + 1;                                         %找下一等级的去,知道找完了才停下来。end
end
% Function that returns true if x dominates y and false otherwise
function d = dominates(x,y)d = (all(x<=y,2) & any(x<y,2));
end

只是记录学习,如有错误,请及时指出,谢谢大家。

参考:mathworks NSGA-II(2019年更新的那版)

非支配快速排序算法详解相关推荐

  1. 快速排序算法详解(原理,时间复杂度,实现代码)

    快速排序算法详解(原理.实现和时间复杂度) 快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出. 快 ...

  2. 十大经典排序算法-快速排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  3. 经典排序算法(2)——快速排序算法详解

    快速排序(Quick Sort)也是一种典型的交换排序算法,通过交换数据元素的位置进行排序. 一.算法基本思想 (1)基本思想 快速排序的基本思想就是:通过一趟排序将要排序的数据分割成独立的两部分,其 ...

  4. 快速排序 算法 详解 及 深度优化

    下面简介经典算法  快速排序算法 实现及优化. (欢迎大家指点,继续提出优化的方法,共同提高) 基本思想:(以按从小到大排序为例说明)通过多次的排序,每次的排序均将要排序的数组分为两部分,前一部分均比 ...

  5. Java的快速排序算法详解

    在进入这个话题之前大家可以想想,如果给你一个无序数组,要你处理成一个有序数组,你会怎么做? 可能是双循环的冒泡排序,可能拆开成多个子集合的再合并的希尔排序,排序算法很多,而现在要介绍的是另一种排序方法 ...

  6. 排序算法,最全的10大排序算法详解(Sort Algorithm)

    文章目录 排序算法,最全的10大排序算法详解(Sort Algorithm) 排序算法分类 排序算法稳定性 时间复杂度(time complexity) 1#时间复杂度的意义 2#基本操作执行次数 如 ...

  7. 排序算法(五)——堆排序算法详解及Python实现

    本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...

  8. 十大经典排序算法-桶排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  9. 十大经典排序算法-选择排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  10. 十大经典排序算法-希尔排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

最新文章

  1. 学会处理ASP.NET的页面和请求状态信息 (转载)
  2. firefox固定为应用标签的功能很好用
  3. 【转载】 C#使用Math.Abs返回数值的绝对值
  4. python零基础实例-零基础学习Python开发练习100题实例(1)
  5. 个人日报0701-0703
  6. powershell 下独立silent 安装 浏览器问题
  7. Axure external link打开原理
  8. egg --- 配置连接mysql 创建模型 插入数据
  9. 工业级光纤收发器如何正确使用和维护?
  10. Silverlight学习笔记(一)——Silverlight够酷吗?
  11. Python matplotlib 线图(plt.plot())
  12. CF 246E. Blood Cousins Return [dsu on tree STL]
  13. BlogEngine
  14. mac input 不支持xls_如何将PDF转换成xls格式的表格
  15. 优化算法——粒子群算法(PSO)
  16. [FAQ15840]MT2503系列充电电流问题
  17. C4D插件X-Particles粒子特效(八)
  18. python随机森林预测案例_Random Forest算法 python实现案例分析
  19. 操作系统 设备基本概念和分类
  20. 大学生如何合理利用计算机,大学生如何安排自己的课余时间?6招,学霸教会你正确使用手机...

热门文章

  1. win7系统查看硬盘序列号步骤
  2. JAVA基础(注释,关键字与标识符)
  3. Maven – 父子 POM 示例
  4. 《利用Python 进行数据分析》第十章:时间序列
  5. 少年派的奇幻漂流 Life of Pi (2012)
  6. VBA打开一个EXCEL文件并在二个文件之间来回操作的代码
  7. 我的生活所感悟出的杂句
  8. 国际能源署: 分散式系统是穷乡能源普及最具经济效益的解方
  9. Spring IoC容器设计原理及高级特性
  10. 《从0到1》读书笔记第2章像1999 年那样狂欢第1记:小结及词汇解析