NSGA-III java实现

NSGA-III是在NSGA-II的基础上,为了解决在目标数超越3个乃至更多的情况下,拥挤度指标不再适应的问题,通过引入参考点的概念来解决这个问题。与NSGA-II相比,NSGAIII仍然适配了他的交叉变异算子,快速非支配排序算子,但从快速非支配排序之后,NSGA-III开始与NSGA-II产生了分歧,在NSGA-II中这里应该进行拥挤度划分,但是NSGAIII是开始了相关的参考点计算,下面进行详细解释

1.根据帕累托分层生成新种群

for (int i=0;i<s.size();i++){
   
    //首先把帕累托等级给分开
    if (front.keySet(). contains ( s.array.get(i).rank)){
   
        front.get(s.array.get(i).rank).add(s.array.get(i));
    } else{
   
        front_l=new ArrayList<>();
        front_l.add(s.array.get(i));
        front.put(s.array.get(i).rank,front_l);
    }
}

这里可以使用一个HashMap来实现,根据每一个解的rank值作为key,rank值相同的作为同一个帕累托层,这样就生成了根据帕累托层分辨的种群front

int rankingIndex=1;//表示第几层,因为是从帕累托等级为1开始的,所以,你懂的
int candidateSolutions=0;
while(candidateSolutions<maxsize){
   
    candidateSolutions+=front.get(rankingIndex).size();
    if ((newS.size()+front.get(rankingIndex).size()<=maxsize)){
   
        //如果没有溢出就往里面添加
        front_l = front.get(rankingIndex);
        for (int i = 0 ; i < front_l.size(); i++) {
   
            newS.add(front_l.get(i));
        }
    }

根据划分好帕累托层的种群向新的种群news中添加个体,直到添加到第l-1层时,newS大小刚好不大于种群数。

2.寻找理想点

ideal-point理想点的含义是所有目标维度上目标值最小的点

 List<Double> ideal_point;
    int numberOfObjectives=pop.array.get(1).fitness.length;
    ideal_point = new ArrayList<>(numberOfObjectives);

    for (int f=0; f<numberOfObjectives; f+=1){
   
        double minf = Double.MAX_VALUE;
        for (int i=0; i<front.get(1).size(); i+=1) // min values must appear in the first front
        {
   
            minf = Math.min(minf, front.get(1).get(i).fitness[f]);
        }
        ideal_point.add(minf);
    }
    return ideal_point;
}

3.根据ASF函数寻找额外点

在这里插入图片描述
ASF函数就是对所有个体在固定一个维度的情况下其他维度上的数同时除以一个极小数,然后取这些个体上的最大值作为ASF函数值

List<NSGAIIIDoubleSolution> extremePoints = new ArrayList<>();
int numberOfObjectives=population.array.get(1).fitness.length;
NSGAIIIDoubleSolution min_indv = null
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值