用Java实现 遗传算法解带约束的多元函数极值问题

Posted 网管布吉岛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Java实现 遗传算法解带约束的多元函数极值问题相关的知识,希望对你有一定的参考价值。

  1.问题描述

  针对如下问题,设计遗传算法进行求解。

  2.Java源代码

  GA.java

  package GA;

  import java.util.Random;

  class GA {

  public static final int varnum = 4;//变量的个数

  public static final double[] lower = new double[varnum];

  public static final double[] uper = new double[varnum];

  public static final int POP_SIZE = 200; //种群数目

  public static final double[][] initpop = new double[varnum][POP_SIZE];

  public static final int M = 22; //每一个变量编码位数

  public static String[] pop = new String[POP_SIZE];//种群编码

  public static double[][] result = new double[varnum][POP_SIZE];//种群代表的结果

  public static final int LENGTH=M * varnum;//编码长度,因为要精确到小数点后六位,所以编为22位长,22*i,i为变量个数

  public static final int MJ2 = 4194304;//2^22

  public static double[] fitness = new double[POP_SIZE];//存放种群适应度

  public static final double PC = 0.99;//交叉率

  public static final double PM = 0.2;//变异率

  public static double[] p = new double[POP_SIZE];//轮盘赌方法个体适应度概率(按比例的适应度分配)

  public static double[] q=new double[POP_SIZE];//q[i]是前n项p之和(累积概率)

  public static Random random=new Random();//用于产生随机数的工具

  public static Best best=new Best();//记录最佳答案的对象

  public void encoding() //编码

  {

  for (int i = 0; i < POP_SIZE; i++) {

  pop[i]="";

  for(int j=0;j

  double d1=((initpop[j][i]-lower[j])/(uper[j]-lower[j]))*(MJ2-1);

  String GeneCode=Integer.toBinaryString((int)d1);

  if(GeneCode.length()

  int k=M-GeneCode.length();

  for(int l=0;l

  GeneCode="0"+GeneCode;

  }

  }

  pop[i] += GeneCode; //将最终的编码存入pop[i]

  }

  }

  }

  public void decoding()//解码,将2进制编码转换为10进制

  {

  for (int i = 0; i < pop.length; i++) {

  for(int j=0;j

  int k = Integer.parseInt((pop[i].substring(j*22, (j+1)*22)), 2); //注意括号中的值!!!

  if(j==1 || j==3){

  result[j][i] = lower[j]+k*(uper[j]-lower[j])/(MJ2-1);

  result[j][i] = (int)result[j][i];

  //System.out.print("打印变量");

  //System.out.print(result[j][i]);

  }else{

  result[j][i]=lower[j]+k*(uper[j]-lower[j])/(MJ2-1);

  //System.out.print("打印变量");

  //System.out.print(result[j][i]);

  }

  }

  }

  }

  public void fitness()

  {

  for (int i = 0; i < POP_SIZE; i++) {

  fitness[i] = 1000;

  double a = 127 - 2*result[0][i]*result[0][i] - 3*result[1][i]*result[1][i]*result[1][i]*result[1][i] - result[2][i] - 4*result[3][i]*result[3][i];

  if(a>=0){

  fitness[i]= 100000 - ((result[0][i]-10)*(result[0][i]-10) + 5*(result[1][i]-12)*(result[1][i]-12) + result[2][i]*result[2][i]*result[2][i]*result[2][i] + 3*(result[3][i]-11)*(result[3][i]-11));

  }

  //System.out.print("打印适值" + i + " ");

  //System.out.print(fitness[i]);

  }

  }

  public void crossover(){//单点交叉

  for(int i=0;i

  double d=random.nextDouble();

  if(d

  int k1=random.nextInt(POP_SIZE);

  int k2=random.nextInt(POP_SIZE);

  int position=random.nextInt(LENGTH);

  String s11="",s12="",s21="",s22="";

  s11=pop[k1].substring(0,position);

  s12=pop[k1].substring(position,LENGTH);

  s21=pop[k2].substring(0,position);

  s22=pop[k2].substring(position, LENGTH);

  pop[k1]=s11+s22;

  pop[k2]=s21+s12;

  }

  }

  }

  public void mutation() //变异

  {

  for (int i = 0; i < pop.length; i++) {

  for (int j = 0; j < LENGTH; j++) {

  double k=random.nextDouble();

  if(PM>k)

  {

  mutation(i,j);

  }

  }

  }

  }

  public void mutation(int i,int j) //变异

  {

  String s=pop[i];

  StringBuffer sb=new StringBuffer(s);

  if(sb.charAt(j)==‘0‘)

  sb.setCharAt(j, ‘1‘);

  else

  sb.setCharAt(j, ‘0‘);

  pop[i]=sb.toString();

  }

  public void roulettewheel()

  {

  decoding();

  fitness();

  double sum=0;

  for (int i = 0; i

  sum=fitness[i]+sum;

  }

  for (int i = 0; i < POP_SIZE; i++) {

  p[i]=fitness[i]/sum;

  q[i]=0;

  }

  for (int i = 0; i < POP_SIZE; i++) {

  for (int j = 0; j <= i; j++) {

  q[i]+=p[j];

  }

  }

  double[] ran = new double[POP_SIZE];

  String[] tempPop=new String[POP_SIZE];

  for (int i = 0; i < ran.length; i++) {

  ran[i]=random.nextDouble();

  }

  for (int i = 0; i < ran.length; i++) {

  int k = 0;

  for (int j = 0; j < q.length; j++) {

  if(ran[i]

  k=j;

  break;

  }

  else continue;

  }

  tempPop[i]=pop[k];

  }郑州人流手术多少钱 http://mobile.chnk120.com/

  for (int i = 0; i < tempPop.length; i++) {

  pop[i]=tempPop[i];

  //System.out.print("输出种群!");

  //System.out.print(pop[i] + " ");

  }

  }

  public void evolution() //进化

  {

  encoding();

  crossover();

  mutation();

  decoding();

  fitness();

  roulettewheel();

  findResult();

  }

  public void dispose(int n) //对进化进行迭代

  {

  for (int i = 0; i < n; i++) {

  evolution();

  System.out.println("第" + i + "次迭代!");

  }

  }

  public double findResult()

  {

  if(best == null) best=new Best();

  double max = best.fitness;

  for (int i = 0; i < fitness.length; i++) {

  if(fitness[i] >= max)

  {

  best.fitness = fitness[i];

  for(int m=0;m

  best.x[m]=result[m][i];

  }

  best.str = pop[i];

  }

  }

  return max;

  }

  public static void main(String[] args) {

  //d为初试种群

  lower[0] = 0;

  uper[0] = 8.28;

  lower[1] = -10;

  uper[1] = 10;

  lower[2] = -10;

  uper[2] = 10;

  lower[3] = -5;

  uper[3] = 5;

  //初始化种群

  for(int i=0;i

  for(int j=0;j

  result[i][j]=lower[i]+random.nextDouble()*(uper[i]-lower[i]);

  }

  }

  //初始化其它参数

  GA ga = new GA();

  //进化,这里进化10000次

  long starttime=System.currentTimeMillis();

  ga.dispose(10000);

  long endtime=System.currentTimeMillis();

  System.out.println("进化耗时:"+(endtime-starttime)+"ms");

  System.out.println("结果为:");

  for(int i=0;i

  System.out.print("x["+(i+1)+"]="+best.x[i]+"t");

  }

  System.out.println();

  System.out.println("约束条件1的值:"+(127 - 2*best.x[0]*best.x[0] - 3*best.x[1]*best.x[1]*best.x[1]*best.x[1] - best.x[2] - 4*best.x[3]*best.x[3]));

  System.out.println("目标函数值:" + ((best.x[0]-10)*(best.x[0]-10) + 5*(best.x[1]-12)*(best.x[1]-12) + best.x[2]*best.x[2]*best.x[2]*best.x[2] + 3*(best.x[3]-11)*(best.x[3]-11)));

  System.out.println("Function="+(100000 - best.fitness));

  }

  }

  Best.java

  package GA;

  class Best { // 存储最佳的

  public int generations;

  public String str;

  public double fitness;

  public int varnum=5;

  public double []x=new double[varnum];

  }

  3.运行结果

  进化耗时:12938ms

  结果为:

  x[1]=2.7331778176254793t

  x[2]=2.0t

  x[3]=-6.508828761297991E-4t

  x[4]=4.0t

  约束条件1的值:0.06012891735616677

  目标函数值:699.8067046302506

  Function=699.8067046302458

以上是关于用Java实现 遗传算法解带约束的多元函数极值问题的主要内容,如果未能解决你的问题,请参考以下文章

优化求解基于matlab遗传算法求解函数极值问题含Matlab源码 1198期

遗传算法解简单的函数极值问题

最优化理论与技术

MATLAB神经网络的目录

MATLAB教程案例12基于GA遗传优化算法的函数极值计算matlab仿真及其他应用

matlab遗传算法工具箱