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

📄 ga.java

📁 遗传算法的资料
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
                selectGroup.add(selectTwo);
                selectGroup.add(selectThree);
                selectOne.addActionListener(this);
                selectTwo.addActionListener(this);
                selectThree.addActionListener(this);

                JPanel recombinPanel = new JPanel();
                recombinPanel.add(recombinOne = new JRadioButton("Simple GA recombine"));
                recombinOne.setToolTipText("Simple GA recombine operator");
                recombinPanel.add(recombinTwo = new JRadioButton("Improved One"));
                recombinTwo.setToolTipText("Parents add or sub to generate one biger than them, one less than them");
                recombinPanel.add(recombinThree = new JRadioButton("Improved Two"));
		recombinThree.setToolTipText("Three parents add or sub");
                recombinPanel.setBorder(new TitledBorder("recombine"));
                ButtonGroup recombinGroup = new ButtonGroup();
                recombinGroup.add(recombinOne);
                recombinGroup.add(recombinTwo);
                recombinGroup.add(recombinThree);
                recombinOne.addActionListener(this);
                recombinTwo.addActionListener(this);
                recombinThree.addActionListener(this);

                JPanel mutatePanel = new JPanel();
                mutatePanel.add(mutateOne = new JRadioButton("Simple GA mutate"));
                mutateOne.setToolTipText("Simple GA mutate operator");
                mutatePanel.add(mutateTwo = new JRadioButton("Improved One"));
                mutateTwo.setToolTipText("Based on the difference of chromosomes");
                mutatePanel.add(mutateThree = new JRadioButton("Improved Two"));
                mutateThree.setToolTipText("Mutate alternatively");
                mutatePanel.setBorder(new TitledBorder("mutate"));
                ButtonGroup mutateGroup = new ButtonGroup();
                mutateGroup.add(mutateOne);
                mutateGroup.add(mutateTwo);
                mutateGroup.add(mutateThree);
                mutateOne.addActionListener(this);
                mutateTwo.addActionListener(this);
                mutateThree.addActionListener(this);
                
                container.add(populationSizeLabel);
                container.add(populationSizeText);
                container.add(maxGenerationLabel);
                container.add(maxGenerationText);
                container.add(selectPanel);
                container.add(recombinPanel);
                container.add(mutatePanel);
                container.add(startButton);
                populationSizeText.addActionListener(this);
                maxGenerationText.addActionListener(this);
                startButton.addActionListener(this);
       }

        public void actionPerformed(ActionEvent e){
                if(e.getSource() == startButton){
                        if(selectOne.isSelected()){
                                select1Flag = true;
                                select2Flag = false;
                                select3Flag = false;
                        }else if(selectTwo.isSelected()){
                                select2Flag = true;
                                select1Flag = false;
                                select3Flag = false;
                        }else if(selectThree.isSelected()){
                                select3Flag = true;
                                select1Flag = false;
                                select2Flag = false;
                        }
                        if(recombinOne.isSelected()){
                                recombin1Flag = true;
                                recombin2Flag = false;
                                recombin3Flag = false;
                        }else if(recombinTwo.isSelected()){
                                recombin2Flag = true;
                                recombin1Flag = false;
                                recombin3Flag = false;
                        }else if(recombinThree.isSelected()){
                                recombin3Flag = true;
                                recombin1Flag = false;
                                recombin2Flag = false;
                        }
                        if(mutateOne.isSelected()){
                                mutate1Flag = true;
                                mutate2Flag = false;
                                mutate3Flag = false;
                        }else if(mutateTwo.isSelected()){
                                mutate2Flag = true;
                                mutate1Flag = false;
                                mutate3Flag = false;
                        }else if(mutateThree.isSelected()){
                                mutate3Flag = true;
                                mutate1Flag = false;
                                mutate2Flag = false;
                        }

                        populationSize = Integer.parseInt(populationSizeText.getText().trim());
                        maxGeneration = Integer.parseInt(maxGenerationText.getText().trim());

						initPopulation();
						for(int gen = 0; gen < maxGeneration; gen++){
							calFitness();
							selectOne(true);
							recombinOne(true);
							mutateOne(true);
							replace();
							printResult(gen);
						}
						double[] sgaresult = new double[maxGeneration];
						for(int i = 0; i < maxGeneration; i++){
							sgaresult[i] = result[i].getFitness();
						}
						
                        initPopulation();
                        for(int gen = 0; gen < maxGeneration; gen++){
                                calFitness();
                                selectOne(select1Flag);
                                selectTwo(select2Flag);
                                selectThree(select3Flag);
                                recombinOne(recombin1Flag);
                                recombinTwo(recombin2Flag);
                                recombinThree(recombin3Flag);
                                mutateOne(mutate1Flag);
                                mutateTwo(mutate2Flag);
                                mutateThree(mutate3Flag);
                                replace();
                                printResult(gen);
                        }
                  
                        double[] fitnessresult = new double[maxGeneration];
                        for(int i = 0; i < maxGeneration; i ++){
                                fitnessresult[i] = result[i].getFitness();
                        }

                        GraphicsPanel graphicsPanel = new GraphicsPanel(sgaresult, fitnessresult, maxGeneration);
                        JFrame graphicsFrame = new JFrame("Graphics result");
                        graphicsFrame.getContentPane().add(graphicsPanel);
                        graphicsFrame.setSize(1000, 500);
                        graphicsFrame.pack();
                        graphicsFrame.setVisible(true);
                }
        }

        private void initPopulation(){
                population = new Individual[populationSize];
                newpopulation = new Individual[populationSize];
                result = new Individual[maxGeneration];
                for(int i = 0; i < populationSize; i++){
                        population[i] = new Individual();
                        newpopulation[i] = new Individual();
                }
                for(int i = 0; i < maxGeneration; i++){
                        result[i] = new Individual();
                }
        }

        //use objv as fitness
        private void calFitness(){
                for(int i = 0; i < populationSize; i++){
                        population[i].setFitness(population[i].getObjv());
                }
        }
                        
        //轮盘赌选择
        private void selectOne(boolean flag){
                if(flag == false)
                        return;
                double[] cfitness = new double[populationSize];
                cfitness[0] = population[0].getFitness();
                for(int i = 1; i < populationSize; i++){
                        cfitness[i] = population[i].getFitness() + cfitness[i - 1];
                }

                Random randomNum = new Random();
                for(int i = 0; i < populationSize; i++){
                        int index = 0;
                        double num = Math.abs(randomNum.nextDouble()) * cfitness[populationSize -1];
                        while(num > cfitness[index]){
                                index++;
                        }
                        newpopulation[i].copy(population[index]);
                }       
        }

        //将population的前1/4复制一份,将population的后1/4复制一份
        private void selectTwo(boolean flag){
                if(flag == false)
                        return;
                Arrays.sort(population);
                int half = (int)populationSize / 2;
                int quarter = (int)populationSize / 4;
                for(int i = 0; i < quarter; i ++){ //将poplation中好的1/4复制到newpopulation中的前1/4
                        newpopulation[i].copy(population[i]);
                }
                for(int i = quarter; i < half; i++){ //复制前1/4
                        newpopulation[i].copy(population[i - quarter]);
                }
                for(int i = half, j = 0; i < half + quarter; i++, j++){ //将population中的后1/4复制到newpopulation
                        newpopulation[i].copy(population[populationSize - j - 1]);
                }
                for(int i = half + quarter; i < populationSize; i++){ //复制后1/4
                        newpopulation[i].copy(population[i]);
                }
        }
        
        private void selectThree(boolean flag){
                if(flag == false)
                        return;
                //将排序后的population每个个体对应的序号映射到[1/populationSize, 1]作为选择的依据
                double[] cfitness = new double[populationSize];
                for(int i = 0; i < populationSize; i++){
                        cfitness[i] = (populationSize - i) / populationSize;
                }
                Arrays.sort(population);

                Random randomNum = new Random();
                for(int i = 0; i < populationSize; i++){
                        int index = populationSize - 1;
                        double num = Math.abs(randomNum.nextDouble()) * cfitness[0];
                        while(num > cfitness[index] && index >= 0){
                                index--;
                        }
                        newpopulation[i].copy(population[index]);
                }
        }

        //简单遗传算法的交叉
        private void recombinOne(boolean flag){

⌨️ 快捷键说明

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