前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一起来学演化计算-SBX模拟二进制交叉算子和DE差分进化算子

一起来学演化计算-SBX模拟二进制交叉算子和DE差分进化算子

作者头像
演化计算与人工智能
发布2020-08-14 16:32:29
1.1K0
发布2020-08-14 16:32:29
举报

参考文献

[1] https://blog.csdn.net/qq_36347331/article/details/96351162

[2] http://www.it1352.com/994287.html

[3] https://www.egr.msu.edu/~kdeb/

SBX

DE

SBX matlab版本实现

代码语言:javascript
复制
function object=crossover(object,p1,p2,cf)
          object.rnvec=0.5*((1+cf).*p1.rnvec + (1-cf).*p2.rnvec);
          % 截断范围
          object.rnvec(object.rnvec>1)=1;
          object.rnvec(object.rnvec<0)=0;
end
u = rand(1,D_multitask);
cf = zeros(1,D_multitask);
cf(u<=0.5)=(2*u(u<=0.5)).^(1/(mu+1));
cf(u>0.5)=(2*(1-u(u>0.5))).^(-1/(mu+1));
child(count) = crossover(child(count),population(p1),population(p2),cf);
child(count+1) = crossover(child(count+1),population(p2),population(p1),cf);

SBX java版本实现

代码语言:javascript
复制
/**
 * This class allows to apply a SBX crossover operator using two parent
 * solutions.
 * 关于此代码和Deb论文中代码不一致可以查看http://www.it1352.com/994287.html帖子或者查看Deb官方源码
 */
//  SBXCrossover.java
//
//  Author:
//       Antonio J. Nebro <antonio@lcc.uma.es>
//       Juan J. Durillo <durillo@lcc.uma.es>
//
//  Copyright (c) 2011 Antonio J. Nebro, Juan J. Durillo
//
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU Lesser General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public License
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
public Solution[] doCrossover(double probability, Solution parent1, Solution parent2) throws JMException {

  Solution[] offSpring = new Solution[2];
  /**
  *使用一个父代个体去生成新个体的原因在于可以将父代的属性传给子代
  *具体有:
   * public Solution(Solution solution) {
   *   problemSet_ = solution.problemSet_;
   *   type_ = solution.type_;
   *
   *   numberOfObjectives_ = solution.getNumberOfObjectives();
   *   objective_ = new double[numberOfObjectives_];
   *   for (int i = 0; i < objective_.length; i++) {
   *    objective_[i] = solution.getObjective(i);
   *                } // for
   *    // <-
   *
   *   variable_ = type_.copyVariables(solution.variable_);
   *   overallConstraintViolation_ = solution.getOverallConstraintViolation();
   *   numberOfViolatedConstraints_ = solution.getNumberOfViolatedConstraint();
   *   distanceToSolutionSet_ = solution.getDistanceToSolutionSet();
   *   crowdingDistance_ = solution.getCrowdingDistance();
   *   kDistance_ = solution.getKDistance();
   *   fitness_ = solution.getFitness();
   *   rank_ = solution.getRank();
   *   location_ = solution.getLocation();
   *
   *   skillFactor_ = solution.getSkillFactor();*  } // Solution
   * */
  offSpring[0] = new Solution(parent1);
  offSpring[1] = new Solution(parent2);

  int i;
  double rand;
  double y1, y2, yL, yu;
  double c1, c2;
  double alpha, beta, betaq;
  double valueX1, valueX2;
  XReal x1 = new XReal(parent1);
  XReal x2 = new XReal(parent2);
  XReal offs1 = new XReal(offSpring[0]);
  XReal offs2 = new XReal(offSpring[1]);

  int numberOfVariables = x1.getNumberOfDecisionVariables();

  if (PseudoRandom.randDouble() <= probability) {
   //只有随机生成的数小于自定义的交叉可能性时才进行交叉操作
   for (i = 0; i < numberOfVariables; i++) {
    valueX1 = x1.getValue(i);
    valueX2 = x2.getValue(i);
    if (PseudoRandom.randDouble() <= 0.5) {
     if (java.lang.Math.abs(valueX1 - valueX2) > EPS) {

      if (valueX1 < valueX2) {
       y1 = valueX1;
       y2 = valueX2;
      } else {
       y1 = valueX2;
       y2 = valueX1;
      } // if

      yL = x1.getLowerBound(i);
      yu = x1.getUpperBound(i);
      rand = PseudoRandom.randDouble();
      beta = 1.0 + (2.0 * (y1 - yL) / (y2 - y1));
      alpha = 2.0 - java.lang.Math.pow(beta, -(distributionIndex_ + 1.0));

      if (rand <= (1.0 / alpha)) {
       betaq = java.lang.Math.pow((rand * alpha), (1.0 / (distributionIndex_ + 1.0)));
      } else {
       betaq = java.lang.Math.pow((1.0 / (2.0 - rand * alpha)),
         (1.0 / (distributionIndex_ + 1.0)));
      } // if

      c1 = 0.5 * ((y1 + y2) - betaq * (y2 - y1));
      beta = 1.0 + (2.0 * (yu - y2) / (y2 - y1));
      alpha = 2.0 - java.lang.Math.pow(beta, -(distributionIndex_ + 1.0));

      if (rand <= (1.0 / alpha)) {
       betaq = java.lang.Math.pow((rand * alpha), (1.0 / (distributionIndex_ + 1.0)));
      } else {
       betaq = java.lang.Math.pow((1.0 / (2.0 - rand * alpha)),
         (1.0 / (distributionIndex_ + 1.0)));
      } // if

      c2 = 0.5 * ((y1 + y2) + betaq * (y2 - y1));

      if (c1 < yL)
       c1 = yL;

      if (c2 < yL)
       c2 = yL;

      if (c1 > yu)
       c1 = yu;

      if (c2 > yu)
       c2 = yu;

      if (PseudoRandom.randDouble() <= 0.5) {
       offs1.setValue(i, c2);
       offs2.setValue(i, c1);
      } else {
       offs1.setValue(i, c1);
       offs2.setValue(i, c2);
      } // if
     } else {
      offs1.setValue(i, valueX1);
      offs2.setValue(i, valueX2);
     } // if
    } else {
     offs1.setValue(i, valueX2);
     offs2.setValue(i, valueX1);
    } // if
   } // if
  } // if

  return offSpring;
 }
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SBX
  • DE
  • SBX matlab版本实现
  • SBX java版本实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档