public class Chromosome {
private boolean[] gene;//基因序列
private double score;//对应的函数得分
}
public Chromosome(int size) {
if (size <= 0) {
return;
}
initGeneSize(size);
for (int i = 0; i < size; i++) {
gene[i] = Math.random() >= 0.5;
}
}
private void initGeneSize(int size) {
if (size <= 0) {
return;
}
gene = new boolean[size];
}
public int getNum() {
if (gene == null) {
return 0;
}
int num = 0;
for (boolean bool : gene) {
num <<= 1;
if (bool) {
num += 1;
}
}
return num;
}
public void mutation(int num) {
//允许变异
int size = gene.length;
for (int i = 0; i < num; i++) {
//寻找变异位置
int at = ((int) (Math.random() * size)) % size;
//变异后的值
boolean bool = !gene[at];
gene[at] = bool;
}
}
public static Chromosome clone(final Chromosome c) {
if (c == null || c.gene == null) {
return null;
}
Chromosome copy = new Chromosome();
copy.initGeneSize(c.gene.length);
for (int i = 0; i < c.gene.length; i++) {
copy.gene[i] = c.gene[i];
}
return copy;
}
public static List<Chromosome> genetic(Chromosome p1, Chromosome p2) {
if (p1 == null || p2 == null) { //染色体有一个为空,不产生下一代
return null;
}
if (p1.gene == null || p2.gene == null) { //染色体有一个没有基因序列,不产生下一代
return null;
}
if (p1.gene.length != p2.gene.length) { //染色体基因序列长度不同,不产生下一代
return null;
}
Chromosome c1 = clone(p1);
Chromosome c2 = clone(p2);
//随机产生交叉互换位置
int size = c1.gene.length;
int a = ((int) (Math.random() * size)) % size;
int b = ((int) (Math.random() * size)) % size;
int min = a > b ? b : a;
int max = a > b ? a : b;
//对位置上的基因进行交叉互换
for (int i = min; i <= max; i++) {
boolean t = c1.gene[i];
c1.gene[i] = c2.gene[i];
c2.gene[i] = t;
}
List<Chromosome> list = new ArrayList<Chromosome>();
list.add(c1);
list.add(c2);
return list;
}
public abstract class GeneticAlgorithm {
private List<Chromosome> population = new ArrayList<Chromosome>();//种群
private int popSize = 100;//种群数量
private int geneSize;//基因最大长度
private int maxIterNum = 500;//最大迭代次数
private double mutationRate = 0.01;//基因变异的概率
private int maxMutationNum = 3;//最大变异步长
private int generation = 1;//当前遗传到第几代
private double bestScore;//最好得分
private double worstScore;//最坏得分
private double totalScore;//总得分
private double averageScore;//平均得分
private double x; //记录历史种群中最好的X值
private double y; //记录历史种群中最好的Y值
private int geneI;//x y所在代数
}
private void init() {
for (int i = 0; i < popSize; i++) {
population = new ArrayList<Chromosome>();
Chromosome chro = new Chromosome(geneSize);
population.add(chro);
}
caculteScore();
}
private void caculteScore() {
setChromosomeScore(population.get(0));
bestScore = population.get(0).getScore();
worstScore = population.get(0).getScore();
totalScore = 0;
for (Chromosome chro : population) {
setChromosomeScore(chro);
if (chro.getScore() > bestScore) { //设置最好基因值
bestScore = chro.getScore();
if (y < bestScore) {
x = changeX(chro);
y = bestScore;
geneI = generation;
}
}
if (chro.getScore() < worstScore) { //设置最坏基因值
worstScore = chro.getScore();
}
totalScore += chro.getScore();
}
averageScore = totalScore / popSize;
//因为精度问题导致的平均值大于最好值,将平均值设置成最好值
averageScore = averageScore > bestScore ? bestScore : averageScore;
}
private void setChromosomeScore(Chromosome chro) {
if (chro == null) {
return;
}
double x = changeX(chro);
double y = caculateY(x);
chro.setScore(y);
}
/**
* @param chro
* @return
* @Description: 将二进制转化为对应的X
*/
public abstract double changeX(Chromosome chro);
/**
* @param x
* @return
* @Description: 根据X计算Y值 Y=F(X)
*/
public abstract double caculateY(double x);
private Chromosome getParentChromosome (){
double slice = Math.random() * totalScore;
double sum = 0;
for (Chromosome chro : population) {
sum += chro.getScore();
//转到对应的位置并且适应度不小于平均适应度
if (sum > slice && chro.getScore() >= averageScore) {
return chro;
}
}
return null;
}
private void evolve() {
List<Chromosome> childPopulation = new ArrayList<Chromosome>();
//生成下一代种群
while (childPopulation.size() < popSize) {
Chromosome p1 = getParentChromosome();
Chromosome p2 = getParentChromosome();
List<Chromosome> children = Chromosome.genetic(p1, p2);
if (children != null) {
for (Chromosome chro : children) {
childPopulation.add(chro);
}
}
}
//新种群替换旧种群
List<Chromosome> t = population;
population = childPopulation;
t.clear();
t = null;
//基因突变
mutation();
//计算新种群的适应度
caculteScore();
}
private void mutation() {
for (Chromosome chro : population) {
if (Math.random() < mutationRate) { //发生基因突变
int mutationNum = (int) (Math.random() * maxMutationNum);
chro.mutation(mutationNum);
}
}
}
public void caculte() {
//初始化种群
generation = 1;
init();
while (generation < maxIterNum) {
//种群遗传
evolve();
print();
generation++;
}
}
public class GeneticAlgorithmTest extends GeneticAlgorithm{
public static final int NUM = 1 << 24;
public GeneticAlgorithmTest() {
super(24);
}
}
@Override
public double changeX(Chromosome chro) {
// TODO Auto-generated method stub
return ((1.0 * chro.getNum() / NUM) * 100) + 6;
}
@Override
public double caculateY(double x) {
// TODO Auto-generated method stub
return 100 - Math.log(x);
}
/**
*@Description: 基因遗传染色体
*/
package com.lulei.genetic.algorithm;
import java.util.ArrayList;
import java.util.List;
public class Chromosome {
private boolean[] gene;//基因序列
private double score;//对应的函数得分
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
/**
* @param size
* 随机生成基因序列
*/
public Chromosome(int size) {
if (size <= 0) {
return;
}
initGeneSize(size);
for (int i = 0; i < size; i++) {
gene[i] = Math.random() >= 0.5;
}
}
/**
* 生成一个新基因
*/
public Chromosome() {
}
/**
* @param c
* @return
* @Description: 克隆基因
*/
public static Chromosome clone(final Chromosome c) {
if (c == null || c.gene == null) {
return null;
}
Chromosome copy = new Chromosome();
copy.initGeneSize(c.gene.length);
for (int i = 0; i < c.gene.length; i++) {
copy.gene[i] = c.gene[i];
}
return copy;
}
/**
* @param size
* @Description: 初始化基因长度
*/
private void initGeneSize(int size) {
if (size <= 0) {
return;
}
gene = new boolean[size];
}
/**
* @param c1
* @param c2
* @Description: 遗传产生下一代
*/
public static List<Chromosome> genetic(Chromosome p1, Chromosome p2) {
if (p1 == null || p2 == null) { //染色体有一个为空,不产生下一代
return null;
}
if (p1.gene == null || p2.gene == null) { //染色体有一个没有基因序列,不产生下一代
return null;
}
if (p1.gene.length != p2.gene.length) { //染色体基因序列长度不同,不产生下一代
return null;
}
Chromosome c1 = clone(p1);
Chromosome c2 = clone(p2);
//随机产生交叉互换位置
int size = c1.gene.length;
int a = ((int) (Math.random() * size)) % size;
int b = ((int) (Math.random() * size)) % size;
int min = a > b ? b : a;
int max = a > b ? a : b;
//对位置上的基因进行交叉互换
for (int i = min; i <= max; i++) {
boolean t = c1.gene[i];
c1.gene[i] = c2.gene[i];
c2.gene[i] = t;
}
List<Chromosome> list = new ArrayList<Chromosome>();
list.add(c1);
list.add(c2);
return list;
}
/**
* @param num
* @Description: 基因num个位置发生变异
*/
public void mutation(int num) {
//允许变异
int size = gene.length;
for (int i = 0; i < num; i++) {
//寻找变异位置
int at = ((int) (Math.random() * size)) % size;
//变异后的值
boolean bool = !gene[at];
gene[at] = bool;
}
}
/**
* @return
* @Description: 将基因转化为对应的数字
*/
public int getNum() {
if (gene == null) {
return 0;
}
int num = 0;
for (boolean bool : gene) {
num <<= 1;
if (bool) {
num += 1;
}
}
return num;
}
}
/**
*@Description:
*/
package com.lulei.genetic.algorithm;
import java.util.ArrayList;
import java.util.List;
public abstract class GeneticAlgorithm {
private List<Chromosome> population = new ArrayList<Chromosome>();
private int popSize = 100;//种群数量
private int geneSize;//基因最大长度
private int maxIterNum = 500;//最大迭代次数
private double mutationRate = 0.01;//基因变异的概率
private int maxMutationNum = 3;//最大变异步长
private int generation = 1;//当前遗传到第几代
private double bestScore;//最好得分
private double worstScore;//最坏得分
private double totalScore;//总得分
private double averageScore;//平均得分
private double x; //记录历史种群中最好的X值
private double y; //记录历史种群中最好的Y值
private int geneI;//x y所在代数
public GeneticAlgorithm(int geneSize) {
this.geneSize = geneSize;
}
public void caculte() {
//初始化种群
generation = 1;
init();
while (generation < maxIterNum) {
//种群遗传
evolve();
print();
generation++;
}
}
/**
* @Description: 输出结果
*/
private void print() {
System.out.println("--------------------------------");
System.out.println("the generation is:" + generation);
System.out.println("the best y is:" + bestScore);
System.out.println("the worst fitness is:" + worstScore);
System.out.println("the average fitness is:" + averageScore);
System.out.println("the total fitness is:" + totalScore);
System.out.println("geneI:" + geneI + "tx:" + x + "ty:" + y);
}
/**
* @Description: 初始化种群
*/
private void init() {
for (int i = 0; i < popSize; i++) {
population = new ArrayList<Chromosome>();
Chromosome chro = new Chromosome(geneSize);
population.add(chro);
}
caculteScore();
}
/**
* @Author:lulei
* @Description:种群进行遗传
*/
private void evolve() {
List<Chromosome> childPopulation = new ArrayList<Chromosome>();
//生成下一代种群
while (childPopulation.size() < popSize) {
Chromosome p1 = getParentChromosome();
Chromosome p2 = getParentChromosome();
List<Chromosome> children = Chromosome.genetic(p1, p2);
if (children != null) {
for (Chromosome chro : children) {
childPopulation.add(chro);
}
}
}
//新种群替换旧种群
List<Chromosome> t = population;
population = childPopulation;
t.clear();
t = null;
//基因突变
mutation();
//计算新种群的适应度
caculteScore();
}
/**
* @return
* @Description: 轮盘赌法选择可以遗传下一代的染色体
*/
private Chromosome getParentChromosome (){
double slice = Math.random() * totalScore;
double sum = 0;
for (Chromosome chro : population) {
sum += chro.getScore();
if (sum > slice && chro.getScore() >= averageScore) {
return chro;
}
}
return null;
}
/**
* @Description: 计算种群适应度
*/
private void caculteScore() {
setChromosomeScore(population.get(0));
bestScore = population.get(0).getScore();
worstScore = population.get(0).getScore();
totalScore = 0;
for (Chromosome chro : population) {
setChromosomeScore(chro);
if (chro.getScore() > bestScore) { //设置最好基因值
bestScore = chro.getScore();
if (y < bestScore) {
x = changeX(chro);
y = bestScore;
geneI = generation;
}
}
if (chro.getScore() < worstScore) { //设置最坏基因值
worstScore = chro.getScore();
}
totalScore += chro.getScore();
}
averageScore = totalScore / popSize;
//因为精度问题导致的平均值大于最好值,将平均值设置成最好值
averageScore = averageScore > bestScore ? bestScore : averageScore;
}
/**
* 基因突变
*/
private void mutation() {
for (Chromosome chro : population) {
if (Math.random() < mutationRate) { //发生基因突变
int mutationNum = (int) (Math.random() * maxMutationNum);
chro.mutation(mutationNum);
}
}
}
/**
* @param chro
* @Description: 设置染色体得分
*/
private void setChromosomeScore(Chromosome chro) {
if (chro == null) {
return;
}
double x = changeX(chro);
double y = caculateY(x);
chro.setScore(y);
}
/**
* @param chro
* @return
* @Description: 将二进制转化为对应的X
*/
public abstract double changeX(Chromosome chro);
/**
* @param x
* @return
* @Description: 根据X计算Y值 Y=F(X)
*/
public abstract double caculateY(double x);
public void setPopulation(List<Chromosome> population) {
this.population = population;
}
public void setPopSize(int popSize) {
this.popSize = popSize;
}
public void setGeneSize(int geneSize) {
this.geneSize = geneSize;
}
public void setMaxIterNum(int maxIterNum) {
this.maxIterNum = maxIterNum;
}
public void setMutationRate(double mutationRate) {
this.mutationRate = mutationRate;
}
public void setMaxMutationNum(int maxMutationNum) {
this.maxMutationNum = maxMutationNum;
}
public double getBestScore() {
return bestScore;
}
public double getWorstScore() {
return worstScore;
}
public double getTotalScore() {
return totalScore;
}
public double getAverageScore() {
return averageScore;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
}
/**
*@Description:
*/
package com.lulei.genetic.algorithm;
public class GeneticAlgorithmTest extends GeneticAlgorithm{
public static final int NUM = 1 << 24;
public GeneticAlgorithmTest() {
super(24);
}
@Override
public double changeX(Chromosome chro) {
// TODO Auto-generated method stub
return ((1.0 * chro.getNum() / NUM) * 100) + 6;
}
@Override
public double caculateY(double x) {
// TODO Auto-generated method stub
return 100 - Math.log(x);
}
public static void main(String[] args) {
GeneticAlgorithmTest test = new GeneticAlgorithmTest();
test.caculte();
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有