⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 algorithm.java~187~

📁 基于java实现的遗传算法 神经网络 实数编码 交叉 选择 变异
💻 JAVA~187~
字号:
package ga;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.lang.*;
import java.io.PrintWriter;
public class Algorithm {
    public Algorithm() {
        try {
            jbInit();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }


    public static void main(String args[]){
        Algorithm m = new Algorithm();
        Quit_Flag = false;
        m.init(); //
         while (true) {
            m.evalutate();
            if (Quit_Flag == true)
              { break;
                  //
                 // m.showWindow();
                  //System.exit(1);//hui tuichu zuihou yao zhuyi
               }
            else {
                m.select();
                m.crossover();
                m.mutate();
              //  m.invert();
                }
        }

            m.denormalize();
            m.showWindow();


    }
    public void init(){
        int i, j, k;
      //  double max, min;
        double len;
        double[] fx = new double[this.STEP];
        double[] fy = new double[this.STEP];
      //  int max_y, min_y;
        String str;
        circle = 1;
        fit_max = -200;
        fit_min = 100;
        for (i = 0; i < Group_Size; i++)
          //  gene_fit[i] =Math.random();
            gene_fit[i]=0;
        fhw = new File("ga.txt");
        fhy = new File("xy.txt");
        fhny = new File("nxy.txt");
        try{
        fw =new PrintWriter(new FileOutputStream(fhw));
        }catch(IOException e)
        {
        }

        for (i = 0; i <Group_Size; i++)
            for (j = 0; j < Gene_Len; j++)
                group[i][j] = Math.random() * width - width / 2;
              //group[i][j]=0;

        fx[0] = Start_X;
        fy[0] = f(fx[0]);
        len = (Stop_X - Start_X) / (double) STEP;
        for (i = 1; i <STEP; i++) {
            fx[i] = fx[i - 1] + len;
            fy[i] =f(fx[i]);
            if (fy[i]>max )
                 max=fy[i];
             if(fy[i]<min)
                 min=fy[i];
          }
       for(i=0;i<STEP;i++)
       {
           px[i]=(fx[i]-Start_X)/(Stop_X-Start_X);
           py[i]=(fy[i]-min)/(max-min);
       }
       for(i=0;i<STEP;i++)
       {
           sampleResult[i]=py[i];
       }
       for(i=0;i<5;i++)
      {
          listofinfo[i]=new LinkedList();
          listofinfo[i].add(new Double(infoMinOutput));
          listofinfo[i].add(new Double(infoMaxOutput));
      }
   }
 public void Cross(int a,int b)
 {
     int i;
     double p;
     double ta,tb;
     for (i = 0; i < Gene_Len; i++) {
         p = Math.random();
         if (p <= pc)
         {
             ta=group[a][i];
             tb=group[b][i];
             group[a][i]=(ta+2*tb)/3;
             group[b][i]=(tb+2*ta)/3;
         }

     }
 }
 public void crossover()
 {
     int i,N;


     mangle();
     N=(Group_Size-nn)/2;


     for(i=0;i<N;i++)
     {
        Cross(pool[2*i],pool[2*i+1]);
     }

 }
public void evalutate(){
    int i,k;
    double s,s2,total;
    double y;
    String str;
    total=0;
    fit_max=-100000;
    fit_min=100000;

    for(i=0;i<Group_Size;i++)
    {
        s=0;
        s2=0;
        Gene2Weight(i);
        for(k=0;k<STEP;k++)
        {
            y=Learn_Process(px[k]);
            s=s+(y-py[k])*(y-py[k]);
         }
       if( s>fit_max )
           fit_max=s;
       if(s<fit_min)
          { fit_min=s;
              ptr_good=i;
              diff=s/STEP;
          }
       gene_fit[i]=s;
       total=total+s;

   }

      System.out.println(diff);
      System.out.println(circle);

  if((circle%1000)==0){
        Gene2Weight(ptr_good);
       listofinfo[0].add(new Double(w[2]));
        if(w[2]<((Double)listofinfo[0].get(0)).doubleValue())
            listofinfo[0].set(0,new Double(w[2]));
        if(w[2]>((Double)listofinfo[0].get(1)).doubleValue())
            listofinfo[0].set(1,new Double(w[2]));
     //
      listofinfo[1].add(new Double(w[6]));
        if(w[6]<((Double)listofinfo[1].get(0)).doubleValue())
             listofinfo[1].set(0,new Double(w[6]));
        if(w[6]>((Double)listofinfo[1].get(1)).doubleValue())
             listofinfo[1].set(1,new Double(w[6]));
      //
      listofinfo[2].add(new Double(w[10]));
        if(w[10]<((Double)listofinfo[2].get(0)).doubleValue())
           listofinfo[2].set(0,new Double(w[10]));
        if(w[10]>((Double)listofinfo[2].get(1)).doubleValue())
           listofinfo[2].set(1,new Double(w[10]));

      //
      listofinfo[3].add(new Double(w[15]));
        if(w[15]<((Double)listofinfo[3].get(0)).doubleValue())
            listofinfo[3].set(0,new Double(w[15]));
        if(w[15]>((Double)listofinfo[3].get(1)).doubleValue())
            listofinfo[3].set(1,new Double(w[15]));


      //
      listofinfo[4].add(new Double(w[20]));
         if(w[20]<((Double)listofinfo[4].get(0)).doubleValue())
             listofinfo[4].set(0,new Double(w[20]));
         if(w[20]>((Double)listofinfo[4].get(1)).doubleValue())
             listofinfo[4].set(1,new Double(w[20]));

       for(i=0;i<Gene_Len;i++)
       {
          fw.print(w[i]);
          fw.println();
       }
    }
 circle=circle+1;
 if(diff<this.EPS | circle>300000)
 {
     Quit_Flag=true;
     Gene2Weight(ptr_good);
   //
     listofinfo[0].add(new Double(w[2]));
       if(w[2]<((Double)listofinfo[0].get(0)).doubleValue())
           listofinfo[0].set(0,new Double(w[2]));
       if(w[2]>((Double)listofinfo[0].get(1)).doubleValue())
           listofinfo[0].set(1,new Double(w[2]));
    //
     listofinfo[1].add(new Double(w[6]));
       if(w[6]<((Double)listofinfo[1].get(0)).doubleValue())
            listofinfo[1].set(0,new Double(w[6]));
       if(w[6]>((Double)listofinfo[1].get(1)).doubleValue())
            listofinfo[1].set(1,new Double(w[6]));
     //
     listofinfo[2].add(new Double(w[10]));
       if(w[10]<((Double)listofinfo[2].get(0)).doubleValue())
          listofinfo[2].set(0,new Double(w[10]));
       if(w[10]>((Double)listofinfo[2].get(1)).doubleValue())
          listofinfo[2].set(1,new Double(w[10]));

     //
     listofinfo[3].add(new Double(w[15]));
       if(w[15]<((Double)listofinfo[3].get(0)).doubleValue())
           listofinfo[3].set(0,new Double(w[15]));
       if(w[15]>((Double)listofinfo[3].get(1)).doubleValue())
           listofinfo[3].set(1,new Double(w[15]));


     //
     listofinfo[4].add(new Double(w[20]));
        if(w[20]<((Double)listofinfo[4].get(0)).doubleValue())
            listofinfo[4].set(0,new Double(w[20]));
        if(w[20]>((Double)listofinfo[4].get(1)).doubleValue())
            listofinfo[4].set(1,new Double(w[20]));


     for(k=0;k<STEP;k++)
     {
         actualResult[k]=Learn_Process(px[k]);
     }
 }
   for(i=0;i<Gene_Len;i++)
   {
      fw.print(w[i]);

   }
   fw.println();
}
 public  void mangle()
 {
     int i;
    double  a,b;
   int p1,p2;
    int t;
    for(i=nn;i<Group_Size;i++)
              pool[i]=i;
     for(i=0;i<Group_Size/2;i++)
         {
           a=(double)Math.random()*(Group_Size-nn)+(double)nn;
           b=(double)Math.random()*(Group_Size-nn)+(double)nn;
            p1=(int)a;
            p2=(int)b;
              if(p1!=p2)
             { t=pool[p1];
               pool[p1]=pool[p2];
               pool[p2]=t;

           }
         }
    }

public  void Gene2Weight(int k)
 {
     int i;
         for(i=0;i<this.Gene_Len;i++)
     {
         w[i]=group[k][i];
       //  System.out.println(w[i]);

     }
 }
public  double Learn_Process(double xx)
 {   int L0=1;
     int L1=3;
     int L2=3;
     int L3=1;

     int i,j,tx1,tx2,tw;
     x_pos[0]=0;
     x_pos[1]=2;
     x_pos[2]=6;
     x_pos[3]=10;
     x[1]=-1;
     x[5]=-1;
     x[9]=-1;
     x[0]=xx;
     tx1=x_pos[1];
     tw=0;
     double s;
     //L1
     for(i=0;i<L1;i++)
     {
         s=0;
         tx2=x_pos[0];
         for(j=0;j<L0+1;j++)
         {
             s=s+x[tx2]*w[tw];
             tw=tw+1;
             tx2=tx2+1;
         }
        x[tx1]=1/(1+Math.exp(-s));
        tx1=tx1+1;
     }
     //L2
     tx1=x_pos[2];
     tw=6;
     for(i=0;i<L2;i++)
     {
         s=0;
         tx2=x_pos[1];
         for(j=0;j<L1+1;j++)
         {
             s=s+w[tw]*x[tx2];
             tw=tw+1;
             tx2=tx2+1;
         }
     x[tx1]=1/(1+Math.exp(-s));
     tx1=tx1+1;
     }
     tx1=x_pos[3];
     tw=18;
     for(i=0;i<L3;i++)
     {
      s=0;
      tx2=x_pos[2];
      for(j=0;j<L2+1;j++)
      {
          s=s+w[tw]*x[tx2];
          tw=tw+1;
          tx2=tx2+1;
      }
      x[tx1]=1/(1+Math.exp(-s));;
  }
     return x[tx1];
 }
 public void select()
 {   int i,k,j,a;

     sort();
     fit_ave=fit_min+(fit_max-fit_min)/10;
     k=0;
     for(i=0;i<(int)(Group_Size*0.90);i++)//0.95

     {   for(j=0;j<Gene_Len;j++)
       //  group[pool2[i]][j]=old_Group[k][j];
         old_Group[k][j]=group[pool2[i]][j];
        k=k+1;
      }

     i=0;
      while(k<Group_Size)
     {
         //System.arraycopy(group[pool2[i]],0,old_Group[k],0,Gene_Len);
         for(j=0;j<Gene_Len;j++)
         {
           //  group[pool2[i]][a]=old_Group[k][a];
             old_Group[k][j]=group[pool2[i]][j];
         }
         i=i+1;
         k=k+1;
     }
     for(i=0;i<Group_Size;i++)
       {  for(j=0;j<Gene_Len;j++)

          // old_Group[i][j]=group[i][j];
           group[i][j]=old_Group[i][j];
                }
   }
 public double f(double x)
 {
  double result;
  result=x*(1+Math.cos(x))*(2+Math.sin(2*x));
    return result;
 }
 public void sort()
 {
     int i,j,k,s;
     for(i=0;i<Group_Size;i++)
         pool2[i]=i;
     for(i=0;i<Group_Size;i++)
     {
         k=pool2[i];
         for(j=i+1;j<Group_Size;j++)
         {
             if(gene_fit[pool2[j]]<gene_fit[k])
                    k=j;
         }
             s=pool2[i];
             pool2[i]=k;
             pool2[k]=s;

     }
 }
 public void mutate()
 {
   int i,j,n,k,p1,p2,pa;
   double p,q;
   double a,b;

   q=diff;
   if(diff>0.09)
       q=0.09;
   p=q*200;
   for(n=0;n<28;n++)//n<(int)((q*200)/2);
           for(k=0;k<20;k++)//(int)(q*200)/3
           {
             if(Math.random()*100<p)
             {
                 a=Math.random()*(Group_Size-nn)+(double)nn;
                 b=Math.random()*Gene_Len;
                 i=(int)a;
                 j=(int)b;
                 pa=60;
                 if(diff<0.05)
                      pa=40;
                 p1=(int)(Math.random()*100);
                 p2=(int)(Math.random()*100);
                 if(p1>pa)

                         group[i][j]=Math.random()*width-width/2;

                 else if(p1>pa+(100-pa)/2)
                     {
                      if(p2>70)

                          group[i][j]=group[i][j]+Math.random()*2;
                      else if(p2<30)

                          group[i][j]=group[i][j]+Math.random();
                           else
                              group[i][j]=group[i][j]+Math.random()/10;
                        }
                     else
                     { if(p2>70)
                             group[i][j]=group[i][j]-Math.random()*2;
                         else if(p2<30)

                                 group[i][j]=group[i][j]-Math.random()/2;

                             else
                                 group[i][j]=group[i][j]-Math.random()/10;
                     }

                 }
             }
 }

public void invert()
 {
     int start,stop,i,j,n,k,ptr;
     double t,p,q;
     q=diff;
     if(diff>0.09)
         q=0.09;
       p=diff*200;
     for(n=0;n<(int)((q*200)/3);n++)
         for(j=0;j<(int)((q*200)/3);j++)
         {
             if(Math.random()*100<p)
                {
                ptr=(int)(Math.random()*(Group_Size-nn)+nn);
                start=(int)(Math.random()*Gene_Len);
                stop=(int)(Math.random()*Gene_Len);
               if(start<stop)
                 {k=start;
                   start=stop;
                   stop=k;
                 }
                 k=stop;
              for(i=start;i<=(start+stop)/2;i++)
              {
                  t=group[ptr][i];
                  group[ptr][i]=group[ptr][k];
                  group[ptr][k]=t;
                  k=k-1;
              }
            }

         }
 }

 public void denormalize()
 {   int i;
     for(i=0;i<STEP;i++)
     {
         sampleResult[i]=sampleResult[i]*(max-min)+min;
         actualResult[i]=actualResult[i]*(max-min)+min;
     }
 }
 public void showWindow(){
     ResultFrame frame =new ResultFrame(actualResult,sampleResult,listofinfo,max,min);
     frame.show();
 }
 static boolean  Quit_Flag;//是否学习完毕
 private static final int STEP=20;
 File fhw;//输入文件
 File fhy;
 File fhny;
 BufferedReader reader;
 PrintWriter writer;

 private static int circle ;
 private static double fit_max,fit_min,fit_ave;
 private static final int Group_Size=30;
 private double[] gene_fit =new double[Group_Size];
 private static final int Gene_Len=22;
 double[][] Gene_Array= new double[Group_Size][Gene_Len];
 private static double[][] group=new  double[Group_Size][Gene_Len];
private static  double[][] old_Group=new double[Group_Size][Gene_Len];
 private static final float width=90;
 private static final double Start_X=0;
 private static final double Stop_X=2*Math.PI;
 double[] px= new double[STEP];
 double[] py= new double[STEP];
 private static final double pc=0.8;//0.8
 private static final int nn=2;
int[] pool= new int[Group_Size];
 int[] pool2=new int[Group_Size];
 private int ptr_good;
 private double diff;
 Point[] learn_newpxy= new Point[STEP];
 Point[] learn_oldpxy= new Point[STEP];
 double[] w= new double[Gene_Len];
 FileOutputStream outfw;
 private static final double EPS=0.001;
 double[] x=new double[11];
 int[] x_pos=new int[4];
 private static final int View_WEIGHT_NUM=5;
 private LinkedList[] listofinfo=new LinkedList[View_WEIGHT_NUM];
 private double[] info=new double[View_WEIGHT_NUM];
 double min=9999;
 double max=0;
 double infoMinOutput=9999;
 double infoMaxOutput=-9999;
 double[] actualResult =new double[Gene_Len];
 double[] sampleResult =new double[Gene_Len];
 PrintWriter fw;
 private void jbInit() throws Exception {
    }


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -