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

📄 algorithm.java

📁 基于java实现的遗传算法 神经网络 实数编码 交叉 选择 变异
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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[18]<((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]));

         System.out.print(circle);
        System.out.println();
         System.out.print(diff);
         System.out.println();
         for(i=0;i<Gene_Len;i++)
       {
        System.out.print(w[i]);
        System.out.print(" ");
    }
        System.out.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]);
     }

     System.out.print(circle);
         System.out.println();
         System.out.println(diff);
         System.out.println();
          for(i=0;i<Gene_Len;i++)
        {
         System.out.print(w[i]);
         System.out.print(" ");
     }
          System.out.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)
 {

⌨️ 快捷键说明

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