快速的非支配排序

在NSGA进行非支配排序时,规模为N的种群中的每个个体都要针对M个目标函数和种群中的N-1个个体进行比较,复杂度为O(MN),因此种群中的N个个体都比较结束的复杂度为O(MN2),即每进行一次Pareto分级的时间复杂度为O(MN2)。在最坏的情况下,每个Pareto级别都只含有一个个体,那么需要进行N次分级所需要的时间复杂度则会上升为O(MN3)。鉴于此,论文中提出了一种快速非支配排序法,该方法的时间复杂度为O(MN2)。

该算法需要保存两个量:

(1).支配个数np。该量是在可行解空间中可以支配个体p的所有个体的数量。

(2).被支配个体集合SP。该量是可行解空间中所有被个体p支配的个体组成的集合。

下面是fast_nondominated_sort的伪代码

def fast_nondominated_sort( P ):

F = [ ]

for p in P:

Sp = [ ]

np = 0

for q in P:

if p > q: #如果p支配q,把q添加到Sp列表中

Sp.append( q )

else if p < q: #如果p被q支配,则把np加1

np += 1

if np == 0:

p_rank = 1 #如果该个体的np为0,则该个体为Pareto第一级

F1.append( p )

F.append( F1 )

i = 0

while F[i]:

Q = [ ]

for p in F[i]:

for q in Sp: #对所有在Sp集合中的个体进行排序

nq -= 1

if nq == 0: #如果该个体的支配个数为0,则该个体是非支配个体

q_rank = i+2 #该个体Pareto级别为当前最高级别加1。此时i初始值为0,所以要加2

Q.append( q )

F.append( Q )

i += 1

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

deffast_nondominated_sort(P):

F=[]

forpinP:

Sp=[]

np=0

forqinP:

ifp>q:#如果p支配q,把q添加到Sp列表中

Sp.append(q)

elseifp

np+=1

ifnp==0:

p_rank=1#如果该个体的np为0,则该个体为Pareto第一级

F1.append(p)

F.append(F1)

i=0

whileF[i]:

Q=[]

forpinF[i]:

forqinSp:#对所有在Sp集合中的个体进行排序

nq-=1

ifnq==0:#如果该个体的支配个数为0,则该个体是非支配个体

q_rank=i+2#该个体Pareto级别为当前最高级别加1。此时i初始值为0,所以要加2

Q.append(q)

F.append(Q)

i+=1

下面是C++实现:

C++

void population::nodominata_sort()

//求pareto解(快速非支配排序)

{

int i,j,k;

indivial H[2*popsize];

int h_len=0;

for(i=0;i<2*popsize;i++)

{

R[i].np=0;//支配个数np

R[i].is_domied=0;//被支配的个数

len[i]=0;//初始化

}

for(i=0;i<2*popsize;i++)

{

for(j=0;j<2*popsize;j++)

{

if(i!=j)//自己不能支配自身

{

if(is_dominated(R[i],R[j]))

{

R[i].domi[R[i].is_domied++]=j;

//如果i支配j,把i添加到j的is_domied列表中

}

else if(is_dominated(R[j],R[i]))

R[i].np+=1;

//如果i被j支配,则把np加1

}

}

if(R[i].np==0)//如果该个体的np为0,则该个体为Pareto第一级

{

len_f=1;

F[0][len[0]++]=R[i];//将R[i]归并

}

}

i=0;

while(len[i]!=0)

{

h_len=0;

for(j=0;j

{

for(k=0;k

//对所有在is_domied集合中的个体进行排序

{

R[F[i][j].domi[k]].np--;

if( R[F[i][j].domi[k]].np==0)

//如果该个体的支配个数为0,则该个体是非支配个体

{

H[h_len++]=R[F[i][j].domi[k]];

R[F[i][j].domi[k]].rank=i+1;

}

}

}

i++;

len[i]=h_len;

if(h_len!=0)

{

len_f++;

for(j=0;j

{

F[i][j]=H[j];

}

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

voidpopulation::nodominata_sort()

//求pareto解(快速非支配排序)

{

inti,j,k;

indivialH[2*popsize];

inth_len=0;

for(i=0;i<2*popsize;i++)

{

R[i].np=0;//支配个数np

R[i].is_domied=0;//被支配的个数

len[i]=0;//初始化

}

for(i=0;i<2*popsize;i++)

{

for(j=0;j<2*popsize;j++)

{

if(i!=j)//自己不能支配自身

{

if(is_dominated(R[i],R[j]))

{

R[i].domi[R[i].is_domied++]=j;

//如果i支配j,把i添加到j的is_domied列表中

}

elseif(is_dominated(R[j],R[i]))

R[i].np+=1;

//如果i被j支配,则把np加1

}

}

if(R[i].np==0)//如果该个体的np为0,则该个体为Pareto第一级

{

len_f=1;

F[0][len[0]++]=R[i];//将R[i]归并

}

}

i=0;

while(len[i]!=0)

{

h_len=0;

for(j=0;j

{

for(k=0;k

//对所有在is_domied集合中的个体进行排序

{

R[F[i][j].domi[k]].np--;

if(R[F[i][j].domi[k]].np==0)

//如果该个体的支配个数为0,则该个体是非支配个体

{

H[h_len++]=R[F[i][j].domi[k]];

R[F[i][j].domi[k]].rank=i+1;

}

}

}

i++;

len[i]=h_len;

if(h_len!=0)

{

len_f++;

for(j=0;j

{

F[i][j]=H[j];

}

}

}

}

matlab代码:

MATLAB

%-------非支配排序

fnum=0; %当前分配的前沿面编号

cz=false(1,size(functionvalue,1)); %记录个体是否已被分配编号

frontvalue=zeros(size(cz)); %每个个体的前沿面编号

[functionvalue_sorted,newsite]=sortrows(functionvalue); %对种群按第一维目标值大小进行排序

while ~all(cz) %开始迭代判断每个个体的前沿面,采用改进的deductive sort

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)

k=0;

break

end

end

if k

d(j)=true;

end

end

end

frontvalue(newsite(i))=fnum;

cz(i)=true;

end

end

end

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

%-------非支配排序

fnum=0;%当前分配的前沿面编号

cz=false(1,size(functionvalue,1));%记录个体是否已被分配编号

frontvalue=zeros(size(cz));%每个个体的前沿面编号

[functionvalue_sorted,newsite]=sortrows(functionvalue);%对种群按第一维目标值大小进行排序

while~all(cz)%开始迭代判断每个个体的前沿面,采用改进的deductive sort

fnum=fnum+1;

d=cz;

fori=1:size(functionvalue,1)

if~d(i)

forj=i+1:size(functionvalue,1)

if~d(j)

k=1;

form=2:size(functionvalue,2)

iffunctionvalue_sorted(i,m)>functionvalue_sorted(j,m)

k=0;

break

end

end

ifk

d(j)=true;

end

end

end

frontvalue(newsite(i))=fnum;

cz(i)=true;

end

end

end

NSGA2具体算法实现还在编写中。

matlab 非支配排序,NSGA-II快速非支配排序算法理解相关推荐

  1. 进化计算(四)——NSGA/NSGA II算法详解

    NSGA/NSGA II算法理论学习  -A fast and elitist multiobjective genetic algorithm NSGA-II阅读笔记 引言 概述 为什么引入NSGA ...

  2. nsga2多目标优化之核心知识点(快速非支配排序、拥挤距离、精英选择策略)详解(python实现)

    文章目录 一.多目标优化算法简介 1.基本知识 二.NSGA2算法 1.基本原理 2.快速非支配排序 2.1快速非支配排序 python实现 3.拥挤距离 3.1 拥挤距离python 实现 4.精英 ...

  3. 非支配排序遗传算法c语言,非支配排序遗传算法(NSGA)的研究与应用

    摘要: 多目标优化问题一直是科学和工程研究领域的难题和热点问题.传统的解决方法在处理大维数,多模态等复杂问题上存在许多不足.为了解决这一问题,国内外研究学者在简单遗传算法的基础上,发展出了多种多目标优 ...

  4. NSGAII快速非支配遗传算法二代学习笔记1

    Population种群 nondomination sort非支配排序  nondomination level非支配水平 solution解 rank=fitness 等级/适应度 recombi ...

  5. 进化计算(六)——NSGA II代码实现(Matlab)

    NSGA II代码实现 代码流程图 Code Main 函数选择 种群初始化 非支配排序 拥挤度计算 二进制锦标赛选择算子 SBX&Poly mutation 精英策略选择 目标函数 参考链接 ...

  6. 基于matlab的储能选址定容程序 采用蒙特卡洛随机算法,非粒子群算法

    基于matlab的储能选址定容程序 采用蒙特卡洛随机算法,非粒子群算法 图中每个点代表一种配置方式,红点为最优方式 程序稳定运行,每条语句均有详细注释,0基础可看懂 有对应文献 ID:27120675 ...

  7. s3c2440 IIC AT24C08 (II)非中断模式

    承接上一篇:    http://blog.csdn.net/qq361294382/article/details/51589964 本次实验使用非中断方式实现S3C2440 对于AT24C08 实 ...

  8. NSGA II实例讲解

    NSGA II实例讲解 此文章是[1]的文字版,相关视频原链接见参考资料. 假设有一个圆规问题,目标函数为最小的底面积和最小的侧面积. 底面积=πr^2, 侧面积=πrsh 总的目标函数=底面积+侧面 ...

  9. 《预训练周刊》第45期: 冻结语言模型、提示迁移性、快速文档排序

    No.45 智源社区 预训练组 预 训 练 研究 观点 资源 活动 周刊订阅 告诉大家一个好消息,<预训练周刊>已经开启"订阅功能",以后我们会向您自动推送最新版的&l ...

  10. 微分算法 非侵入式负荷识别_非侵入式负荷监测的识别方法和关键技术

    原标题:非侵入式负荷监测的识别方法和关键技术 在智能电网时代,必须突破目前用户家用电表只能读取用电总量,不能深入分析用户内部负荷成分,获取负荷信息有限的这一瓶颈,以完善用电信息采集系统和智能用电系统. ...

最新文章

  1. 您详细比较三个 CSS 预处理器(框架):Sass、LESS 和 Stylus
  2. 逻辑回归模型(Logistic Regression, LR)基础
  3. hbuilderx简单网页代码_Python爬取网页数据
  4. celeba数据集_Kaggle最新秃头数据集Bald!含20万张图片,江湖传言刷到第一可防脱发()quot;...
  5. Yii框架常见问题汇总
  6. oracle 数字处理函数,Oracle函数-单行函数-数字、日期、日期处理函数
  7. 漫画:什么是JVM的垃圾回收?
  8. CRC校验码计算公式
  9. 扩散模型 (Diffusion Model) 简要介绍与源码分析
  10. 大年三十整理的asp.net资料!(不得不收藏)
  11. putty怎么更改为中文_Putty怎么样设置显示中文 设置Putty显示中文
  12. [知了堂学习笔记]_Ajax之解析Json
  13. 素数筛法(python实现)
  14. html5读取运动传感器,一种基于六轴传感器的脚步运动识别方法与流程
  15. git拉取代码提示:本地分支 has no tracked branch
  16. VSCode运行Java报错No delegateCommandHandler for vscode.java.resolveMainMethod
  17. c语言编程实现红绿灯,C语言实现红绿灯.doc
  18. 汇编程序设计:钟表显示
  19. 匈牙利命名法鼻祖---查尔斯·西蒙尼
  20. Matlab中计算程序运行时间的几种方法

热门文章

  1. swift Key Path Layer.borderColor/Layer.borderUIColor 设置边框为黑框 颜色无效
  2. 手机usb共享计算机网络连接,手机如何通过USB共享电脑网络
  3. TypeScript等无法获取到歌曲播放的位置信息时,关于歌曲的续播
  4. pdf打开错误之读取本文档时出现问题(14)
  5. 跑PIN码破解无线网络WIFI密码的原理分析(转)
  6. 在移动硬盘内安装centos7记录
  7. word下载后为php_php生成word并下载代码实例
  8. 婚恋相亲交友短视频婚姻介绍所中介平台系统app公众号H5搭建源码
  9. 虚拟筛选及其方法学验证与ROC曲线python实现
  10. m个苹果放在n个盘子里面有多少种放法?(动态规划)