📄 ga.java
字号:
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 + -