量子進化演算法程式

bug不存在的發表於2021-10-11

這段量子進化演算法程式引數設定:種群大小為30,量子位數目為18.

import java.io.*;

import java.util.Date;



/*

 * 始終用全域性最優更新

 *

 * 種群大小為30

 * Max_Generations 最大進化代數為30代

 * maxRun 執行次數為30次

 */

public class Main_GlobalPSystemEvolver {

    double com=1/Math.sqrt(2.0);//把根號2分之1的值賦給com

    double[][] QBits=new double[60][18];//一個量子位元中有一對複數,種群有30代 ,需要60個複數

    double aQBit[][]=new double[2][18];//宣告2個二維陣列並初始化,初始值全部為0;

    int qbitCode[][]=new int[30][18];//種群大小30,量子位數目18,定義量子位元編碼為整型

    int fitness[]=new int[30];//初始化一維陣列,規定陣列大小為30;

    int i=0,j=0;

    static int maxRun=30;

    static int SUCCESS=0;

    static int FAIL=0;

    static int totalGenerations=0;

    int currentGenerations=0;

    int Max_Generations=30;

    int BestFitness;

    int con_fitness;//歷史最優適應值

    int con_individual[]=new int[18];

    int index;

    int randPN;

    double rand;

        

    String BestRule;

   

    Quantum_Update update;

    PSystem_FitnessFunction psf;

    PSystem_Individual psi=new PSystem_Individual();

    //PrintStream outputFitness = null;

   

    public Main_GlobalPSystemEvolver(){

        

    }

    //量子位初始化

    public void Initial(){

        for(i=0;i<60;i++){

            for(j=0;j<18;j++){

                rand=Math.random();//產生隨機數,可返回0到1之間的一個隨機數

                if (rand<0.5)

                    randPN=1;

                else

                    randPN=-1;

                QBits[i][j]=randPN*com;//隨機為正負根號2分之1,為量子位元中兩個分量的值

            }

        }

    }

    //量子觀測

    public void QBitChange(double[][] bits){//定義了二維陣列變數位元位:bits

        int k=0;

        for(i=0;i<bits.length;i++){//以行進行迴圈

            if (i%2==0){

                for(j=0;j<bits[i].length;j++){//以每行的列數迴圈

                    rand=Math.random();//兩個for迴圈取得二維陣列中的每一個值

                    if(rand<(bits[i][j]*bits[i][j]))

                        qbitCode[k][j]=0;

                    else

                        qbitCode[k][j]=1;//對量子位元進行二進位制編碼

                }

                k=k+1;

            }

            else

                continue;

        }

    }

    //確定性

    public void QBitDeterminate(int[][] qbits){//定義了二維陣列qbits

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

            if(qbits[i][0]+qbits[i][3]==2){//兩個for迴圈取得二維陣列中的每一個值

                rand=Math.random();//產生隨機數

                if(rand<=0.5)

                    qbits[i][0]=0;

                else

                    qbits[i][0]=1;//二進位制編碼

                qbits[i][3]=1-qbits[i][0];   

            }

            


            if(qbits[i][1]+qbits[i][14]==2){

                rand=Math.random();

                if(rand<=0.5)

                    qbits[i][14]=0;

                else

                    qbits[i][14]=1;

                qbits[i][1]=1-qbits[i][14];

            }

            

            if(qbits[i][2]+qbits[i][15]==2){

                rand=Math.random();

                if(rand<=0.5)

                    qbits[i][15]=0;

                else

                    qbits[i][15]=1;

                qbits[i][2]=1-qbits[i][15];

            }

            

            if(qbits[i][4]+qbits[i][8]==2){

                rand=Math.random();

                if(rand<=0.5)

                    qbits[i][4]=0;

                else

                    qbits[i][4]=1;

                qbits[i][8]=1-qbits[i][4];

            }

            

            if(qbits[i][5]+qbits[i][6]+qbits[i][9]==3){

                rand=Math.random();

                if(rand<=1.0/3){

                    qbits[i][5]=1;

                    qbits[i][6]=0;

                    qbits[i][9]=0;

                }   

                else{

                    if(rand>2.0/3){

                        qbits[i][5]=0;

                        qbits[i][6]=0;

                        qbits[i][9]=1;

                    }

                    else{

                        qbits[i][5]=0;

                        qbits[i][6]=1;

                        qbits[i][9]=0;

                    }   

                }

            }

            else{

                if(qbits[i][5]+qbits[i][6]==2){

                    rand=Math.random();

                    if(rand<=0.5)

                        qbits[i][5]=0;

                    else

                        qbits[i][5]=1;

                    qbits[i][6]=1-qbits[i][5];

                }

                if(qbits[i][5]+qbits[i][9]==2){

                    rand=Math.random();

                    if(rand<=0.5)

                        qbits[i][5]=0;

                    else

                        qbits[i][5]=1;

                    qbits[i][9]=1-qbits[i][5];

                }

                if(qbits[i][6]+qbits[i][9]==2){

                    rand=Math.random();

                    if(rand<=0.5)

                        qbits[i][6]=0;

                    else

                        qbits[i][6]=1;

                    qbits[i][9]=1-qbits[i][6];

                }

            }

            

            if(qbits[i][7]+qbits[i][10]==2){

                rand=Math.random();

                if(rand<=0.5)

                    qbits[i][7]=0;

                else

                    qbits[i][7]=1;

                qbits[i][10]=1-qbits[i][7];

            }

            

            if(qbits[i][11]+qbits[i][16]+qbits[i][17]==3){

                rand=Math.random();

                if(rand<=1.0/3){

                    qbits[i][11]=1;

                    qbits[i][16]=0;

                    qbits[i][17]=0;

                }   

                else{

                    if(rand>2.0/3){

                        qbits[i][11]=0;

                        qbits[i][16]=0;

                        qbits[i][17]=1;

                    }

                    else{

                        qbits[i][11]=0;

                        qbits[i][16]=1;

                        qbits[i][17]=0;

                    }   

                }

            }

            else{

                if(qbits[i][11]+qbits[i][16]==2){

                    rand=Math.random();

                    if(rand<=0.5)

                        qbits[i][11]=0;

                    else

                        qbits[i][11]=1;

                    qbits[i][16]=1-qbits[i][11];

                }

                if(qbits[i][11]+qbits[i][17]==2){

                    rand=Math.random();

                    if(rand<=0.5)

                        qbits[i][11]=0;

                    else

                        qbits[i][11]=1;

                    qbits[i][17]=1-qbits[i][11];

                }

                if(qbits[i][16]+qbits[i][17]==2){

                    rand=Math.random();

                    if(rand<=0.5)

                        qbits[i][16]=0;

                    else

                        qbits[i][16]=1;

                    qbits[i][17]=1-qbits[i][16];

                }

            }

        }

    }

   

//獲得一維陣列arr[]中所有元素的最小值,返回最小值及其索引位置

    public int min(int[] arr){  

        int m=arr[0];

        for (i=1; i< arr.length; i++){

            if (arr[i]<m){

                m=arr[i];

                index=i;

            }

        }

        return m;

    }

   

    public void Run(){

      

        int iGenerations=0;

        

        Initial();

        QBitChange(QBits);

        QBitDeterminate(qbitCode);

        

        

        //獲得各個個體的適應值

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

            psf=new PSystem_FitnessFunction(qbitCode[i]);

            fitness[i]=psf.fitnessValue;

            

        }

        

            

        BestFitness=min(fitness);        

        con_fitness=BestFitness;

        for(i=0;i<18;i++){

            con_individual[i]=qbitCode[index][i];

        }   

        

        while(iGenerations<(Max_Generations-1)&&BestFitness>0){

            iGenerations=iGenerations+1;

            

            for (j=0; j<30;j++){

                aQBit[0]=QBits[2*j];

                aQBit[1]=QBits[2*j+1];

                //量子更新

                update=new Quantum_Update(con_individual,qbitCode[j],aQBit,con_fitness,fitness[j]);

                QBits[2*j]=update.newQBit[0];

                QBits[2*j+1]=update.newQBit[1];

            }

            QBitChange(QBits);

            QBitDeterminate(qbitCode);

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

                //fileLength=fil.length();

                psf=new PSystem_FitnessFunction(qbitCode[i]);

                fitness[i]=psf.fitnessValue;

            }

            

            

            BestFitness=min(fitness);

            if(BestFitness<=con_fitness){

                con_fitness=fitness[index];

                for(i=0;i<18;i++){

                    con_individual[i]=qbitCode[index][i];

                }

            }

        }

        

        //獲取最優規則集

        BestRule=psi.getRule(con_individual);

        currentGenerations=iGenerations;

        totalGenerations+=currentGenerations;

   

    }

   

    public static void main(String args[]){

        Main_GlobalPSystemEvolver evo=new Main_GlobalPSystemEvolver();

        Date d1 = new Date();

        System.out.println(d1.toString());

        

        PrintStream outputFile = null;

        try {

            outputFile = new PrintStream(new FileOutputStream(

                    "D:\\java\\workspace\\SquareOfFour\\Results.txt", true));

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        }

        

        for(int r=0;r<maxRun;r++){

            

            evo.Run();

            

            if (evo.BestFitness==0)

                SUCCESS++;

            else

                FAIL++;

            outputFile.println("===================================");

            outputFile.println("BEGIN RUN:\t"+(r+1)+"\nGenerations="+evo.currentGenerations+"\tBestFitness="+

                    evo.BestFitness+"\nBestRule:\n"+evo.BestRule);

            

        }

        

        Date d2 = new Date();

        int seconds = (int) ((d2.getTime() - d1.getTime()) / 1000);

        

        outputFile.println("\nTotalGenerations:"+totalGenerations+"\nSuccess:"+SUCCESS+"\nFail:"+

                FAIL+"\nDuration: " + (seconds / 60) + " minutes "+ (seconds % 60) + " seconds \n");

        

        outputFile.close();

        

    }


}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70007877/viewspace-2795296/,如需轉載,請註明出處,否則將追究法律責任。

相關文章