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)。
先到这吧,有什么问题的可以留言讨论



1 1
原创粉丝点击