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