前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多目标优化按支配关系分层实现

多目标优化按支配关系分层实现

作者头像
演化计算与人工智能
发布2020-08-14 11:04:58
5200
发布2020-08-14 11:04:58
举报

多目标优化按支配关系分层实现

  • 在 NSGA-II 中,在对种群中的个体支配关系进行确定[1]后,就要对种群中个体按照相互之间的支配关系进行分层。
  • 大体思想是挑选出种群中没有个体能支配的个体作为第 0 层,即 Rank0,然后将受 Rank0 中个体支配的个体的被支配个数减一,如果此时有个体因为这个操作导致受支配的个数变成 1。即除掉 Rank0 之中的个体以外,没有个体可以支配其。则将这种个体挑选出作为 Rank1,依次进行。详细思路可以参见NSGA-II 入门[2]

matlab

代码语言:javascript
复制
front=0;
% count刚开始存储的是front0中解的个数
while count>0
    count=0;
    front=front+1;% 此时front从1开始计数
    for i=1:pop
        if population(i).front==front % 筛选当前front元素
            % 对于pop(i)支配的每个个体
            for j=1:population(i).dominatedsetlength
                % i支配个体的索引标记为ind
                ind=population(i).dominatedset(j);
                % ind个体被支配总数减去1
                population(ind).dominationcount=population(ind).dominationcount-1;
                % 如果个体被支配总数等于0,即是说没有个体再去支配她了
                if population(ind).dominationcount==0
                    % 这里没有使用专门的矩阵将不同的front存储,而是将每个个体的front存到属性中
                    population(ind).front=front+1;%将其front标记加1,可以认为把其放到当前层的下一层中
                    count=count+1;%count是一个局部变量,用于记载这个front中存在的个体数
                end
            end
        end
    end
    frontnumbers=[frontnumbers,count];% 记载front中的个体数量
end

jmetal

  • 和以上实现方法不同的是,jmetal 中使用一个列表存储了种群中的每个层,可以调用函数返回每个层中的个体。这里具体展示分层函数的具体实现。
代码语言:javascript
复制
public Ranking(SolutionSet solutionSet) {
  solutionSet_ = solutionSet;

  // dominateMe[i] contains the number of solutions dominating i
  int[] dominateMe = new int[solutionSet_.size()];

  // iDominate[k] contains the list of solutions dominated by k
  List<Integer>[] iDominate = new List[solutionSet_.size()];

  // front[i] contains the list of individuals belonging to the front i
  List<Integer>[] front = new List[solutionSet_.size() + 1];

  // flagDominate is an auxiliar encodings.variable
  int flagDominate;

  // Initialize the fronts
  for (int i = 0; i < front.length; i++)
   front[i] = new LinkedList<Integer>();

  // -> Fast non dominated sorting algorithm
  // Contribution of Guillaume Jacquenot
  for (int p = 0; p < solutionSet_.size(); p++) {
   // Initialize the list of individuals that i dominate and the number
   // of individuals that dominate me
   iDominate[p] = new LinkedList<Integer>();
   dominateMe[p] = 0;
  }
  for (int p = 0; p < (solutionSet_.size() - 1); p++) {
   // For all q individuals , calculate if p dominates q or vice versa
   for (int q = p + 1; q < solutionSet_.size(); q++) {
    flagDominate = constraint_.compare(solutionSet.get(p), solutionSet.get(q));
    if (flagDominate == 0) {
     flagDominate = dominance_.compare(solutionSet.get(p), solutionSet.get(q));
    }
    if (flagDominate == -1) {
     iDominate[p].add(q);
     dominateMe[q]++;
    } else if (flagDominate == 1) {
     iDominate[q].add(p);
     dominateMe[p]++;
    }
   }
   // If nobody dominates p, p belongs to the first front
  }
  for (int p = 0; p < solutionSet_.size(); p++) {
   if (dominateMe[p] == 0) {
    front[0].add(p);
    solutionSet.get(p).setRank(0);
   }
  }

  // Obtain the rest of fronts
  int i = 0;
  Iterator<Integer> it1, it2; // Iterators
  while (front[i].size() != 0) {
   i++;
   it1 = front[i - 1].iterator();
   while (it1.hasNext()) {
    it2 = iDominate[it1.next()].iterator();
    while (it2.hasNext()) {
     int index = it2.next();
     dominateMe[index]--;
     if (dominateMe[index] == 0) {
      front[i].add(index);
      solutionSet_.get(index).setRank(i);
     }
    }
   }
  }
  // <-

  ranking_ = new SolutionSet[i];
  // 0,1,2,....,i-1 are front, then i fronts
  for (int j = 0; j < i; j++) {
   ranking_[j] = new SolutionSet(front[j].size());
   it1 = front[j].iterator();
   while (it1.hasNext()) {
    ranking_[j].add(solutionSet.get(it1.next()));
   }
  }

 } // Ranking

参考资料

[1]

种群中的个体支配关系进行确定: https://blog.csdn.net/u013555719/article/details/91356078

[2]

NSGA-II入门: https://blog.csdn.net/u013555719/article/details/82936554

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DrawSky 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多目标优化按支配关系分层实现
    • matlab
      • jmetal
        • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档