JAVA实现遗传算法

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/50277547

http://www.llwjy.com/blogdetail/8d8f9fa295e57c774c2b8223166aee1b.html

个人博客站已经上线了,网址 www.llwjy.com ~欢迎各位吐槽~

-------------------------------------------------------------------------------------------------

      关于遗传算法的详细原理以及具体的定义这里就不多介绍,想了解的可以自行百度,下面就简单介绍下自己对遗传算法的理解,本文对基因的编码采用二进制规则。

 

算法思想:

      遗传算法参照达尔文的进化论,认为物种都是向好的方向去发展(适者生存),因此可以认为到足够的代数之后,得到的最值可实际的最值很接近。

 

算法步骤:

1)随机产生一个种群;
2)计算种群的适应度、最好适应度、最差适应度、平均适应度等指标;
3)验证种群代数是否达到自己设置的阈值,如果达到结束计算,否则继续下一步计算;
4)采用转盘赌法选择可以产生下一代的父代,产生下一代种群(种群中个体数量不变);
5)种群发生基因突变;
6)重复2、3、4、5步。

 

算法实现-基因部分

1、种群个体(这里认为是染色体),在个体中,我们为这个个体添加两个属性,个体的基因和基因对应的适应度(函数值)。

 

public class Chromosome {
	private boolean[] gene;//基因序列
	private double score;//对应的函数得分
}

 

 

2、随机生成基因序列,基因的每一个位置是0还是1,这里采用完全随机的方式实现。

 

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];
}


3、把基因转化为对应的值,比如101对应的数字是5,这里采用位运算来实现。

 

 

 

public int getNum() {
	if (gene == null) {
		return 0;
	}
	int num = 0;
	for (boolean bool : gene) {
		num <<= 1;
		if (bool) {
			num += 1;
		}
	}
	return num;
}


4、基因发生变异,对于变异的位置这里完全采取随机的方式实现,变异原则是由1变为0,0变为1。

 

 

 

 

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;
	}
}


5、克隆基因,用于产生下一代,这一步就是将已存在的基因copy一份。

 

 

 

 

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;
}


6、父母双方产生下一代,这里两个个体产生两个个体子代,具体哪段基因差生交叉,完全随机。

 

 

 

 

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 
  • 52
    点赞
  • 204
    收藏
    觉得还不错? 一键收藏
  • 28
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值