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

📄 ga.java

📁 遗传算法的资料
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
import java.util.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.text.NumberFormat;

class Individual implements Comparable{
        public static final double[][] FIELD = {
                {-1.682, -1.682, -1.682},
                {1.682, 1.682, 1.682}};
        public static final double[][] BOUND = {
                {120, 1000, 400, 60},
                {169.999, 1299.999, 500, 67.5},
                {170, 1300, 600, 75}};
        private static final double C = 0.001;
        private double[] gene;
        private double objv;
        private double fitness;

        public Individual(){
                gene = new double[3];
                Random num = new Random();
                gene[0] = FIELD[0][0] + (FIELD[1][0] - FIELD[0][0]) * num.nextDouble();
                gene[1] = FIELD[0][1] + (FIELD[1][1] - FIELD[0][1]) * num.nextDouble();
                gene[2] = FIELD[0][2] + (FIELD[1][2] - FIELD[0][2]) * num.nextDouble();
                calObjv();
        }

		//计算objv的值	
        void calObjv(){
                double x1 = gene[0];
                double x2 = gene[1];
                double x3 = gene[2];
                double[] y = new double[4];
                double yproduct = 1.0;
                y[0] = 139.12 + 16.49*x1 + 17.88*x2 + 10.91*x3  -  4.01*Math.pow(x1, 2) - 3.45*Math.pow(x2, 2)  - 
                        1.57*Math.pow(x3, 2) + 5.13*x1*x2 + 7.31*x1*x3  +  7.88*x2*x3;
                y[1] = 1261.11 + 268.15*x1 + 246.50*x2 + 139.48*x3 -  83.55*Math.pow(x1, 2) - 124.79*Math.pow(x2, 2) +  
                        199.17*Math.pow(x3, 2) + 69.38*x1*x2 + 94.13*x1*x3 + 104.38*x2*x3;
                y[2] = 400.38 - 99.67*x1 - 31.40*x2 - 73.92*x3 +  7.93*Math.pow(x1, 2) + 17.31*Math.pow(x2, 2) +  
                        0.43*Math.pow(x3, 2) + 0.75*x1*x2 + 6.25*x1*x3 +  1.25*x2*x3;
                y[3] = 68.91 - 1.41*x1 + 4.32*x2 + 1.63*x3 + 1.56*Math.pow(x1, 2) + 0.06*Math.pow(x2, 2) -
                        0.32*Math.pow(x3, 2) - 1.63*x1*x2 + 0.13*x1*x3 - 0.25*x2*x3;
                for(int i = 0; i < 4; i++){
                        if (y[i] < BOUND[0][i]) 
                                yproduct *= C;
                        else if (y[i] > BOUND[2][i])
                                if( (BOUND[2][i] - BOUND[1][i]) < 0.1)  /*望大类型*/
                                        yproduct *= 1.0;
                                else /*望目类型*/
                                        yproduct *= C;
                        else if (y[i] >= BOUND[0][i] && y[i] < BOUND[1][i])
                                yproduct *= (y[i] - BOUND[0][i]) / (BOUND[1][i] - BOUND[0][i]);
                        else
                                yproduct *= (BOUND[2][i] - y[i]) / (BOUND[2][i] - BOUND[1][i]);
                }
                objv = Math.pow(yproduct, 1.0/4);
        }
        
        //复制Individual
        public void copy(Individual one){
                this.gene[0] = one.getGene(1);
                this.gene[1] = one.getGene(2);
                this.gene[2] = one.getGene(3);
                this.objv = one.getObjv();
                this.fitness = one.getFitness();
        }
        
        //得到基因id - 1的值
        public double getGene(int id){
                return gene[id - 1];
        }
        
        //设置基因id - 1的值
        public void setGene(int id, double value){
                gene[id - 1] = value;
        }
        
        //得到objv的值
        public double getObjv(){
                return objv;
        }
        
        //设置objv的值
        public void setObjv(double value){
                this.objv = value;
        }
        
        //得到fitness的值
        public double getFitness(){
                return fitness;
        }
        
        //设置fitness的值
        public void setFitness(double value){
                this.fitness = value;
        }
        
        //用于Individual数组排序,按照fitness从小到大的顺序
        public int compareTo(Object one){
                Individual someone = (Individual)one;
                return this.fitness < someone.fitness ? 1 :
	(this.fitness == someone.fitness ? 0 : -1);
        }
}

class GraphicsPanel extends JPanel{
        private double[] sgaresult;   //存放结果的fitness值
        private double[] betterresult; //存放改进算子的结果
        private int maxGeneration; //最大遗传代数
        
        public GraphicsPanel(double[] sgaresult, double[] betterresult, int maxGeneration){
                this.maxGeneration = maxGeneration;
                this.sgaresult = sgaresult;
                this.betterresult = betterresult;
                repaint();
        }
        
        //绘出坐标轴和适应度的曲线
        public void paintComponent(Graphics g){
                if(sgaresult == null || betterresult == null)
                        return;
                super.repaint();
                //Y轴最上面的顶点坐标
                int TopX = 50;
                int TopY = 50;
                //X轴最右面的顶点坐标
                int RightX = 950;
                int RightY = 450;
                g.drawLine(TopX, TopY, TopX, RightY); //画Y轴
                g.drawString("Fitness", TopX - 25, TopY - 20);
                g.drawLine(TopX, RightY, RightX, RightY); //画X轴
                g.drawString("Generation", RightX - 50, RightY + 20);
                int Yper = (int)((RightY - TopY) / 100); //Y轴每个刻度所跨的像素数
                
                for(int i = 0; i < 100; i++){ //画Y轴的刻度线
                        if(i % 10 != 0){ 
                                g.drawLine(TopX -2, TopY + i * Yper, TopX + 2, TopY + i * Yper);
                        }else{
                                g.drawLine(TopX - 3, TopY + i * Yper, TopX + 3, TopY + i * Yper);
                        }
                }
                g.drawString("1.0", TopX - 30, TopY);
                g.drawString("0.9", TopX - 30, TopY + 10 * Yper);
                g.drawString("0.8", TopX - 30, TopY + 20 * Yper);
                g.drawString("0.7", TopX - 30, TopY + 30 * Yper);
                g.drawString("0.6", TopX - 30, TopY + 40 * Yper);
                g.drawString("0.5", TopX - 30, TopY + 50 * Yper);
                g.drawString("0.4", TopX - 30, TopY + 60 * Yper);
                g.drawString("0.3", TopX - 30, TopY + 70 * Yper);
                g.drawString("0.2", TopX - 30, TopY + 80 * Yper);
                g.drawString("0.1", TopX - 30, TopY + 90 * Yper);
                g.drawString("0.0", TopX - 30, TopY + 100 * Yper);
                
                int Xper = (int)((RightX - TopX) / maxGeneration); //X轴每个刻度所跨的像素数
                for(int i = 0; i < maxGeneration; i ++){ //画X轴的刻度线
                        g.drawLine(TopX + i * Xper, RightY - 2, TopX + i * Xper, RightY + 2);
                        if(i % 5 == 0){
                        	g.drawString(Integer.toString(i), TopX + i * Xper, RightY + 20);
                        }
                }

				g.setColor(Color.black);
				g.drawLine(RightX - 150, TopY + 50, RightX - 100, TopY + 50);
				g.drawString("Simple GA result", RightX - 80, TopY + 50);
                for(int i = 1; i < sgaresult.length; i ++){ //画出以简单遗传算法的适应度为值的结果
                        g.drawLine(TopX + (i - 1) * Xper, (int)(RightY - 100 * sgaresult[i - 1] * Yper), 
                        	TopX + i * Xper, (int)(RightY - 100 * sgaresult[i] * Yper));
                }
                
                g.setColor(Color.red);
                g.drawLine(RightX - 150, TopY + 80, RightX - 100, TopY + 80);
                g.drawString("Improved GA result", RightX - 80, TopY + 80);
                for(int i = 1; i < betterresult.length; i++){ //画出以改进的算子的适应度为值的结果
                	    g.drawLine(TopX + (i - 1) * Xper, (int)(RightY - 100 * betterresult[i - 1] * Yper),
                	        TopX + i * Xper, (int)(RightY - 100 * betterresult[i] * Yper));
                }
        }
        
        //用于设定绘图窗口的大小
        public Dimension getPreferredSize(){
                return new Dimension(1000, 500);
        }
}

public class GA extends JFrame implements ActionListener{
        double PC = 0.7;  //交叉概率
        double PM = 0.1;  //变异概率
        int populationSize;  //种群大小
        int maxGeneration;   //最大遗传代数
        JTextField populationSizeText = new JTextField(5);
        JTextField maxGenerationText = new JTextField(5);       
        JRadioButton selectOne, selectTwo, selectThree;
        boolean select1Flag = false;
        boolean select2Flag = false;
        boolean select3Flag = false;
        JRadioButton recombinOne, recombinTwo, recombinThree;
        boolean recombin1Flag = false, recombin2Flag = false, recombin3Flag = false;
        JRadioButton mutateOne, mutateTwo, mutateThree;
        boolean mutate1Flag = false, mutate2Flag = false, mutate3Flag;
        JButton startButton = new JButton("Start");

        Individual[] population;
        Individual[] newpopulation;
        Individual[] result;

        public GA(){
                setTitle("GA");
                Container container = getContentPane();
                container.setLayout(new FlowLayout());
                JLabel populationSizeLabel = new JLabel("Population Size =");
                JLabel maxGenerationLabel = new JLabel("Maximize Generation =");

                JPanel selectPanel = new JPanel();
                selectPanel.add(selectOne = new JRadioButton("Simple GA select"));
                selectOne.setToolTipText("Simple GA select operator");
                selectPanel.add(selectTwo = new JRadioButton("Improved One"));
                selectTwo.setToolTipText("Copy 1/4 of good, and 1/4 of bad"); 
                selectPanel.add(selectThree = new JRadioButton("Improved Two"));
                selectThree.setToolTipText("use the sorted order as the probability of select");
                selectPanel.setBorder(new TitledBorder("select"));
                ButtonGroup selectGroup = new ButtonGroup();
                selectGroup.add(selectOne);

⌨️ 快捷键说明

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