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