NSGA-II算法理解及matlab代码详解(二)

2019.7.26更新

时间隔了这么久,没想到当年写的这篇文章竟然有这么多人问问题。我只帮各位找到当年我用的代码,代码在https://download.csdn.net/download/xiaoaoqing/11431980

------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------

过了这么久才回来写这篇算法的理解,有点抱歉,实在有很多事。
现在就进入正题吧,这个是一个多目标函数优化算法。
多目标函数优化有一种方法是,假如现在有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)。

先到这吧,有什么问题的可以留言讨论

 

 

 

  • 11
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值