matlab 非支配排序,NSGA-II快速非支配排序算法理解
快速的非支配排序
在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快速非支配排序算法理解相关推荐
- 进化计算(四)——NSGA/NSGA II算法详解
NSGA/NSGA II算法理论学习 -A fast and elitist multiobjective genetic algorithm NSGA-II阅读笔记 引言 概述 为什么引入NSGA ...
- nsga2多目标优化之核心知识点(快速非支配排序、拥挤距离、精英选择策略)详解(python实现)
文章目录 一.多目标优化算法简介 1.基本知识 二.NSGA2算法 1.基本原理 2.快速非支配排序 2.1快速非支配排序 python实现 3.拥挤距离 3.1 拥挤距离python 实现 4.精英 ...
- 非支配排序遗传算法c语言,非支配排序遗传算法(NSGA)的研究与应用
摘要: 多目标优化问题一直是科学和工程研究领域的难题和热点问题.传统的解决方法在处理大维数,多模态等复杂问题上存在许多不足.为了解决这一问题,国内外研究学者在简单遗传算法的基础上,发展出了多种多目标优 ...
- NSGAII快速非支配遗传算法二代学习笔记1
Population种群 nondomination sort非支配排序 nondomination level非支配水平 solution解 rank=fitness 等级/适应度 recombi ...
- 进化计算(六)——NSGA II代码实现(Matlab)
NSGA II代码实现 代码流程图 Code Main 函数选择 种群初始化 非支配排序 拥挤度计算 二进制锦标赛选择算子 SBX&Poly mutation 精英策略选择 目标函数 参考链接 ...
- 基于matlab的储能选址定容程序 采用蒙特卡洛随机算法,非粒子群算法
基于matlab的储能选址定容程序 采用蒙特卡洛随机算法,非粒子群算法 图中每个点代表一种配置方式,红点为最优方式 程序稳定运行,每条语句均有详细注释,0基础可看懂 有对应文献 ID:27120675 ...
- s3c2440 IIC AT24C08 (II)非中断模式
承接上一篇: http://blog.csdn.net/qq361294382/article/details/51589964 本次实验使用非中断方式实现S3C2440 对于AT24C08 实 ...
- NSGA II实例讲解
NSGA II实例讲解 此文章是[1]的文字版,相关视频原链接见参考资料. 假设有一个圆规问题,目标函数为最小的底面积和最小的侧面积. 底面积=πr^2, 侧面积=πrsh 总的目标函数=底面积+侧面 ...
- 《预训练周刊》第45期: 冻结语言模型、提示迁移性、快速文档排序
No.45 智源社区 预训练组 预 训 练 研究 观点 资源 活动 周刊订阅 告诉大家一个好消息,<预训练周刊>已经开启"订阅功能",以后我们会向您自动推送最新版的&l ...
- 微分算法 非侵入式负荷识别_非侵入式负荷监测的识别方法和关键技术
原标题:非侵入式负荷监测的识别方法和关键技术 在智能电网时代,必须突破目前用户家用电表只能读取用电总量,不能深入分析用户内部负荷成分,获取负荷信息有限的这一瓶颈,以完善用电信息采集系统和智能用电系统. ...
最新文章
- 您详细比较三个 CSS 预处理器(框架):Sass、LESS 和 Stylus
- 逻辑回归模型(Logistic Regression, LR)基础
- hbuilderx简单网页代码_Python爬取网页数据
- celeba数据集_Kaggle最新秃头数据集Bald!含20万张图片,江湖传言刷到第一可防脱发()quot;...
- Yii框架常见问题汇总
- oracle 数字处理函数,Oracle函数-单行函数-数字、日期、日期处理函数
- 漫画:什么是JVM的垃圾回收?
- CRC校验码计算公式
- 扩散模型 (Diffusion Model) 简要介绍与源码分析
- 大年三十整理的asp.net资料!(不得不收藏)
- putty怎么更改为中文_Putty怎么样设置显示中文 设置Putty显示中文
- [知了堂学习笔记]_Ajax之解析Json
- 素数筛法(python实现)
- html5读取运动传感器,一种基于六轴传感器的脚步运动识别方法与流程
- git拉取代码提示:本地分支 has no tracked branch
- VSCode运行Java报错No delegateCommandHandler for vscode.java.resolveMainMethod
- c语言编程实现红绿灯,C语言实现红绿灯.doc
- 汇编程序设计:钟表显示
- 匈牙利命名法鼻祖---查尔斯·西蒙尼
- Matlab中计算程序运行时间的几种方法
热门文章
- swift Key Path Layer.borderColor/Layer.borderUIColor 设置边框为黑框 颜色无效
- 手机usb共享计算机网络连接,手机如何通过USB共享电脑网络
- TypeScript等无法获取到歌曲播放的位置信息时,关于歌曲的续播
- pdf打开错误之读取本文档时出现问题(14)
- 跑PIN码破解无线网络WIFI密码的原理分析(转)
- 在移动硬盘内安装centos7记录
- word下载后为php_php生成word并下载代码实例
- 婚恋相亲交友短视频婚姻介绍所中介平台系统app公众号H5搭建源码
- 虚拟筛选及其方法学验证与ROC曲线python实现
- m个苹果放在n个盘子里面有多少种放法?(动态规划)