`
liulanghan110
  • 浏览: 1077921 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

关于遗传算法

阅读更多

遗传算法 ( GA , Genetic Algorithm ) ,也称进化算法 。 遗传算法是受达尔文的进化论的启发,借鉴生物进化过程而提出的一种启发式搜索算法。因此在介绍遗传算法前有必要简单的介绍生物进化知识。

一.进化论知识  

  作为遗传算法生物背景的介绍,下面内容了解即可:

  种群 (Population) 生物的进化以群体的形式进行,这样的一个群体称为种群。

  个体 :组成种群的单个生物。

  基因 ( Gene ) 一个遗传因子。 

  染色体 ( Chromosome ) :包含一组的基因。

  生存竞争,适者生存 :对环境适应度高的、牛B的个体参与繁殖的机会比较多,后代就会越来越多。适应度低的个体参与繁殖的机会比较少,后代就会越来越少。

  遗传与变异 :新个体会遗传父母双方各一部分的基因,同时有一定的概率发生基因变异。

 

  简单说来就是:繁殖过程,会发生基因交叉( Crossover ) ,基因突变 ( Mutation ) ,适应度( Fitness )低的个体会被逐步淘汰,而适应度高的个体会越来越多。那么经过N代的自然选择后,保存下来的个体都是适应度很高的,其中很可能包含史上产生的适应度最高 的那个个体。

 

 

二.遗传算法思想  

  借鉴生物进化论,遗传算法将要解决的问题模拟成一个生物进化的过程,通过复制、交叉、突变等操作产生下一代的解,并逐步淘汰掉适应。

 

        下面是一个根据遗传算法的思想写出来的简单例子。

 

        人类种群分为,男人和女人,男人是奇数,女人是偶数,每个人都有一个智商值(代码里为num)。男人会分裂成两个染色体X (奇数)和Y(偶数),女人也会分裂成两个染色体X(偶数)和X(偶数)。在染色体分裂的过程中会有一定几率(这里几率为0.25)基因突变(这里是值加2)。然后男人的一个染色体和女人的一个染色体结合产生后代。

       产生的后代也有智商值,那些智商值低的个体将不会生存下来(适者生存),这里有一个适应度函数来模拟适者生存。

       最后看产生的后代是否智商达到100,达到了100就结束繁殖。

      代码如下:


import java.util.ArrayList;
import java.util.List;

//遗传算法
public class GA {
	//男人是奇数,女人是偶数
	List<human>  manPop = new ArrayList<human>();
	List<human>  womanPop = new ArrayList<human>();
	double Pm = 0.25; //变异发生的概率
	int score = 100;
	public GA(human man ,human woman){
		manPop.add(man);
		womanPop.add(woman);
	}

	//种群(Population)
	public Boolean Population(){

		int num = manPop.size()<womanPop.size()?manPop.size():womanPop.size();

		for(int i = 0; i < num;i++){
			
			boby(manPop.get(i),womanPop.get(i));
		}
		//适者生存,淘汰最差的
		manPop = Fitness(manPop);
		womanPop = Fitness(womanPop);
		//得到需要的后代后停止
		if(check(manPop)||check(womanPop)){
			return true;
		}else{
			return false;
		}
	}
	
	private void boby(human m,human w){
		//染色体分裂
		split(m);
		split(w);

		//组合
		human newhuman = new human(m.getA() + w.getA());
		if( newhuman.getNum() % 2 != 0){//产生的是男人,放到男人种群
			manPop.add(newhuman);
		}else{                         //产生的是女人,放到女人种群
			womanPop.add(newhuman);
		}
		newhuman = new human(m.getA() + w.getB());
		if( newhuman.getNum() % 2 != 0){//产生的是男人,放到男人种群
			manPop.add(newhuman);
		}else{                         //产生的是女人,放到女人种群
			womanPop.add(newhuman);
		}
		newhuman = new human(m.getB() + w.getA());
		if( newhuman.getNum() % 2 != 0){//产生的是男人,放到男人种群
			manPop.add(newhuman);
		}else{                         //产生的是女人,放到女人种群
			womanPop.add(newhuman);
		}
		newhuman = new human(m.getB() + w.getB());
		if( newhuman.getNum() % 2 == 0){//产生的是男人,放到男人种群
			manPop.add(newhuman);
		}else{                         //产生的是女人,放到女人种群
			womanPop.add(newhuman);
		}

	}
	
	//染色体分裂,男人分裂为X Y,女人分裂为 X1 X2
	private human split(human h){
		//男人
		if(h.getNum() % 2 != 0){
			h.setA(h.getNum()/2);
			h.setB(h.getNum() - (h.getNum()/2));
		}else{//女人
			int temp = h.getNum()/2;
			if(temp % 2 != 0){
				temp = temp + 1;
			}
			h.setA(temp);
			h.setB(h.getNum() - temp);
		}
		//染色体变异(基因突变)
		h.setA(Mutation(h.getA()));
		h.setB(Mutation(h.getB()));
		h.setDeadStatus(1);
		return h;
	}
	
	//变异(Mutation):在繁殖过程,新产生的染色体中的基因会以一定的概率出错,称为变异。变异发生的概率记为Pm
	private int Mutation(int a){
		if(Math.random()<Pm){ //变异有一定概率发生
			return a = a + 2;
		}else{
			return a;
		}
	}
	
	//适应度函数 ( Fitness Function ) 适者生存,将不适应的个体淘汰掉
	private List<human> Fitness(List<human> pop){
		//新的种群
		List<human> newPop = new ArrayList<human>();
		pop = StayMax(pop);
		for(human h:pop){
			if(h.getDeadStatus() == 0){
				newPop.add(h);
			}
		}
		return newPop;
	}
	
	//淘汰算法(只要num最大的)
	private List<human> StayMax(List<human> pop){
		//只要最大num的
		int max = pop.get(0).getNum();
		int maxId = 0;
		for(int i = 0; i < pop.size();i++){
			human h = pop.get(i);
			if(h.getDeadStatus() == 0&&h.getNum() > max){
				max = h.getNum();
				maxId = i;
			}
			pop.get(i).setDeadStatus(1);
		}
		pop.get(maxId).setDeadStatus(0);  //最大的留下
		return pop;
	}
	
	//去掉最小的,其他留下。
	private List<human> RemoveMin(List<human> pop){
		//去掉
		int min = pop.get(0).getNum();
		int minId = 0;
		for(int i = 0; i < pop.size();i++){
			human h = pop.get(i);
			if(h.getDeadStatus() == 0&&h.getNum() < min){
				min = h.getNum();
				minId = i;
			}
		}
		pop.get(minId).setDeadStatus(1);  //最小的被淘汰
		return pop;
	}
	
	//
	public Boolean  check(List<human> pop){
		for(human h:pop){
			if(h.getNum() >= score){
				return true;
			}
			
		}
		return false;
	}
	
	public void Print(){
		for(human h:manPop){
			if(h.getDeadStatus() == 0){
				System.out.println(h.getNum());
			}
		}
		for(human h:womanPop){
			if(h.getDeadStatus() == 0){
				System.out.println(h.getNum());
			}
		}
	}
	
	public static void main(String[] args) {
		GA ga = new GA(new human(1),new human(2));
		for(int i = 1;i < 1000000;i++){
			if(ga.Population()){
				System.out.println("第"+i+"代满足条件");
				ga.Print();
				break;
			}
				
		}	
	}
}

//一个人有两条性染色体,X Y 或者 X X
class human{
	private int num;
	private int a;
	private int b;
	private int deadStatus = 0; //当为0时,表示个体死亡,被淘汰.
	public int getDeadStatus() {
		return deadStatus;
	}

	public void setDeadStatus(int deadStatus) {
		this.deadStatus = deadStatus;
	}

	public human(int num){
		this.num = num;
	}

	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public int getA() {
		return a;
	}
	public void setA(int a) {
		this.a = a;
	}
	public int getB() {
		return b;
	}
	public void setB(int b) {
		this.b = b;
	}

}
 

 

分享到:
评论
3 楼 LANGRENBULE 2013-01-30  
发现Lz没有调用RemoveMin函数!即没有进行淘汰,看来LZ是个怜悯类型造物主
2 楼 liulanghan110 2011-11-21  
1.第一个应该是注释写错了。
2.很多生物都是繁殖完就死亡的,比如蜉蝣,哈哈。
3.分裂的时候进行基因突变,然后染色体交叉成为后代。
分裂 的逻辑只是根据奇数(男人)分成一个奇数+一个偶数,偶数(女人)分成两个偶数的简单算法。具体的问题要有具体的分裂逻辑。智商相当于适应度函数,也是具体的情况会有不同的适应度函数。
1 楼 beitongmoming 2011-11-17  
不错!看了楼主的例子收获很多。但是在此我想提几个问题:

1.我读你的代码发现应该是deadStatus = 1表示死亡。但是你注释写的是0
2.88行没必要赋值1了。分裂完就死亡是不是悲剧了点 - -!
3.我觉得是不是可以把变异方法Mutation从分裂里面移到boby内的组合后面,也就是68行。因为基因突变应该是在交叉后面吧?而不是在分裂的时候突变。

最后一个问题就是:你的split方法内的染色体分裂逻辑73-85行是怎么来得?还是简单的根据智商算出的呢?

相关推荐

    遗传算法论文和源代码

    在本压缩包中,包含了一系列关于遗传算法的资料,如论文、文档和源代码,可以帮助我们深入了解遗传算法的基本原理及其在实际问题中的应用。 首先,"遗传算法--TSP问题.doc"文件可能包含了遗传算法在解决旅行商问题...

    关于遗传算法的收敛性

    ### 关于遗传算法的收敛性 #### 一、引言 遗传算法(Genetic Algorithm, GA)作为一种模拟自然界生物进化过程的随机优化方法,在解决复杂优化问题方面展现出了独特的优势。然而,对于遗传算法的收敛性问题一直是研究...

    IEEE最新的关于遗传算法的论文

    在"IEEE最新的关于遗传算法的论文"中,我们可以期待深入探讨遗传算法的理论基础、应用领域、改进策略以及与免疫算法的交叉融合。 首先,遗传算法的基本流程包括初始化种群、适应度评估、选择、交叉和变异操作。种群...

    关于遗传算法的构想想想

    关于遗传算法的构想关于遗传算法的构想关于遗传算法的构想关于遗传算法的构想关于遗传算法的构想

    MATLAB关于遗传算法的所有源程序祥解.rar

    本资料包含MATLAB关于遗传算法的所有源程序详解,旨在帮助用户深入理解和应用这一算法。 一、遗传算法基础 遗传算法是受到自然选择和遗传机制启发的一种搜索算法,主要由以下四个基本操作构成: 1. 初始化种群:...

    关于遗传算法应用的一些参考文献

    在这个"关于遗传算法应用的一些参考文献"的压缩包中,很可能包含了一些关于遗传算法在不同领域的实践案例和理论研究的文章。 遗传算法的核心思想源于达尔文的自然选择和遗传理论,通过模拟物种的优胜劣汰、基因重组...

    遗传算法的应用举例(关于遗传算法的具体介绍)

    ### 遗传算法的基本原理及其应用举例 #### 一、遗传算法概述 遗传算法(Genetic Algorithm, GA)是一种受自然选择和遗传机制启发的全局优化搜索算法。它模仿了自然界中的生物进化过程,利用选择、交叉和变异等遗传...

    关于遗传算法应用的一些参考文献.zip

    本资料包“关于遗传算法应用的一些参考文献.zip”包含了对遗传算法在不同领域的应用研究,对于深入理解和应用遗传算法具有重要价值。 1. 遗传算法的基本概念: - 个体表示:遗传算法中的每个解被称为个体,通常用...

    关于遗传算法的介绍2本书

    遗传算法是一种基于生物进化原理的优化方法,它模拟了自然选择、基因遗传、突变和重组等过程,用于解决复杂的优化问题。这两本书——《计算智能中的仿生学:理论与算法》和《非数值并行算法:遗传算法》应该会深入地...

    关于遗传算法的实验报告.doc

    ### 关于遗传算法的实验报告知识点解析 #### 实验目的 - **理解与掌握遗传算法的应用及意义**:实验旨在让参与者深入理解遗传算法的基本原理及其在解决复杂问题中的作用。参与者应学会如何利用遗传算法解决实际问题...

    关于遗传算法的完整课件

    遗传算法是一种基于生物进化原理的优化技术,源自自然选择和遗传学的概念。它在解决复杂问题,特别是非线性、多模态、高维度优化问题上展现出了强大的能力。本课件“遗传算法原理与应用”全面讲解了遗传算法的理论...

    MATLAB7.1的关于遗传算法的所有源程序详解

    本文将深入解析MATLAB7.1版本中关于遗传算法的所有源程序,帮助你理解和应用这一高效算法。 一、遗传算法基础 遗传算法(Genetic Algorithm,GA)是模拟自然选择和遗传过程的一种全局搜索技术。其基本步骤包括:...

    遗传算法 论文15篇

    本压缩包包含15篇关于遗传算法的学术论文,这些论文深入探讨了遗传算法的基本原理、应用领域、改进策略以及与其他算法的比较。 一、基本原理 遗传算法的核心概念包括种群、个体、基因、染色体、适应度函数和遗传...

    经典遗传算法书籍(二)

    《经典遗传算法书籍(二)》这一资源包含了三本关于遗传算法的重要著作:《遗传算法原理及应用》、《遗传算法——理论、应用与软件实现》以及《遗传算法的数学基础》。这些书籍深入探讨了遗传算法的核心概念、实际...

    关于遗传算法的详细介绍

    关于遗传算法的详细介绍

    关于遗传算法在云计算环境下应用的有关问题

    关于遗传算法在云计算环境下应用的有关问题,是一种协同进化理论的算法

    有关于遗传算法的教程

    遗传算法是一种借鉴生物进化原理的全局优化方法,主要用于解决复杂问题的求解。它通过模拟自然选择、遗传、交叉和变异等生物进化过程,逐步优化种群中的解决方案,以找到问题的近似最优解。 遗传算法的核心步骤如下...

    遗传算法-匹配句子

    本实例是关于遗传算法的一个基础应用,用于解决“匹配句子”的问题,旨在帮助初学者快速掌握遗传算法的基本原理和实现方式。 遗传算法的核心思想来源于生物界的自然选择、遗传与变异等现象。在解决匹配句子的问题中...

    关于遗传算法的中国股市波动性研究

    ### 关于遗传算法的中国股市波动性研究 #### 一、引言 随着中国经济的快速发展,股票市场成为了现代金融市场中最活跃的部分之一。然而,中国的股市发展相对较晚,且市场制度尚未完全成熟,导致股市波动性较大。...

    遗传算法阐述之遗传算法的三个算子

    在提供的文件“www.pudn.com.txt”中,可能包含了关于遗传算法实现的详细代码或示例,而“新建文件夹”可能包含的是相关程序或数据集。通过分析这些资源,我们可以深入理解遗传算法的实现细节,并结合实际问题进行...

Global site tag (gtag.js) - Google Analytics