遗传算法(C++)

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

遗传算法(Genetic Algorithm,缩写为GA)是一种有效的解决最优化问题的方法。它最先是由John Holland于1975年提出的。从那以后,它逐渐发展成为一种通过模拟自然进化过程解决最优化问题的计算模型。

利用遗传算法解最优化问题,首先应对可行域中的点进行编码(一般采用二进制编码),然后在可行域中随机挑选一些编码组成作为进化起点的第一代编码组,并计算每个解的目标函数值,也就是编码的适应度。接着就像自然界中一样,利用选择机制从编码组中随机挑选编码作为繁殖过程前的编码样本。选择机制应保证适应度较高的解能够保留较多的样本;而适应度较低的解则保留较少的样本,甚至被淘汰。在接下去的繁殖过程中,遗传算法提供了交叉和变异两种算子对挑选后的样本进行交换。交叉算子交换随机挑选的两个编码的某些位,变异算子则直接对一个编码中的随机挑选的某一位进行反转。这样通过选择和繁殖就产生了下一代编码组。重复上述选择和繁殖过程,直到结束条件得到满足为止。进化过程最后一代中的最优解就是用遗传算法解最优化问题所得到的最终结果。

从以上介绍可以看出,GA算法具有下述特点:

1)GA是对问题参数的编码组进行进货,而不是直接对参数本身。

21)GA的搜索是从问题解的编码组开始搜索,而不是从单个解开始。

31)GA使用目标函数值(适应度)这一信息进行搜索,而不需导数等其他信息。

4)GA算法使用的选择、交叉、变异这三个算子都是随机操作,而不是确定规则。

实践表明,遗传算法解最优化问题的计算效率比较高、适用范围相当广。为了解释这一现象,Holland给出了图式定理。所谓图式,就是某些码位取相同值的编码的集合。图式定理说明在进化过程的各代中,属于适应度高、阶数低且长度短的图式的编码数量将随代数以指数形式增长。另外,Holland还发现遗传算法具有隐含的并行计算特性。最近的研究则表明,上述遗传算法经适当改进后对任意优化问题以概率1收敛于全局最优解。

将遗传算法用于解决各种实际问题后,人们发现遣传算法也会由于各种原因过早向目标函数的局部最优解收敛,从而很难找到全局最优解。其中有些是由于目标函数的特性造成的,例如函数具有欺骗性,不满足构造模块假说等等;另外一些则是由于算法设计不当。为此,不断有人对遗传算法提出各种各样的改进方案。例如:针对原先的定长二进制编码方案;提出了动态编码、实数编码等改进方案;针对按比例的选择机制,提出了竞争选择、按续挑选等改进方案;针对原先的一点交叉算子,提出了两点交叉、多点交叉、均匀交叉等算子;针对原先遗传算法各控制参数在进化过程中不变的情况,提出了退化遗传算法、自适应遗传算法等。另外,针对不同问题还出现了分布式遗传算法、并行遗传算法等等。

近年来,随着对于遗传算法研究的不断深入完善,有越来越多的人认识了解了遗传算法,并把它应用到越来越广泛的领域,例如机器学习、模式识别、图像处理、神经网络、工业优化控制和社会科学等方面。特别是在解决旅行商问题、

煤气管道的最优控制、通信网络链接长度的优化问题、铁路运输计划优化、喷气式收音机涡轮机的设计、VLSI版面设计、键盘排列优化等问题上遗传算法都取得了很大的成功。

目前国际国内有关GA的研究热潮方兴未艾。除从1985年起每两年举办一届GA国际会议外,还有MIT从1993年开始出版的《Evolutionary Computatio》和《Adaptive Behavior》两种杂志、IEEE从今年起出版的专门关于进化计算的汇刊。另外,各种AI类的杂志不断出版有关进化计算的专辑。其它有关GA理论和工程应用的文章也在各种不同类型杂志上不断涌现。国内有关GA的研究也正在不断深入地展开。

遗传算法(Genetic Algorithm, GA)是近几年发展起来的一种崭新的全局优化算法,它借

用了生物遗传学的观点,通过自然选择、遗传、变异等作用机制,实现各个个体的适应性的提高。这一点体现了自然界中"物竞天择、适者生存"进化过程。1962年Holland教授首次

提出了GA算法的思想,从而吸引了大批的研究者,迅速推广到优化、搜索、机器学习等方面,并奠定了坚实的理论基础。用遗传算法解决问题时,首先要对待解决问题的模型结构和参数进行编码,一般用字符串表示,这个过程就将问题符号化、离散化了。也有在连续空间定义的GA(Genetic Algorithm in Continuous Space, GACS),暂不讨论。

一个串行运算的遗传算法(Seguential Genetic Algoritm, SGA)按如下过程进行:

(1) 对待解决问题进行编码;

(2) 随机初始化群体X(0):=(x1, x2, … xn);

(3) 对当前群体X(t)中每个个体xi计算其适应度F(xi),适应度表示了该个体的性能好

坏;

(4) 应用选择算子产生中间代Xr(t);

(5) 对Xr(t)应用其它的算子,产生新一代群体X(t+1),这些算子的目的在于扩展有限

个体的覆盖面,体现全局搜索的思想;

(6) t:=t+1;如果不满足终止条件继续(3)。

GA中最常用的算子有如下几种:

(1) 选择算子(selection/reproduction): 选择算子从群体中按某一概率成对选择个

体,某个体xi被选择的概率Pi与其适应度值成正比。最通常的实现方法是轮盘赌(roulett

e wheel)模型。

(2) 交叉算子(Crossover): 交叉算子将被选中的两个个体的基因链按概率pc进行交叉

,生成两个新的个体,交叉位置是随机的。其中Pc是一个系统参数。

(3) 变异算子(Mutation): 变异算子将新个体的基因链的各位按概率pm进行变异,对

二值基因链(0,1编码)来说即是取反。

上述各种算子的实现是多种多样的,而且许多新的算子正在不断地提出,以改进GA的

某些性能。系统参数(个体数n,基因链长度l,交叉概率Pc,变异概率Pm等)对算法的收敛速度

及结果有很大的影响,应视具体问题选取不同的值。

GA的程序设计应考虑到通用性,而且要有较强的适应新的算子的能力。OOP中的类的继承为我们提供了这一可能。

相关文档
最新文档