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

📄 frame1.java

📁 运用遗传算法对交通流进行分配
💻 JAVA
📖 第 1 页 / 共 3 页
字号:

    for(i=0;i<length;i++){
    n=n+xy[i];
    for(j=ncopy;j<n;j++)
      if(x[j]==1)z[i]=j-ncopy;
    ncopy=n;
    }
    return z;
  }


public static int[][] Multiply(int a[][],int vertice1,int vertice2,int b[][],int vertice3,int vertice4){
int [][] c=new int [vertice1][vertice4];
if(vertice2!=vertice3){
System.out.print("error!");
return c;
}

for(int i=0;i<vertice1;i++)
 for(int j=0;j<vertice4;j++)
{
 //计算c[i][j]的值
  c[i][j]=0;
  for(int m=0;m<vertice2;m++){
 c[i][j]=c[i][j]+a[i][m]*b[m][j];
  }


}
return c;
}

public static boolean judge(int a[][],int horNum,int verNum,int x[],int [] q){
    boolean p=true;
    int[] qCopy=new int[1000];

    for(int i=0;i<horNum;i++)
    {
      qCopy[i]=0;

      for(int j=0;j<verNum;j++)
       if(x[j]==1)qCopy[i]=qCopy[i]+a[i][j];
      if(qCopy[i]>q[i])p=false;

    }
   return p;

  }

public static long getZ(int a[][],int horNum,int verNum,int x[],int[] c){
    long z=0;
    int[] qCopy=new int[1000];

    for(int i=0;i<horNum;i++)
    {
      qCopy[i]=0;
      for(int j=0;j<verNum;j++)
        if(x[j]==1)qCopy[i]=qCopy[i]+a[i][j];
      z=z+qCopy[i]*c[i];
    }
    return z;
  }
}


 class Genetic {
   public Genetic(){

   }

  public static void genAlgorith(A a,int c[],int q[],double pc,double pm,int loop ,int cap){
    //pc=1-pc;
    int k=0;//k用来控制循环的次数,一共进行150代遗传算法
    int xynum=a.getXynum();
    int [] xx=new int[xynum];
    int [] xy=new int[xynum];
    xy=a.getXy();


    int aa[][];
    int verNum;//表示列数
    int horNum;//表示行数
    aa=a.getA();
    verNum=a.getVerNum();
    horNum=a.getHorNum();

    int [] x=new int[verNum];
    double fitsum=0;
    double []fit=new double[cap];
    int unitnum[]=new int[cap];
    long minflux;
    int pointer;
    double []p=new double[cap];

    xCopy=new int[verNum];

    int wholeCopy[]=new int[verNum];
    double fitCopy;

    int[][] whole=new int[cap][verNum];
    boolean t=true;




           while(t){
           for(int j=0;j<xynum;j++){
             xx[j]=(int)(Math.random()*xy[j]);
           }

           x=Matrix.convert(xx,xy,xynum);
           if(Matrix.judge( aa,horNum,verNum, x, q)==true)
             { xCopy=x;
               minflux0=Matrix.getZ(aa, horNum, verNum, xCopy,  c);
               whole[0]=x;
               t=false;
             }
           }





    //初始化样本空间
    for(int i=1;i<cap;i++){
       t=true;
      while(t){
      for(int j=0;j<xynum;j++){
        xx[j]=(int)(Math.random()*xy[j]);
      }

      x=Matrix.convert(xx,xy,xynum);
      if(Matrix.judge( aa,horNum,verNum, x, q)==true)
        {
          whole[i]=x;
          t=false;
        }
      }
    }//初始化完成

   //开始遗传算法
   do{
     long temp;
     minflux=Matrix.getZ(aa, horNum, verNum, whole[0],  c);
     pointer=0;
     for(int i=0;i<cap;i++){
     temp=Matrix.getZ(aa, horNum, verNum, whole[i],  c);
     if(minflux>temp)
       {minflux=temp;pointer=i;}
     fit[i] =(double) 1/temp;
     fitsum=fitsum+fit[i];
     }

     process=process+"第"+k+"代最小值为:"+minflux+"此时x为:";
 for(int i=0;i<verNum;i++)
    process=process+whole[pointer][i];
  process=process+"\n";


  if(minflux<minflux0)
  {
  minflux0=minflux;//maxfit0表示上一代最大值
  xCopy=whole[pointer];//X表示上一代最大值对应的x
  K=k;//k表示什么
  }

  for(int i=1,j=0;i<cap;i++)
     if(fit[i]>fit[i-1]){
       wholeCopy=whole[i];
       fitCopy=fit[i];
       for( j=i-1;(j>=0)&&fitCopy>fit[j];j--)
         {whole[j+1]=whole[j];
           fit[j+1]=fit[j];
         }
         whole[j+1]=wholeCopy;
         fit[j+1]=fitCopy;
     }
  int[][] wholeTemp=new int[cap][verNum];
  for(int i=0;i<cap;i++)
    for(int j=0;j<verNum;j++)
      wholeTemp[i][j]=whole[i][j];


     for(int i=0;i<cap;i++){
       double h=(double)cap*(double)(fit[i]/fitsum);

       unitnum[i]=(int)Math.round((double)cap*(double)(fit[i]/fitsum));//进行四舍五入
     }


     int pointer1=0;//unitnum[i]>1
     int pointer2=0;//unitnum[i]<1
     int up=0;

     while(pointer1<cap&&pointer2<cap){

       up=pointer1;
       while(up<cap&&unitnum[up]<=1){
         up++;
       }
       pointer1=up;

       up=pointer2;
         while(up<cap&&unitnum[up]>=1){
           up++;
         }
         pointer2=up;

        if(pointer1<cap&&pointer2<cap){
        whole[pointer2]=whole[pointer1];
        fit[pointer2]=fit[pointer1];
        unitnum[pointer1]=unitnum[pointer1]-1;
        unitnum[pointer2]=1;}

     }



 //给样本根据适应值排序,从小到大



 int  m=0;//m表示空间域
 int  n=0;
 int s1=0,s2=0,s=0;
 int f;
 while(m<cap*pc)//进行交叉操作
  {

  if(n==0)
  {
  s1=m;
   n=1;
  }
  else
  {
  s2=m;
  n=0;

  //c=rand()%22;//c随机产生的一个值
  f=(int)(Math.random()*xynum);
  int whole1[]=new int[xynum];
  int whole2[]=new int [xynum];
  int wholeCopy1[]=new int[verNum];
  int wholeCopy2[]=new int[verNum];
   whole1=Matrix.contraConvert(whole[s1], xy,xynum);
   whole2=Matrix.contraConvert(whole[s2], xy,xynum);
  for(int i=f;i<xynum;i++)//从c 开始后的所有位进行交叉,两两交叉
  {
  s=whole1[i];
  whole1[i]=whole2[i];
  whole2[i]=s;
  }
  wholeCopy1=Matrix.convert(whole1, xy,xynum);
  wholeCopy2=Matrix.convert(whole2, xy,xynum);
  if((Matrix.judge( aa,horNum,verNum, wholeCopy1, q)==true)&&Matrix.judge( aa,horNum,verNum, wholeCopy2, q)==true)
        {
          whole[s1]=wholeCopy1;
          whole[s2]=wholeCopy2;
        }

  }


  m++;
  }//while(m<50)//进行交叉操作


  double pp=0.0;
 for(int i=0;i<cap;i++)//进行变异,以很小的概率随机地改变一个串位的值
 {
 for(int j=0;j<xynum;j++)
 {
 pp=Math.random();
  if(pp<=pm) {
    int whole1[]=new int[xynum];
    int wholeCopy1[]=new int[verNum];

     whole1=Matrix.contraConvert(whole[i], xy,xynum);
     whole1[j]=(int)Math.random()*xy[j];
     wholeCopy1=Matrix.convert(whole1, xy,xynum);
     if(Matrix.judge( aa,horNum,verNum, wholeCopy1, q)==true)
       whole[i]=wholeCopy1;



 }
}
}

      for(int i=0;i<cap;i++){
        temp=Matrix.getZ(aa, horNum, verNum, whole[i],  c);
        fit[i] =(double) 1/temp;
        fitsum=fitsum+fit[i];
        }

      for(int i=1,j=0;i<cap;i++)
            if(fit[i]>fit[i-1]){
              wholeCopy=whole[i];
              fitCopy=fit[i];
              for( j=i-1;(j>=0)&&fitCopy>fit[j];j--)
                {whole[j+1]=whole[j];
                  fit[j+1]=fit[j];
                }
                whole[j+1]=wholeCopy;
                fit[j+1]=fitCopy;
            }


 int po1=0;
 int po2=(int)Math.round((cap * 0.95));
 if(po2==cap)
   po2=cap-1;
 while(po2<cap){
   whole[po2]=wholeTemp[po1];
   po2++;po1++;
 }



    k++;
   }while(k<loop);

  // System.out.print("第"+K+"代最小,最小值为:"+minfit0+"相应的x为:");


     //for(int i=0;i<verNum;i++)
      //System.out.print(xCopy[i]);
    // System.out.println("");
    int [] xxCopy=Matrix.contraConvert(xCopy,xy,xynum);
    try {
    BufferedReader in = new BufferedReader(new
             FileReader("a.dat"));
    String name,st="";
    for(int i=0;i<xynum;i++)
    {

      for (int j = 0; j < xxCopy[i] + 2; j++)
        st = in.readLine();
       StringTokenizer e= new StringTokenizer(st, "|");
       name = e.nextToken();
       lines=lines+name;
       while(e.hasMoreTokens()){
         name = e.nextToken();
         lines=lines+"->"+name;
       }
       lines=lines+"\n";
       st=in.readLine();
       while(st.equals("")==false)st=in.readLine();
    }


    in.close();




    } catch (IOException exception){   }


  }

  private static int K=0;
  private static long minflux0=0;
  private static int[] xCopy;
  private static String process="";
  private static String lines="";

  public static int getK(){
    return K;
  }
  public static long getMinflux(){
    return minflux0;
  }
  public static int[] getXCopy(){


    return xCopy;
  }
  public static String getProcess(){
    String m=process;
    process="";

    return m;


  }

  public static String getLines(){
    String m=lines;
    lines="";
    return m;
  }

}

class MinFit {
  public static long  GetMinFit(A a,int[] c){
    int aa[][];
    int verNum=a.getVerNum();//表示列数
    int horNum=a.getHorNum();//表示行数
    int [] xy=a.getXy();
    int xynum=a.getXynum();
    int [] xx=new int[xynum];
    int [] x=new int[verNum];
    aa=a.getA();

    long minFit=10000;

    int max=1;
    for( int i=0;i<xynum;i++)
      max=max*xy[i];
    //判断所xy[i]不为0
    for(long i=0;i<max;i++){
      //转化为xx[]
      long value=i;
      for(int j=0;j<xynum;j++){
        xx[j]=(int)value%xy[j];
        value=value/xy[j];
      }
      x=Matrix.convert(xx,xy,xynum);
      if(minFit>Matrix.getZ(aa,horNum,verNum,x,c)){
        minFit=Matrix.getZ(aa,horNum,verNum,x,c);
      }

    }


    return minFit;

  }

}

class Frame1_jButton2_actionAdapter implements java.awt.event.ActionListener {
  Frame1 adaptee;

  Frame1_jButton2_actionAdapter(Frame1 adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.jButton2_actionPerformed(e);
  }
}

class Frame1_jButton1_actionAdapter implements java.awt.event.ActionListener {
  Frame1 adaptee;

  Frame1_jButton1_actionAdapter(Frame1 adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.jButton1_actionPerformed(e);
  }
}

class Frame1_jButton3_actionAdapter implements java.awt.event.ActionListener {
  Frame1 adaptee;

  Frame1_jButton3_actionAdapter(Frame1 adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.jButton3_actionPerformed(e);
  }
}

⌨️ 快捷键说明

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