NSGA-II算法理解及matlab代码详解(二)
来源:互联网 发布:永硕音乐网页源码 编辑:程序博客网 时间:2024/05/18 03:07
过了这么久才回来写这篇算法的理解,有点抱歉,实在有很多事。
现在就进入正题吧,这个是一个多目标函数优化算法。
多目标函数优化有一种方法是,假如现在有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]; endend
%%%%%可以从上面看出查找一级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),:);endcurrent_index = 0;支配集数目最多N-1,每个解最多访问N-1,那么第二部分最大复杂度为O(N2),所以算法复杂度为O(N),空间复杂度为O(N2)。
- NSGA-II算法理解及matlab代码详解(二)
- NSGA-ⅡMATLAB代码(转载)
- 【搞搞算法】多目标遗传算法NSGA-II的C语言代码使用手册
- NSGA-II
- NSGA-II
- NSGA-II 非支配排序算法
- NSGA-II算法的学习笔记
- Viterbi译码及matlab代码(二)
- Matlab中的FCM算法代码及中文详解
- NSGA-II 学习笔记
- 多目标遗传算法NSGA
- NSGA-Ⅱ算法C++实现(测试函数为ZDT1)
- BiDi 算法详解及应用(二)
- 多目标遗传算法NSGA-II在工业机器人关节空间轨迹优化上的应用
- cnn代码理解(matlab)
- 对NSGA-2的理解
- 复合形算法及matlab代码
- EM算法MATLAB代码及详细注解
- cookie简介
- Using Non-COM C DLL
- 8-1
- Springmvc案例1----基于spring2.5的采用xml配置
- 深度探索linux操作系统系统构建和原理解析第四章
- NSGA-II算法理解及matlab代码详解(二)
- Web ADI示例:供应商站点录入
- A typedef does
- By default,
- c++ 避免头文件重复引用 (pragma once与 #ifndef的区别)
- VC++之网络编程三 TCP编程实例
- patent
- 黑马程序员 静态类的基本重要知识点
- POJ 1113 Wall (凸包)