最新电子信息工程学科前沿报告

最新电子信息工程学科前沿报告
最新电子信息工程学科前沿报告

电子信息工程学科前沿报告——对遗传算法的初步认识

班级:

学号:

姓名:

目录

一、遗传算法概述

1、智能优化算法

2、基本遗传算法

3、遗传算法的特点

二、遗传算法的基本流程

三、遗传算法的应用及实现

1、旅行商问题TSP (Traveling Salesman Problem)

2、遗传算法的C语言实现

四、认识体会总结

一、遗传算法概述

1、智能优化算法

智能优化算法又称为现代启发式算法,是一种具有全局优化性能、通用性强、且适合于并行处理的算法。这种算法一般具有严密的理论依据,而不是单纯凭借专家经验,理论上可以在一定的时间内找到最优解或近似最优解。常用的智能优化算法:

(1)遗传算法(Genetic Algorithm,简称GA)

(2)模拟退火算法(Simulated Annealing,简称SA)

(3)禁忌搜索算法(Tabu Search,简称TS)……

智能优化算法的特点:都是从任一解出发,按照某种机制,以一定的概率在整个求解空间中探索最优解。由于它们可以把搜索空间扩展到整个问题空间,因而具有全局优化性能。

遗传算法起源:遗传算法是由美国的J. Holland教授于1975年在他的专著《自然界和人工系统的适应性》中首先提出的,它是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。

遗传算法的搜索机制:遗传算法模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。

2、基本遗传算法

基本遗传算法(Simple Genetic Algorithms,简称SGA,又称简单遗传算法或标准遗传算法),是由Goldberg总结出的一种最基本的遗传算法,其遗传进化操作过程简单,容易理解,是其它一些遗传算法的雏形和基础。

基本遗传算法的组成:

(1)编码(产生初始种群)

(2)适应度函数

(3)遗传算子(选择、交叉、变异)

(4)运行参数

编码:GA是通过某种编码机制把对象抽象为由特定符号按一定顺序排成的串。正如研究生物遗传是从染色体着手,而染色体则是由基因排成的串。SGA 使用二进制串进行编码。

初始种群:SGA采用随机方法生成若干个个体的集合,该集合称为初始种群。初始种群中个体的数量称为种群规模。

适应度函数:遗传算法对一个个体(解)的好坏用适应度函数值来评价,适应度函数值越大,解的质量越好。适应度函数是遗传算法进化过程的驱动力,也是进行自然选择的唯一标准,它的设计应结合求解问题本身的要求而定。

选择算子:遗传算法使用选择运算来实现对群体中的个体进行优胜劣汰操作:适应度高的个体被遗传到下一代群体中的概率大;适应度低的个体,被遗传到下一代群体中的概率小。选择操作的任务就是按某种方法从父代群体中选取一些个体,遗传到下一代群体。SGA中选择算子采用轮盘赌选择方法。

轮盘赌选择方法:轮盘赌选择又称比例选择算子,它的基本思想是:各个个体被选中的概率与其适应度函数值大小成正比。设群体大小为n ,个体i 的

适应度为 Fi ,则个体i 被选中遗传到下一代群体的概率为:

轮盘赌选择方法的实现步骤:

(1) 计算群体中所有个体的适应度函数值(需要解码);

(2) 利用比例选择算子的公式,计算每个个体被选中遗传到下一代群体

的概率;

(3) 采用模拟赌盘操作(即生成0到1之间的随机数与每个个体遗传到

下一代群体的概率进行匹配)来确定各个个体是否遗传到下一代群

体中。

交叉算子 :所谓交叉运算,是指对两个相互配对的染色体依据交叉概率 Pc 按某种方式相互交换其部分基因,从而形成两个新的个体。交叉运算是遗传算法区别于其他进化算法的重要特征,它在遗传算法中起关键作用,是产生新个体的主要方法。 SGA 中交叉算子采用单点交叉算子。

交叉算子图:

变异算子 :所谓变异运算,是指依据变异概率 Pm 将个体编码串中的某些基因值用其它基因值来替换,从而形成一个新的个体。遗传算法中的变异运算是产生新个体的辅助方法,它决定了遗传算法的局部搜索能力,同时保持种群的多样性。交叉运算和变异运算的相互配合,共同完成对搜索空间的全局搜索和局部搜索。 SGA 中变异算子采用基本位变异算子。

运行参数:

(1)M : 种群规模

(2)T : 遗传运算的终止进化代数

(3)Pc : 交叉概率

(4)Pm : 变异概率

3、遗传算法的特点

(1)群体搜索,易于并行化处理;

(2)不是盲目穷举,而是启发式搜索;

(3)适应度函数不受连续、可微等条件的约束,适用范围很广。

二、遗传算法的基本流程图

根据遗传算法概述以及理论的了解算法流程图如下:

∑==n i i i i F

F P 1

/

三、遗传算法的应用及实现

1、旅行商问题TSP (Traveling Salesman Problem)

TSP (Traveling Salesman Problem)旅行商问题是一类典型的NP完全问题,遗传算法是解决NP问题的一种较理想的方法。文章首先介绍了基本遗传算法的基本原理、特点及其基本实现技术;接着针对TSP 问题,论述了遗传算法在编码表示和遗传算子(包括选择算子、交叉算子变异算子这三种算子)等方面的应用情况,分别指出几种常用的编码方法的优点和缺点,并且结合TSP的运行实例详细分析了基本遗传算法的4个运行参数群体大小、遗传算法的终止进化代数、交叉概率、变异概率,对遗传算法的求解结果和求解效率的影响,经过多次的测试设定出了它们一组比较合理的取值。最后,简单说明了混合遗传算法在求解TSP 问题中的应用并对遗传算法解决TSP问题的前景提出了展望。

注:NP完全问题

NP完全问题,是世界七大数学难题之一。NP的英文全称是

Non-deterministic Polynomial的问题,即多项式复杂程度的非确定性问题。简单的写法是NP=P?,问题就在这个问号上,到底是NP等于P,还是NP不等于P。

这种问题的答案,是无法直接计算得到的,只能通过间接的“猜算”来得到结果。这就是非确定性问题。而这些问题的通常有个算法,它不能直接告诉你答案是什么,但可以告诉你,某个可能的结果是正确的答案还是错误的。这个可以告诉你“猜算”的答案正确与否的算法,假如可以在多项式时间内算出来,就叫做多项式非确定性问题。而如果这个问题的所有可能答案,都是可以在多项式时间完全多项式非确定性问题可以用穷举法得到答案,一个个检验下去,最终便能得到结果。但是这样算法的复杂程度,是指数关系,因此计算的时间随问题的复杂程度成指数的增长,很快便变得不可计算了。

人们发现,所有的完全多项式非确定性问题,都可以转换为一类叫做满足性问题的逻辑运算问题。既然这类问题的所有可能答案,都可以在多项式时间内计算,人们於是就猜想,是否这类问题,存在一个确定性算法,可以在指数时间内,直接算出或是搜寻出正确的答案呢?这就是著名的NP=P?的猜想。

解决这个猜想,无非两种可能,一种是找到一个这样的算法,只要针对某个特定NP完全问题找到一个算法,所有这类问题都可以迎刃而解了,因为他们可以转化为同一个问题。另外的一种可能,就是这样的算法是不存在的。那么就要从数学理论上证明它为什么不存在。

编码方法:

在遗传算法中如何描述问题的可行解,即把一个问题的可行解从其解空间转换到遗传算法所能处理的搜索空间的转换方法称为编码。

编码是应用遗传算法时要解决的主要问题,也是设计遗传算法的一个关键步骤。编码方法除了决定个体染色体排列形式之外,还决定了个体从搜索空间的基因型变换到解空间的表现型时的解码方法,编码方法也影响到交叉算子、变异算子等遗传算子的运算方法。

针对一个具体问题,如何设计一个完美的编码方案一直是遗传算法的应用难点之一,也是遗传算法的一个重要研究方向。目前还没有一套既严密有完整的指导理论及评价准则能够指导我们设计编码方案。De Jong曾提出了两条操作性较强的实用编码原则:

编码原则一(有意义积木块编码原则):应使用能易于产生与所求问题相关的且具有低阶,短定义长度的编码方案。

编码原则二(最小字符集编码原则):应使用能使问题得到自然表示或描述的具有最小字符集的编码方案。

迄今为止人们已经提出了许多的编码方法,总的来说,可以分为三类:二进制编码方法,浮点数编码方法,符号编码方法。

1.二进制编码:

二进制编码方法是遗传算法中最常用的一种编码方法,它使用的编码符号集是由二进制符号0和0组成的二值符号集{0,1},它所构成的个体基因型是一个二进制编码符号串。它有如下几个优点:

(1)编码,解码简单易行。

(2)交叉,变异等遗传操作便于实现。

(3)符合最小字符集编码原则。

(4)便于利用模式定理对算法进行理论分析。

二进制编码符号串的长度与问题所要求的精度有关。

由于二进制不便于反映所求问题的结构特征,对于一些连续函数的优化问题等,也由于遗传运算的随机特性而使得其局部搜索能力较差,因而人们提出了用格雷码来对个体进行编码。

2.格雷码编码:

格雷码,连续的两个整数所对应的编码值之间只有一个码位不相同。格雷码有这样一个特点:任意两个整数的差是这两个整数所对应的海明距离(Hamming distance)。这个特点是遗传算法中使用格雷码进行个体编码的主要原因。格雷码编码方法的主要优点是:

(1)便于提高遗传算法的局部搜索能力。

(2)交叉,变异等遗传操作易于实现。

(3)符合最小字符集编码原则。

(4)便于用模式定理对算法进行理论分析。

假设一个二进制编码为 B=bnbn-1…b2b1,其对应的格雷码为 G=gngn-1…

g2g1。格雷码到二进制码的转换公式:

格雷码编码方法是二进制编码方法的一种变形,其编码精度与相同长度二进制编码方法的精度相同。

由于二进制编码存在着连续函数离散化时的映射误差,而且不便于反映所求问题的特定知识,因而人们提出了用符点数来对个体进行编码。

3.符点数编码:

符点数编码方法:指个体的每个基因值用某一范围内的一个浮点数来表示个体的编码长度等于其决策变量的个数,个体变量的长度等于去决策变量的真实值,所以也叫真值编码方法.它有以下几个优点:

(1)适合于在遗传算法中表示范围较大的数。

(2)适合于精度较高的遗传算法。

(3)便于较大空间的遗传搜索。

(4)改善了遗传算法的复杂性,提高了运算效率。

(5)便于遗传算法与经典优化方法的混合使用。

(6)便于设计针对问题的专门知识的知识型遗传算子。

(7)便于处理复杂的决策变量约束条件。

符号编码方法是指个体染色体编码串中的基因值取自一个无数值含义,而只有代码含义的符号集.它的主要优点如下:

(1)符合有意义积木块编码原则。

(2)便于在遗传算法中利用所求解问题的专门知识。

(3)便于遗传算法与相近似算法之间的混合使用。

但对于使用符号编码方法的遗传算法,一般需要认真设计交叉、变异等遗传运算的操作方法,以满足问题的各种约束要求,这样才能提高算法的搜索性能。

2、遗传算法的C语言实现

变异算子的C语言实现,遗传算法强调的是交叉的功能。从遗传算法的观点来看,解的进化主要靠选择机制和交叉策略来完成,变异只是为选择、交叉过程中可能丢失的某些遗传基因进行修复和补充,变异在遗传算法的全局意义上只是一个背景操作。针对TSP问题,四种主要的的变异技术:

(1) 点位变异,变异仅以一定的概率(通常很小),对串的某些位做值的变异。

simple_mutation()

{ int i,j,p;

i=rand()%(POPSIZE);

j=rand()%(Pathlength);

p=rand()%(Pathlength-j)+1;

while(j==Pathlength-1)

j=rand()%(Pathlength-1);

code[i][j]=p;

for(i=0;i

code_path(i);

}

(2) 逆转变异,在编码串中,随机选择两点,再将这两点内的子串按反序插入到原来的位置中。

inversion_mutation()

{ int i;

int x,temp,p1,p2;

int insert[MaxPathlength];

x=rand()%(POPSIZE);

p1=rand()%Pathlength;

p2=rand()%(Pathlength-2)+2;

while(abs(p2-p1)<2)

{ srand( (unsigned)time( NULL ) );

p2=rand()%Pathlength;

}

if(p1>p2)

{ temp=p1;

p1=p2;

p2=temp;

}

for(i=p1+1;i<=p2;i++)

{ insert[i-p1-1]=population[x].Path[i];

}

for(i=p2;i>=p1+1;i--)

{ population[x].Path[i]=insert[p2-i];

}

}

(3) 对换变异,随机选择串中的两点,交换其码值。

change_mutation()

{ int i;

int x,temp,p1,p2;

int insert[MaxPathlength];

x=rand()%(POPSIZE);

p1=rand()%Pathlength;

p2=rand()%(Pathlength-1)+1;

while(abs(p2-p1)<1)

{

p2=rand()%Pathlength;

}

if(p1>p2)

{ temp=p1;

p1=p2;

p2=temp;

}

temp=population[x].Path[p1];

population[x].Path[p1]=population[x].Path[p2];

population[x].Path[p2]=temp;

}

(4) 插入变异,从串中随机选择1个码,将此码插入随机选择的插入点之后。

insert_mutation()

{ int i;

int x,temp,p1,p2;

int insert[MaxPathlength];

x=rand()%(POPSIZE);

p1=rand()%Pathlength;

p2=rand()%(Pathlength-2)+2;

while(abs(p2-p1)<2)

{

p2=rand()%Pathlength;

}

if(p1>p2)

{ temp=p1;

p1=p2;

p2=temp;

}

temp=population[x].Path[p2];

for(i=p2;i>p1;i--)

population[x].Path[i]=population[x].Path[i-1];

population[x].Path[p1+1]=temp;

}

四、认识体会和总结

以上是参考网络文献对遗传算法的一些总结和认识,有些知识点还不是很全面。遗传算法虽然是第一次接触,不过通过总结和搜索还是掌握了一些基本的认识,了解了遗传算法的来源,应用范围,基本的流程,算法的实现等。虽然现在还没达到加以应用的水平,但是有了对它的基本了解,对于学科前沿和算法优化方面都有了更多的认识。对于不熟悉的领域的进行认识和了解时能够更加熟练,对于信息搜集和整理能力都有了很好的提高。

相关主题
相关文档
最新文档