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

📄 ga.java

📁 遗传算法的资料
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
                if(recombin1Flag == false)
                        return;
                int point;
                int[] index = new int[populationSize];

                Random randomNum = new Random();

                for(int i = 0; i < populationSize; i++){
                        index[i] = i;
                }

                for(int i = 0; i < populationSize; i++){
                        point = Math.abs(randomNum.nextInt())%(populationSize - i);
                        int temp = index[i];
                        index[i] = index[point + i];
                        index[point + i] = temp;
                }

                for(int i = 0; i < populationSize - 1; i += 2){
                        double num = Math.abs(randomNum.nextDouble());
                        if(num < PC){
                                point = Math.abs(randomNum.nextInt())%2 + 2;
                                while(point < 4){
                                        double gene = newpopulation[index[i]].getGene(point);
                                        newpopulation[index[i]].setGene(point, newpopulation[index[i+1]].getGene(point));
                                        newpopulation[index[i+1]].setGene(point, gene);
                                        point++;
                                }
                        }
                }
        }


        //父代中两个个体进行运算,其子代一个大,一个小,知道种群进化方向
        private void recombinTwo(boolean flag){
                if(flag == false)
                        return;
                int[] index = new int[populationSize];
                Random randomNum = new Random();
                int point;

                for(int i = 0; i < populationSize; i++){
                        index[i] = i;
                }

                for(int i = 0; i < populationSize; i++){
                        point = Math.abs(randomNum.nextInt())%(populationSize - i);
                        int temp = index[i];
                        index[i] = index[point + i];
                        index[point + i] = temp;
                }

                for(int i = 0; i < populationSize - 1; i += 2){
                        double num = Math.abs(randomNum.nextDouble());
                        if(num < PC){
                                Individual HighFitness = population[i].getFitness() > population[i + 1].getFitness() ? population[i] : population[i + 1];
                                Individual LowFitness = population[i].getFitness() < population[i + 1].getFitness() ? population[i] : population[i + 1];
                                for(int j = 1; j < 4; j++){
                                        double gene;
                                        int loop = 0;
                                        do{
                                                gene = HighFitness.getGene(j) + randomNum.nextDouble() * (HighFitness.getGene(j) - LowFitness.getGene(j));
                                                newpopulation[i].setGene(j, gene);
                                                loop ++;
                                        	if(loop > 10000){
                                        		break;
                                        	}
                                        }while(gene > Individual.FIELD[1][j - 1] || gene < Individual.FIELD[0][j - 1]);
                                }
                                for(int j = 1; j < 4; j++){
                                        newpopulation[i + 1].setGene(j, HighFitness.getGene(j) - randomNum.nextDouble() * (HighFitness.getGene(j) - LowFitness.getGene(j)));
                                }
                        }
                }
        }

        private void recombinThree(boolean flag){
                if(flag == false)
                        return;
                int[] index = new int[populationSize];
                Random randomNum = new Random();
                int point;

                for(int i = 0; i < populationSize; i++){
                        index[i] = i;
                }

                for(int i = 0; i < populationSize; i++){
                        point = Math.abs(randomNum.nextInt())%(populationSize - i);
                        int temp = index[i];
                        index[i] = index[point + i];
                        index[point + i] = temp;
                }

                for(int i = 0; i < populationSize - 2; i += 3){
                        double num = Math.abs(randomNum.nextDouble());
                        if(num < PC){
                                //high指向fitness最大的,low指向fitness最小的,mid指向中间的
                                Individual high = 
                                        population[i].getFitness() > population[i + 1].getFitness() ? population[i] : population[i + 1];
                                Individual low = 
                                        population[i].getFitness() < population[i + 1].getFitness() ? population[i] : population[i + 1];
                                Individual mid = population[i + 2];
                                if(mid.getFitness() > high.getFitness()){
                                        Individual tmp = high;
                                        high = mid;
                                        mid = tmp;
                                }else if(mid.getFitness() < low.getFitness()){
                                        Individual tmp = low;
                                        low = mid;
                                        mid = tmp;
                                }

                                for(int j = 1; j < 4; j++){
                                        double gene;
                                        int loop = 0;
                                        do{
                                                gene = high.getGene(j) + 
                                                        randomNum.nextDouble() * (mid.getGene(j) + low.getGene(j)) / 2;
                                                loop ++;
                                        	if(loop > 10000){
                                        		break;
                                        	}
                                        }while(gene > Individual.FIELD[1][j - 1] || gene < Individual.FIELD[0][j - 1]);
                                        newpopulation[i].setGene(j, gene);
                                }
                                for(int j = 1; j < 4; j++){
                                        double gene;
                                        do{
                                                gene = high.getGene(j) -
                                                        randomNum.nextDouble() * (mid.getGene(j) + low.getGene(j)) / 2;
                                        }while(gene > Individual.FIELD[1][j - 1] || gene < Individual.FIELD[0][j - 1]);
                                        newpopulation[i].setGene(j, gene);
                                }
                        }
                }
        }

        //简单遗传算法的变异
        private void mutateOne(boolean flag){
                if(flag == false)
                        return;
                Random randomNum = new Random();
                for(int i = 0; i < populationSize; i++){
                        for(int j = 0; j < 3; j++){
                                double num = randomNum.nextDouble();
                                if(num < PM){
                                        double gene = Individual.FIELD[0][j] + 
                                                (Individual.FIELD[1][j] - Individual.FIELD[0][j]) * randomNum.nextDouble();
                                        newpopulation[i].setGene(j + 1, gene);
                                }
	}
                }
        }
        //根据种群的差异来改变变异概率的变异
        private void mutateTwo(boolean flag){
                if(flag == false)
                        return;
                double hamming = 0.0;
                double fieldhamming = 0.0;
                Arrays.sort(population);
                for(int i = 0; i < 3; i++){
                        hamming += Math.abs(population[0].getGene(i + 1)) + Math.abs(population[populationSize - 1].getGene(i + 1));
                        fieldhamming += Math.abs(Individual.FIELD[0][i]) + Math.abs(Individual.FIELD[1][i]);
                }

                if(hamming < fieldhamming / 5){
                        double tmp = PM;
                        PM = 1 - PM;
                        mutateOne(true);
                        PM = tmp;
                }else{
                	mutateOne(true);
                }
        }

        //从排序后的population中交替进行变异,既保留最优个体,又将好的个体进行变异,同时保留一定劣等个体以维持种群多样性
        private void mutateThree(boolean flag){
                if(flag == false)
                        return;
                Random randomNum = new Random();
                Arrays.sort(population);
                for(int i = populationSize - 2; i >= 0; i -= 2){
                        for(int j = 0; j < 3; j++){
                                double num = randomNum.nextDouble();
                                if(num < PM){
                                        double gene = Individual.FIELD[0][j] + 
                                                (Individual.FIELD[1][j] - Individual.FIELD[0][j]) * randomNum.nextDouble();
                                        newpopulation[i].setGene(j + 1, gene);
                                }
	}                       
                }

                for(int i = populationSize - 1; i >= 0; i -= 2){
                        newpopulation[i].copy(population[i]);
                }
        }

        //用newpopulation全部替换population
        private void replace(){
                for(int i = 0; i < populationSize; i++){
                        newpopulation[i].calObjv();
                        population[i].copy(newpopulation[i]);
                }
        }

        private void printResult(int i){
                Arrays.sort(population);
                result[i].copy(population[0]);
                NumberFormat nf = NumberFormat.getInstance();
                System.out.println(nf.format(result[i].getGene(1))+"\t"+ nf.format(result[i].getGene(2))+"\t"+
                                   nf.format(result[i].getGene(3))+"\t"+ nf.format(result[i].getObjv())+"\t"+
                                   nf.format(result[i].getFitness()));
        }

        public static void main(String[] args){
                GA frame = new GA();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(400, 400);
                frame.setVisible(true);
        }
}

⌨️ 快捷键说明

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