NSGA-II算法理解及matlab代码详解(二)
2014-07-12 21:28
489 查看
过了这么久才回来写这篇算法的理解,有点抱歉,实在有很多事。
现在就进入正题吧,这个是一个多目标函数优化算法。
多目标函数优化有一种方法是,假如现在有n个目标函数fi,首先将每个目标函数乘以一个适当的参数alfai,再将所有的目标函数加起来,得到一个目标函数。这就将多目标函数转化为单目标函数了。
还有一种方法,是真正的多目标函数优化算法。
首先介绍下非支配解(Non-dominated solution)与支配解(dominated solution)
All nondominated solutions in the combined population are assigned a fitness based on the number of solutions they dominate and dominated solutions are assigned fitnessworse than the worst fitness of any nondominated solution.
这句话的意思是:在合并的种群中,所有非支配解将根据它们支配解的数目分配一个适应度值,支配解分配的适应度值比最差的非支配解的适应度值还要差。
补充一下:在NSGA中,介绍了Pareto最优集:对于多目标优化问题,通常存在一个解集,这些解之间就全体目标函数而言是无法比较优劣的,其特点是:无法在改进任何目标函数的同时不削弱至少一个其他目标函数。这种解称作非支配解或Pareto最优解。对于组成Pareto最优解集的所有Pareto最优解,其对应目标空间中的目标矢量所构成的曲面称作Pareto最优前沿。
这是一个复杂度为O(MN2)的算法
下面这个matlab是求解的最小值,再来补充下支配的概念,当不相等的两个解集p与解集q时,他们俩相比,当p的每个目标函数的值不存在大于q的,那么p支配q
先到这吧,有什么问题的可以留言讨论
现在就进入正题吧,这个是一个多目标函数优化算法。
多目标函数优化有一种方法是,假如现在有n个目标函数fi,首先将每个目标函数乘以一个适当的参数alfai,再将所有的目标函数加起来,得到一个目标函数。这就将多目标函数转化为单目标函数了。
还有一种方法,是真正的多目标函数优化算法。
首先介绍下非支配解(Non-dominated solution)与支配解(dominated solution)
All nondominated solutions in the combined population are assigned a fitness based on the number of solutions they dominate and dominated solutions are assigned fitnessworse than the worst fitness of any nondominated solution.
这句话的意思是:在合并的种群中,所有非支配解将根据它们支配解的数目分配一个适应度值,支配解分配的适应度值比最差的非支配解的适应度值还要差。
补充一下:在NSGA中,介绍了Pareto最优集:对于多目标优化问题,通常存在一个解集,这些解之间就全体目标函数而言是无法比较优劣的,其特点是:无法在改进任何目标函数的同时不削弱至少一个其他目标函数。这种解称作非支配解或Pareto最优解。对于组成Pareto最优解集的所有Pareto最优解,其对应目标空间中的目标矢量所构成的曲面称作Pareto最优前沿。
一、快速非支配排序法
N 种群大小,M为目标函数数目。这是一个复杂度为O(MN2)的算法
下面这个matlab是求解的最小值,再来补充下支配的概念,当不相等的两个解集p与解集q时,他们俩相比,当p的每个目标函数的值不存在大于q的,那么p支配q
for i = 1 : N % Number of individuals that dominate this individual individual(i).n = 0; % Individuals which this individual dominate individual(i).p = []; for j = 1 : N dom_less = 0; dom_equal = 0; dom_more = 0; for k = 1 : M if (x(i,V + k) < x(j,V + k)) dom_less = dom_less + 1; elseif (x(i,V + k) == x(j,V + k)) dom_equal = dom_equal + 1; else dom_more = dom_more + 1; end end if dom_less == 0 && dom_equal ~= M %%%j 支配了i individual(i).n = individual(i).n + 1; elseif dom_more == 0 && dom_equal ~= M %%%i支配了j individual(i).p = [individual(i).p j]; end end if individual(i).n == 0 %%%当i不存在被支配的,那么它划分的等级为1 x(i,M + V + 1) = 1; F(front).f = [F(front).f i]; end end
%%%%%可以从上面看出查找一级front的复杂度为O(MN2),在上面individual已经保存了各自的支配解,这个很巧妙
%%%%%%%%%%%% % Find the subsequent fronts 发现后续的front集合 while ~isempty(F(front).f) %%%这里是精妙开始之处,检测当然front的支配集的非支配解,当没检测到一次,减少一,最先减为0,也就是除了小于等于front的可以支配它,剩下的就是它支配了,也就是当前下一个front集合里的</span> Q = []; %%%Q存放下一个front集合的 for i = 1 : length(F(front).f) if ~isempty(individual(F(front).f(i)).p) for j = 1 : length(individual(F(front).f(i)).p) individual(individual(F(front).f(i)).p(j)).n = ... individual(individual(F(front).f(i)).p(j)).n - 1; if individual(individual(F(front).f(i)).p(j)).n == 0 x(individual(F(front).f(i)).p(j),M + V + 1) = ... front + 1; Q = [Q individual(F(front).f(i)).p(j)]; end end end end front = front + 1; F(front).f = Q; end [temp,index_of_fronts] = sort(x(:,M + V + 1)); for i = 1 : length(index_of_fronts) sorted_based_on_front(i,:) = x(index_of_fronts(i),:); end current_index = 0;支配集数目最多N-1,每个解最多访问N-1,那么第二部分最大复杂度为O(N2),所以算法复杂度为O(N),空间复杂度为O(N2)。
先到这吧,有什么问题的可以留言讨论
相关文章推荐
- 菜鸟学matlab之智能算法(1)------蚁群算法即相关代码实现详解
- 嵌入式小波零树(EZW)算法的过程详解和Matlab代码(4)运行示例
- 嵌入式小波零树(EZW)算法的过程详解和Matlab代码(3)解码过程
- 【搞搞算法】多目标遗传算法NSGA-II的C语言代码使用手册
- 嵌入式小波零树(EZW)算法的过程详解和Matlab代码(2)编码过程(081227-补充quantifier程序)
- 基于灰度投影的电子稳像算法研究 (matlab代码)毕业设计
- 多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(6)解码过程——主程序
- 多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(7)解码过程——扫描解码
- 多级树集合分裂(SPIHT)算法的过程详解和Matlab实现(2)数学表述
- 结合舞蹈更易理解的算法--插入排序算法[java代码]
- 基于灰度投影的电子稳像算法研究 (matlab代码)毕业设计
- 多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(1)算法概述
- 算法代码[置顶] 机器学习实战之KNN算法详解
- EZW算法的过程详解和Matlab代码(1)构建扫描次序表(修正小波树结构)
- 深入理解Oracle表(5):三大表连接方式详解之Hash Join的定义,原理,算法,成本,模式和位图
- 结合舞蹈更易理解的算法--冒泡排序算法[java代码]
- photoshop图像滤镜——浮雕算法(含matlab代码)
- 多级树集合分裂(SPIHT)算法的过程详解和Matlab实现(5)编码过程——精细扫描
- 精选微软经典的算法面试100题(第1-20题) -代码详解(题目选自“结构之法”大侠的博客,答案都是本菜鸟自己做的)
- 多级树集合分裂(SPIHT)算法的过程详解与Matlab实现