实数编码遗传算法求解函数最优值

目标函数:

《实数编码遗传算法求解函数最优值》

JAVA实现,定义了3个类:染色体类,GA类,测试类

package test;

import java.util.Random;

public class Chrome {
double[] genes;
double fitness;
double nfitness;
int genelength;
Random random = new Random();

/**
* 初始化染色体
*/
Chrome() {
genelength = 10;
genes = new double[genelength];
for (int i = 0; i < genes.length; i++) {
genes[i] = 0;
genes[i] = random.nextDouble() * 200 – 100;
}
}

/**
* 染色体评估
*/
void evalue() {
double sum = 0;
for (int index = 0; index < genes.length; index++) {
sum += genes[index] * genes[index];
}
double fenzi = Math.sin(Math.sqrt(sum)) * Math.sin(Math.sqrt(sum)) – 0.5;
double fenmu = (1 + 0.001 * sum) * (1 + 0.001 * sum);
fitness = 10 – fenzi / fenmu + 0.5;
// fitness = 50 + 20 * Math.exp(-0.2 * Math.sqrt(sum / genes.length)) +
// Math.exp(sum1 / genes.length) – Math.exp(1)
// – 20;
// for (int i = 0; i < genes.length – 1; i++) {
// sum += 100 * (genes[i] * genes[i] – genes[i + 1]) * (genes[i] * genes[i] –
// genes[i + 1]);
// sum1 += (genes[i] – 1) * (genes[i] – 1);
// }
// fitness = fitness – sum1;
}

/**
* 变异

* @param pm
*            变异概率
*/

void mutation(double pm) {
for (int i = 0; i < genes.length; i++) {
double p = random.nextDouble();
if (p < pm) {
if (random.nextDouble() > 0.5) {
genes[i] += genes[i] * 0.5;
} else {
genes[i] -= genes[i] * 0.5;
}
}
}
}

/**
* 交叉

* @param pc
*            交叉概率
* @param another
*            交叉对象
*/
void crossvoer(double pc, Chrome another) {
double p = random.nextDouble();
if (p < pc) {
int pos = random.nextInt(genes.length);
double temp;
for (int i = 0; i < pos; i++) {
temp = genes[i];
genes[i] = another.genes[i];
another.genes[i] = temp;
}
}

}

/**
* 从另外一个对象得到数据

* @param another
*/
void copyFromAnother(Chrome another) {
genelength = another.genelength;
fitness = another.fitness;
for (int i = 0; i < genes.length; i++) {
genes[i] = another.genes[i];
}
}

@Override
public String toString() {
// TODO Auto-generated method stub
String string = “”;
string += “染色体包含的基因串是:”;
for (int i = 0; i < genes.length; i++) {
string += genes[i];
}
string += “\n染色体的适应值是:” + fitness;
return string;
}

}

package test;

import java.util.Random;

public class GA {
int popsize;
Chrome chromes[];
double pc, pm, MaxGen;
Chrome tempchromes[];
Random random = new Random();
Chrome prefectchrome = new Chrome();
double bestValue = 0;

/**
* 遗传算法初始化种群

* @param pop
*            种群数量
* @param p1
*            交叉概率
* @param p2
*            变异概率
* @param max
*            最大进化代数
*/
GA(int pop, double p1, double p2, double max) {
popsize = pop;
pc = p1;
pm = p2;
MaxGen = max;
chromes = new Chrome[popsize];
tempchromes = new Chrome[popsize];
for (int i = 0; i < chromes.length; i++) {
chromes[i] = new Chrome();
tempchromes[i] = new Chrome();
chromes[i].evalue();
tempchromes[i].evalue();
}
}

GA() {
// GA(100,0.85,0.01,5000)
pc = 0.85;
pm = 0.01;
MaxGen = 5000;
popsize = 100;
chromes = new Chrome[popsize];
tempchromes = new Chrome[popsize];
for (int i = 0; i < chromes.length; i++) {
chromes[i] = new Chrome();
tempchromes[i] = new Chrome();
chromes[i].evalue();
tempchromes[i].evalue();
}
}

/**
* 选择运算
*/
void selection() {
double sum = 0;
for (int i = 0; i < chromes.length; i++) {
sum += chromes[i].fitness;
}
for (int i = 0; i < chromes.length; i++) {
chromes[i].nfitness = chromes[i].fitness / sum;
}
double p;
for (int i = 0; i < chromes.length; i++) {
p = random.nextDouble();
sum = 0;
int selectIndex = chromes.length – 1;
for (int j = 0; j < chromes.length; j++) {
sum += chromes[j].nfitness;
if (sum > p) {
selectIndex = j;
break;
}
}
tempchromes[i].copyFromAnother(chromes[selectIndex]);
}
for (int i = 0; i < chromes.length; i++) {
chromes[i].copyFromAnother(tempchromes[i]);
}
}

void run() {

for (int gen = 0; gen < MaxGen; gen++) {
selection();
for (int i = 0; i < chromes.length; i = i + 2) {
chromes[i].crossvoer(pc, chromes[i + 1]);
}
for (int i = 0; i < chromes.length; i++) {
chromes[i].mutation(pm);
chromes[i].evalue();
// System.out.println(chromes[i].fitness);
if (chromes[i].fitness > bestValue) {
bestValue = chromes[i].fitness;
prefectchrome.copyFromAnother(chromes[i]);
System.out.println(“算法运行到第” + gen + “代发现最优值:” + bestValue);
System.out.println(prefectchrome.toString());
}
}
chromes[0].copyFromAnother(prefectchrome);
}

}

}


package test;

public class Tset {

public static void main(String[] args) {
GA ga = new GA(100, 0.85, 0.1, 10000);
ga.run();
}

}

    原文作者:遗传算法
    原文地址: https://blog.csdn.net/fengzhongzhui_feng/article/details/79743105
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞