您的位置:首页 > 编程语言 > MATLAB

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最优前沿。

一、快速非支配排序法

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)。

先到这吧,有什么问题的可以留言讨论
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多目标函数优化
相关文章推荐