`
haitaoandroid
  • 浏览: 27498 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

遗传算法初步探析

 
阅读更多

貌似遗传算法看起来挺神秘的,但要真正初步的了解一下它的大概思想还是挺简单的。我只想用最通俗的话和最简单的编程来讲讲遗传算法。

先来求解一个最简单的问题,求解f(x)=x*2的最大值 , x属于[0,31];即求解x的平方在[0,31]的最大值.现在我们用遗传算法来求解这个题目。
  先解释一下生物界的一些基础知识:
1:染色体和基因,染色体可以理解为一段字符串编码,唯一的表示个体的特征的,如1001,就表示一个染色体,1,0,0,1这样的就是基因
2:选择,就是比较合适环境的个体生存下来,不合适环境的个体会被淘汰,
3:交叉,也就是繁殖,就是一个个体遗传父母的基因,有好基因,也有不好的基因,如下面
1001 1000

他们两个个体第4位交叉后变为下面的
1000 1001
4:变异,也就是这个个体的基因会产生突变,如1001变为1000就是突变
现在我们可以做上面的题目了,我们要求[0,31]中x的平方最大值,按照遗传算法的逻辑,适者生存,即要让计算机尽量选择“适者”,排除“不适者”,在这个题目“适者”就是x的平方比较大的x值。当然首先要把x变成染色体,也就是编码,编码可以有很多种方式,最简单的就是二进制编码。如31编码为1111;
确定编码规则后就可以按照下面的步骤来写代码了,总共有四步:
1:初始化

//遗传算法构造函数
public GA() {
   String s;
for(int i=0;i<4;i++){
	s = Integer.toBinaryString(r.nextInt(32));//产生随机[0,31]的随机数
					          //,并且转换为二进制表示
	while(s.length()<5){  //空位补0,补齐5位
		s = "0"+s;
		}
	chromosome[i] = s;//这是初始化种群大小,即一开始有多少个体,我这里选择4个String[] array = new String[4];
	}
	gcount = 0; //全局变量,表示当前第几代,先不用管
	// print("初始化:");
}


初始化完了,我们有4个初始个体了,为了分析,假如我们随机得到了下面四个染色体:
10010 11000 10101 00101
现在要根据这4个随机的个体找到31这个最大的x值,便有了以下的三大步骤,即遗传算法的主要步骤:
2:选择,从上面4个染色体中选择

//选择
	 void select(){
		int min = 0;
		int max = 0;
		for(int i=0;i<4;i++){ //从4个个体中把最大适应度个体代替最低适应度个体,fitArray数组表示4个染色体的适应度
			fitArray[i] = fit(chromosome[i]);//fit函数计算个体(也就是染色体)的适应度
			if(fitArray[i]<fitArray[min]){
				min = i;
			}
			if(fitArray[i]>fitArray[max]){
				max = i;
			}
		}
		if(fitArray[max]>bestFit){  //bestFit和bestChromosome是全局最优解,即我们最终的结果会在这里出现,
			bestFit = fitArray[max]; //bestFit代表至今最好的适应度
			bestChromosome = chromosome[max];//bestChromosome代表至今最好的染色体
		}
		chromosome[min] = chromosome[max];
		print("选择后:");
	}

//求染色体x的适应度函数
	double fit(String x){
		int i = Integer.parseInt(x, 2);
		return (double)i*i;
	}

我们根据染色体的适应度来选择留下来的染色体,在我们上面的4个染色体中:
10010 11000 10101 00101
根据适应度函数x的平方,(11000)的平方最大,即适应度最大,(00101)的平方最小,即适应度最小,所以00101会淘汰,被替换成11000,因此,经过选择步骤后,我们的染色体变成了
10010 11000 10101 11000

3:交叉

	//交叉
	void cross(){
		if(Math.random()<0.25){//交叉的概率,为了好讲解,这个可以先不管,后面还会说到,先假设一定会交叉
			return;
		}
		char[] cr[] = new char[4][5];
		//随机产生4个染色体中哪两个需要交叉
		int a = r.nextInt(4);
		int b = r.nextInt(4);
		for(int i=0;i<4;i++){
			cr[i] = chromosome[i].toCharArray();
		}
		//随机产生交叉的位置j和l,因为染色体为5位,所以值要小于5
		int j = r.nextInt(5); 
		int l = r.nextInt(5);
		if(l<j){  //在a和b染色体中l到j位中产生交叉操作
			for(int k=l;k<j;k++){
				char u = cr[a][k];
				cr[a][k] = cr[b][k];
				cr[b][k] = u;
			}
		}else{ //在a和b染色体中j到l位中产生交叉操作
			for(int k=j;k<l;k++){
				char u = cr[a][k];
				cr[a][k] = cr[b][k];
				cr[b][k] = u;
			}
		}
		//交叉后重新赋值给染色体
		for(int i=0;i<4;i++){
			chromosome[i] = new String(cr[i]);
		}
		print("交叉后:");
	}

假设还是上面的经过选择的染色体:
10010 11000 10101 11000
如果是第一个和第三个染色体的第2位到第4位进行交叉,即上面代码中(a=0,b=2,j=1,l=3),交叉后得到
10100 11000 10011 11000
这是我们经过交叉后得到的结果,当然交叉不是每一次迭代都需要,还需要一定的概率,后面会说到。


4:变异

//变异
	void variation(){
		if(Math.random()>0.1)return;//变异的概率是0.1
		int i = r.nextInt(4);//哪一个个体变异
		int j = r.nextInt(5);//个体的哪一位变异
		char[] c = chromosome[i].toCharArray();
		if(c[j]=='0'){
			c[j] = '1';
		}else{
			c[j] = '0';
		}
		chromosome[i] = new String(c);
		print("变异后:");
	}

以常识来讲,变异的操作概率更低,但假如我们这次发生了变异,还是用上面的数据:
10100 11000 10011 11000
如果是第四个染色体的第三位发生了变异,即会变为:
10100 11000 10011 11100
以上是所以一次迭代的操作,即一次生物繁殖的过程,当然,我们会经过很多次的迭代来最终得到31(即11111)这个最大值,如下

5:迭代求最终结果

public static void main(String[] args) {
		GA ga = new GA();
		for(int i=0;i<1000;i++){
			ga.select();
			ga.cross();
			ga.variation();
			ga.gcount++;
			System.out.println("第几代.."+ga.gcount);
		}
		
		System.out.println("最好的适应度:"+bestFit+" 最好的值;"+bestChromosome);
	}

以下给出迭代开始和迭代结束的一些结果,仅供参考:


初始化:
01100
11000
01010
00110
选择后:
01100
11000
01010
11000
交叉后:
01100
11000
01010
11000
第几代..1
选择后:
01100
11000
11000
11000
交叉后:
01000
11000
11000
11100
第几代..2
选择后:
11100
11000
11000
11100
交叉后:
11000
11000
11100
11100
变异后:
11000
11000
10100
11100
................................
选择后:
11111
11111
11111
11111
交叉后:
11111
11111
11111
11111
第几代..998
选择后:
11111
11111
11111
11111
第几代..999
选择后:
11111
11111
11111
11111
交叉后:
11111
11111
11111
11111
第几代..1000
最好的适应度:961.0 最好的值;11111


这样我们就得到我们想要的值11111(即31)
有些人可能会疑惑,经过这些操作,为什么能够得到这个31最大值呢?理一下思路,一开始,计算机是随机得到4个[0,31]的值,然后选择操作会把x的值越来越推进最优解,但是这个是临时的最优解,重新选择四个个体:
10010 11000 10001 01001
这里的最优解是11000,想象一下,如果一直只进行选择操作,而不进行交叉和变异操作,最后的结果会是:
11000 11000 11000 11000
因为111000是这里的最优,最后所有的不合适的解都会被11000给替换。交叉又起了什么作用呢?假如在上面的四个个体中在进行选择的同时也进行交叉操作,最后的结果会是:
11011 11011 11011 11011
还是得不到我们想要的值11111,为什么会这样呢?大家可以想象一下,因为在我们的染色体中,第三位都是0,第三位无论怎么进行选择和交叉操作,都不会变,这样我们还是得不到我们想要的值,接下来是变异发挥作用的时候。相信大家都已经很明白了,因为变异也是随机的,只要变异的次数够多,总会把其中一个染色体的第三位变成1,这样再进行选择,交叉操作的时候就能够得到11111了。至于最后有关选择,交叉,变异的范围以及它怎么影响到最后的结果我会在“模式和遗传算法的搜索机制”中讲到,其中牵涉到模式和遗传算法的搜索域问题。



分享到:
评论

相关推荐

    基于云计算的物流区块链共识算法探析.pdf

    基于云计算的物流区块链共识算法探析.pdf

    小学数学教学中的算理与算法融合探析.zip

    小学数学教学中的算理与算法融合探析是教育领域中一个重要的主题,它涉及到如何将数学的基本原理(算理)与解决数学问题的具体步骤(算法)有效地结合,以提升学生的学习效果。在这个过程中,教师需要深入理解算理的...

    林榆竣- 对消防工程管理建设的初步探析.zip

    在对消防工程管理建设进行初步探析的过程中,我们首先要理解消防工程的重要性和其在社会安全中的核心地位。消防工程是确保建筑物及公共设施安全、预防和控制火灾的关键领域,它涵盖了设计、施工、验收和维护等多个...

    基于神经网络的GPS高程拟合算法探析.pdf

    《基于神经网络的GPS高程拟合算法探析》这篇论文深入探讨了如何利用神经网络技术提高GPS高程测量的精度。GPS定位技术在测绘领域得到了广泛应用,因其高精度、快速测量和操作简便等特性而备受青睐。然而,尽管GPS可以...

    C语言求最大子数组的算法探析.pdf.crdownload

    C语言求最大子数组的算法探析.pdf

    编程机制探析初稿

    资源名称:编程机制探析 初稿 编程机制探析 目 录 1. 编程机制探析(Insight into Programming Mechanism) 1.1 《编程机制探析》初稿目录(已提供PDF下载) 4 1.2 《编程机制探析》第一章 写作初衷——若是当年早...

    探析神经网络技术在计算机通信中的应用.pdf

    本文主要探讨了神经网络技术在计算机通信领域的应用,特别是结合了遗传算法的车牌识别定位系统。神经网络作为一种强大的数据建模工具,在计算机通信中发挥着至关重要的作用,特别是在图像识别和处理方面。 车辆牌照...

    开关磁阻电机的优化设计探析

    遗传算法已经成功应用到优化问题的领域当中,如何提高算法的收敛速度及改善遗传算法的搜索能力,使遗传算法能够更好地解决优化问题,是目前主要探索的目标之一。文章简要介绍了遗传算法的主要思想,算法的基本步骤及特点...

    图像分割常用算法优缺点探析

    ### 图像分割常用算法优缺点探析 #### 引言 图像分割是数字图像处理领域中的关键步骤,它涉及将图像划分为多个具有相似特征的区域,这些特征可能包括边缘、纹理、颜色或亮度等。良好的图像分割可以为后续的图像...

    ga.zip_visual c

    《遗传算法在Visual C++中的应用探析》 遗传算法(Genetic Algorithm,简称GA)是一种模拟生物进化过程的优化算法,它通过模仿自然选择、基因重组和突变等生物进化机制来解决复杂的搜索和优化问题。在信息技术领域...

    基于计算机网络的并行小波算法探析.pdf

    【基于计算机网络的并行小波算法探析】 在当今的信息时代,小波变换作为一种强大的数学工具,已广泛应用于信号处理、图像分析、模式识别等多个领域。然而,针对计算机网络环境下的并行小波算法研究仍处于初级阶段,...

    C语言求最大子数组的算法探析.pdf

    在深入分析C语言求最大子数组的算法探析之前,我们首先应该了解算法的基本概念,它是指解决特定问题的一系列操作和步骤的准确而完整的描述,它必须足够清晰,以便于通过一系列指令执行以解决问题。算法在计算机科学...

    罐式车辆金属常压罐体检测神经网络算法探析.pdf

    《罐式车辆金属常压罐体检测神经网络算法探析》这篇文章主要探讨了在当前的罐体安全检测中,如何运用神经网络算法提高检测精度和效率。常压罐体是运输液体危险货物的罐式车辆的关键部分,其安全性直接影响到运输安全...

    数据挖掘技术的算法探析-数据挖掘-工业.pdf

    数据挖掘技术的算法探析 数据挖掘技术是指从各种类型的数据中获得有利用价值的信息的过程。该技术包括数据收集、数据存取、数据架构、数据处理、统计分析、数据挖掘、数据预测和结果呈现等多个方面。在大数据时代,...

    软件架构群开源项目初步需求探析1.0.doc

    ### 软件架构群开源项目初步需求探析 #### 一、项目概述 该项目旨在开发一款基于Android平台的人际关系管理软件,并配套相应的PC端同步软件。项目的初衷是为了促进群友之间的交流与学习,初步规划是推出一个样品...

    《算法与程序设计》教学探析

    《在高中"算法与程序设计"模块教学中, 算法的设计以及运用程序设计 解决 问题的方法与思路,与 学 生原有的知识结构和解题经验有较大差异,使得 学 生的学 习存在 较 大困难 。...与程序设计》教学探析

    利用找环去边法求最小生成树的算法探析.docx

    ### 利用找环去边法求最小生成树的算法探析 #### 一、引言 在构建通信网络、交通系统或供水管线等实际应用中,常常需要解决如何以最低的成本来连接多个节点(例如城市)的问题。这类问题可以抽象为在连通网中寻找...

    基于改进卷积神经网络的人脸检测算法探析.pdf

    "基于改进卷积神经网络的人脸检测算法探析" 本文提出了一种基于改进卷积神经网络的人脸检测算法,对传统卷积神经网络的结构进行了改进,同时利用图像的全局和局部特征来进行人脸检测。仿真实验表明,本文所提出的...

    大数据背景下的机器学习算法探析.pdf

    在大数据背景下,机器学习算法的重要性日益凸显,它们已经成为数据科学领域的核心组成部分。本文将深入探讨在海量数据环境中,机器学习算法如何运作、优化以及应用于实际问题。 首先,我们需要理解大数据的特点:高...

    探析医疗器械产品形态的优化设计.pdf

    本篇文章以胃肠机为例,探讨了如何运用计算机辅助设计技术和方法,尤其是交互式遗传算法,来实现医疗器械形态的优化。 1. **医疗器械产品形态设计概述** - **产品形态设计方法** 包括技术形态和艺术形态两方面。...

Global site tag (gtag.js) - Google Analytics