【搞搞算法】多目标GA算法NSGA-II_论文阅读笔记

这是2014年4月在其他博客上写的,转帖到CSDN的博客上。


之前阅读总结各种多目标GA算法特点的论文《Multi-objective optimization using genetic algorithms: A tutorial》(Abdullah Konak等,Reliability Engineering and System Safety,2006)中,提到了一个相对效果比较好的算法NSGA-II,于是找了相关的论文仔细学习了这个算法的过程。


这个算法是由Kalyanmoy Deb等人提出的,有几个特点:
  • 不需要用户指定一些类似Fitness sharing方法中niche count(小生境大小)之类的参数:这些参数的轻微不同有可能导致结果很大的差异,所以用户主观指定的参数越少越好;
  • 非支配集排序(non-dominated sorting)的时间复杂度相对其他算法较低:已有的排序方法时间复杂度为O(M*N^3)(M:目标函数个数;N:种群个体数目),NSGA-II的排序方法时间复杂度为O(M*N^2);
  • 维护了精英个体:维护精英个体能明显地提高多目标GA的效果。
2000年,Kalyanmoy Deb等人在Proceedings of sixth international conference on parallel problem solving from nature上曾经发表过描述NSGA-II的论文《A fast elitist non-dominated sorting genetic algorithm for multi-objective optimization: NSGA-II》。

2002年,Kalyanmoy Deb等人在IEEE Trans Evol Comput上又发表了关于NSGA-II的论文《A fast and elitist
multiobjective genetic algorithm: NSGA-II》,我阅读的是这一篇,用谷歌学术搜索能够搜到。算法过程主要在论文的第三部分 Elitist non-dominated sorting genetic algorithm,附上这一部分的读书笔记。

===========================================华丽丽的分割线=========================================
A. Fast non-dominated sorting approach
1. 比较慢的原始non-dominated sorting方法:

每个个体与其他个体关于某个目标函数对比,找出非支配个体组成F1,将这些个体排除掉在剩余个体中作比对,以此类推得到F2、F3、……,时间复杂度O(M*N^3),空间复杂度O(N)(M:目标函数个数;N:群体中的个体数)。


2. 比较快的non-dominated sorting方法(见下图):
  • 对每个个体计算两个量,np即支配个体p的个体数目和Sp即被个体p支配个体集合;
  • np=0的个体都属于F1,令这些个体Sp中的所有个体的np-1;
  • 再找np=0的个体都属于F2;,以此类推,直到所有的Fi都找完。
【搞搞算法】多目标GA算法NSGA-II_论文阅读笔记_第1张图片
B. Diversity Preservation
NSGA-II在保持多样性方面的优点:不需要用户自己定义任何参数,时间复杂度相对较低。
1. Density Estimation(密度估计):
第i个个体的拥挤距离(crowding distance)= 它所在的非支配解集中离它最近的两个个体构成的长方形边长的均值。用这种方法估计个体周围的密度。
【搞搞算法】多目标GA算法NSGA-II_论文阅读笔记_第2张图片
2. 算法(见下图): 
在某个非支配解集内,关于每个目标函数分别对个体排序 -> 令目标函数值最大和最小的个体的crowding distance均为无穷大(这样边缘极端值总能选到,以保持多样性) -> 计算其他个体的crowding distance并归一化。
【搞搞算法】多目标GA算法NSGA-II_论文阅读笔记_第3张图片
3. Crowded-comparison operator(拥挤比较运算符):
两个非支配等级不同的个体,更倾向等级高的;两个非支配等级相同的个体,更倾向周围密度小的。


C. Main Loop 

注意:第10行代码,构造新的子代Q(t+1)时,选择是基于Crowded-comparison operator的。
【搞搞算法】多目标GA算法NSGA-II_论文阅读笔记_第4张图片
===========================================华丽丽的分割线=========================================
本来想自己尝试实现NSGA-II(也只是个妄想 ,嘿嘿~~),偶然发现Kalyanmoy Deb教授实验室的网站 http://www.iitk.ac.in/kangal/index.shtml,哇哈哈!!!在这个网站左侧点Source Code连接,里面有个中GA算法的代码,主要是C和C++实现的,教授好人呐,有一种天上掉馅饼的赶脚 。NSGA-II有针对Linux和Windows的代码,针对Linux的版本不断更新,针对Windows的版本只有一个╮(╯▽╰)╭,Linux没有Windows用得熟,以后要多练练Linux的使用了。

把工程包下载下来,发现代码量不少,接下来就是边写中文注释边读代码,完全弄懂了代码以后会把自己的理解写在博客上。

你可能感兴趣的:(搞搞算法)