遗传算法小结

转自
http://blog.sina.com.cn/s/blog_4b837cbf010008rm.html
http://blog.csdn.net/qq1175421841/article/details/51327110

这两天在本部做项目,到现在脑子还是一头雾水,不知如何进入。
    开会后,分配了“遗传算法”,好歹也是咱数据挖掘的兄弟,那本书来研究研究。
    学到了点小小小小的意思,放到这,千万别忘了。
   
    遗传算法(Genetic Algorithm,简称GA),起源于对生物系统所进行的计算机模拟研究,是一种借鉴生物界自然选择和自然遗传机制的随机搜索方法。由美国(怎么又是美国人,切,古拉基古拉)Michigan大学的Holland教授及其学生创造,并提出遗传算法的基本定理--模式定理(Schema Theorem)。
    从整个发展过程看,遗传算法兴起于70年代,发展于80年代,90年代进入高潮期,很鲁棒哦。
    遗传算法是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,借鉴了伟大的达尔文先生的进化论和孟德尔的遗传学说。采用“适者生存”的原则,在潜在的解决方案种群中逐次产生一个近似最优的方案。其实很像人类,从古至今,都是优胜劣汰,长得漂亮的,聪明的才能适应社会嘛。
    然后应用复制、交叉、变异、显性、倒位等遗传算子。交叉的作用是很大的,变异则可以阻止局部收敛。最后,种群中个体的平均性能达到提高,好的个体被保存并且相互产生下一代,而低适应度的个体则小时。
 
    最后,介绍一下遗传算法的优点吧:
    一、对可行解表示的广泛性。由于遗传算法的处理对象并不是参数本身,而是那些通过参数集进行编码得到的基因个体,因而该算法可以直接对结构对象(如集合、序列、矩阵、树、链和表等)进行操作。
    1、通过对连接矩阵的操作,可用来对神经网络或自动机的结构或参数加以优化。
    2、通过对集合的操作,可实现对规则集合和知识库的精练而达到高质量的机器学习目的。
     3、通过对树结构的操作,可得到用于分类的最佳决策树。(可以用于对含能化合物进行分类)
     4、通过对人物序列的操作,可用于任务规划;通过对操作序列的处理,可自动构造顺序控制系统。
    二、群体搜索特性。遗传算法同时处理群体中多个个体,即同时对搜索空间中的多个解进行评估。使其具有较好的全局搜索性能,并易于并行化。
    三、不需要辅助信息。仅用适应度函数来评估基因个体,并在此基础上进行遗传操作。
    四、内在启发式随机搜索特性。遗传算法不采用确定性规则,而是采用概率的变迁规则来指导搜索方向。
    五、在搜索过程中不易陷入局部最优。即使在所定义的适应度函数是不连续的、非规则的或有噪声的情况下。
    六、采用自然进化机制来表现复杂的现象。能够快速准确的解决求解非常困难的问题。
    七、具有固有的并行性和并行计算能力。
    八、具有可扩展性。易于同别的技术混合使用。
 
    写到这,自然会想到,既然遗传算法有这么多的优点,不可能连一点点缺点都没有吧??
    当然,缺点是必不可少的:〉
    1、编码不规范及编码存在表示的不准确性。
    2、单一的遗传算法编码不能全面的将优化问题的约束表示出来。
    3、效率通常比较低。
    4、容易出现过早收敛。
    5、对算法的精度、可信度、计算复杂性等方面,还没有有效的定量分析方法。

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

早上下雨了,淋了一身,且罢,浇浇脑子,全当施肥,不知清醒否。书还在昨天看到的地方,那就继续吧。

    对最优化问题,求最优解或近似最优解的传统方法主要有解析法、随机法和穷举法。解析法主要包括爬山法和间接法。随机法主要包括导向随机方法和盲目随机方法。而穷举法主要包括完全穷举法、回溯法、动态规划法和限界剪枝法。

    也可用遗传算法求解,遗传算法与传统方法有本质区别。传统算法起始于单个点,而遗传算法则起始于群体;传统算法是针对问题特有的特点进行改善,而遗传算法则是独立于问题。

  具体区别如下:

  1、遗传算法与启发式算法的比较:

  启发式算法是指通过寻求一种能产生可行解的启发式规则,找到问题的一个最优解或近似最优解。然而它必须对每一个所求的问题找出其特有的启发式规则,且一般无通用性,不适用于其他问题。但遗传算法采用的不适确定性规则,而是强调利用概率转换来引导搜索过程。

  2、遗传算法与爬山法的比较:

  爬山法是指接法、梯度法和Hessian法的通称。首先在最优解可能存在的地方选择一个初始点,然后通过分析目标函数的特性,由初始点移到一个新的点,然后再继续这个过程。爬山法的搜索过程是确定的,它通过产生一系列的点收敛到最优解。而遗传算法的搜索过程是随机的,它产生一系列随机种群序列。二者的主要差异为:爬山法的初始点只有一个,由决策者给出;遗传算法的初始点有多个,是随机产生的。爬山法由一个点产生一个新的点;遗传算法通过遗传操作,在当前的种群中经过交叉、变异和选择产生下一代种群。

   3、遗传算法与穷举法的比较:

   穷举法就是对解空间内的所有可能解进行搜索,方法简单易行,但求解效率太低。而遗传算法则具有较高的搜索能力和极强的鲁棒性。

   4、遗传算法与盲目随机法的比较:

扫描二维码关注公众号,回复: 1736123 查看本文章

   只有解在搜索空间形成紧致分布时,盲目随机法才比较有效。而遗传算法作为导向随机搜索方法,是对一个被编码的参数空间进行高效搜索。

   总结一下,主要有以下四点不同:

A、 遗传算法搜索种群中的点是并行的,而不是单点。

B、  遗传算法并不需要辅助信息或辅助知识,只需要引进各项搜索方向的目标函数和相   对应的适应度。

C、  遗传算法使用概率变换规则,而不是确定的变换规则。

D、遗传算法工作使用编码参数集,而不是自身的参数集。(除了在实值个体中使用)

  

  一些术语:

  在遗传算法中,染色体对应的是数据或数组,在标准的遗传算法中,通常是由一维的串结构数据表现的。串上各个位置对应基因座,各位置上所取的值对应等位基因。遗传算法处理的是染色体或者叫基因型个体。一定数量的个体组成了群体,也叫集团。各个体对环境的适应程度叫适应度。

  执行遗传算法时,包含两个必要的数据转换操作,一个是表现型到基因型的转换,它把搜索空间的参数或解转换成遗传空间中的染色体或个体,此过程称为编码操作;另一个是基因型到表现型的转换,它是前者的一个相反操作,称为译码操作。(对本项目而言,编码操作就是将各含能化合物设置成程序可以识别的二进制编码或其他代码,译码操作则是将生成的解转换成现实中的含能化合物结构或是分子式)

 

 研究方向:

 1、在遗传算法中,群体规模和遗传算子的控制参数的选取非常困难。存在过早收敛。

 2、遗传算法的并行性主要有三个方面:个体适应度评价的并行性、整个群体各个个体适应度评价的并行性和子代群体产生过程的并行性。

  3、分类系统属于基于遗传算法的机器学习中的一类,包括一个简单的基于串规则的并行生成子系统、规则评价子系统和遗传算法子系统。

  4、遗传神经网络包括连接级、网络结构和学习规则的进化。

  5、进化算法包括遗传算法、进化规划和进化策略,三种算法是独立发展起来的。

 

  遗传算法的运行过程:

  遗传算法模拟了自然选择和遗传中发生的复制、交叉和变异等现象,从任一初始种群(Population)出发,通过随机选择、交叉和变异操作,产生一群更适应环境的个体,使群体进化到搜索空间中越来越好的区域,这样一代一代地不断繁衍进化,最后收敛到一群最适应环境的个体(Individual),求得问题的最优解。

 

  简单遗传算法的伪代码描述:

  Procedure GA

  Begin

      T=0;

      Initialize  p(t) ; //p(t)表示 t代种群

      Evaluate  p(t);  //评估第t代种群

      While not finished do

      Begin

           T=t+1;

           Select p(t) from p(t-1); //从上代种群众选择较优秀的个体到下代子群

           Reproduce pairs in p(t);

           Evaluate p(t);

      End

End

 

  遗传算法的三个基本操作:

1、  选择(Selection):根据各个个体的适应度值,按照一定的规则或方法从上一代群体中选择出一些优良的个体遗传到下一代群体中。体现了达尔文的适者生存原则。

2、  交叉(Crossover):最主要的遗传操作。将群体中的各个个体随机搭配成对,对每一个个体,以某个概率(称为交叉概率,Crossover Rate)交换它们之间的部分染色体。体现了信息交换的思想。

3、  变异(Mutation):对群体中的每一个个体,以某一概率(称为变异概率,Mutation Rate)改变某一个或某一些基因座上的基因值为其他的等位基因。

     

    基本遗传算法(也称标准遗传算法或简单遗传算法,Simple Genetic Algorithm,简称SGA)是一种群体型操作,以群体中的所有个体为对象,只使用基本遗传算子:选择算子、交叉算子、变异算子。

  基本遗传算法的步骤:

1、  染色体编码:使用固定长度的二进制符号串来表示群体中的个体,其等位基因值由二值{0,1}组成。包括编码、解码公式。

2、  个体适应度的监测评估:所有个体的适应度必须为非负数。需要预先确定好由目标函数值到个体适应度之间的转换规律,特别是要预先确定好当目标函数为负数时的处理方法。例如:可选取一个适当大的正数C,使个体的适应度为目标函数值加上正数C

3、  遗传算子:

(1)       选择运算使用比例选择算子。比例选择因子是利用比例于各个个体适应度的概率决定其子孙的遗传可能性。

(2)       交叉运算使用单点交叉算子。任意挑选经过选择操作中两个个体作为交叉对象,随机产生一个交叉点位置,两个个体在交叉点位置互换部分基因码,形成两个子个体。

(3)       变异运算使用基本位变异算子或均匀变异算子。为了避免过早收敛,对于二进制的基因码组成的个体种群,实现基因码的小概率翻转,即0变为1,1变为0。

4、  基本遗传算法的运行参数:

(1)       群体大小:一般取为20—100

(2)       遗传算法的终止进化代数:一般取为100—500

(3)       交叉概率:一般取为0.4—0.99

(4)       变异概率:一般取为0.0001—0.1

  看到现在,觉得问题最难的地方就是适应度和目标函数的确定,如何对数据进行编码,也没于头绪,是不是没吃早餐的原因,又犯困了,歇会。

遗传算法目前存在的问题:

1、  适应度值标定方式多种多样,没有一个简洁、通用的方法,不利于对遗传算法的使用。

2、  遗传算法的早熟现象(即很快收敛到局部最优解而不是全局最优解)是迄今为止最难处理的关键问题。

3、  快要接近最优解时在最优解附近左右摆动,收敛较慢。

遗传算法通常需要解决以下问题:确定编码方案,使硬度函数标定,选择遗传操作方式,选择相关控制操作,停止准则确定等。(每个都得解决,不容易啊)

七种改进的遗传算法:

1、  分层遗传算法(Hierarchic Genetic Algorithm)

2、  CHC算法

3、  Messy算法

4、  自适应遗传算法(Adaption Genetic Algorithm)

5、  基于小生境技术的遗传算法(Niched Genetic Algorithm,简称NGA)

6、  并行遗传算法(Parallel Genetic Algorithm)

7、  混合遗传算法:遗传算法与最速下降法相结合;遗传算法与模拟退火法(Simulated Annealing)相结合


-------------------------------------------------------------------------------------------------
  改进的遗传算法(一) 
   经证明,简单遗传算法在任何情况下(交叉概率Pc,变异概率Pm,任意初始化,任意交叉算子,任意适应度函数)都是不收敛的,且不能搜索到全局最优解。( 充分证明一点:便宜没好货,好算法不简单阿)。通过改进遗传算法,即在选择作用前(或后)保留当前最优解,则能保证收敛到全局最优解。
    传说中危害极大的 早熟现象具体表现如下:
    1、群体中所有的个体都陷于同一极值而停止变化。
    2、接近最优解的个体总是被淘汰,进化过程不收敛。
     消除早熟现象的方法:
    1、动态确定变异概率,既可防止优良基因因变异而遭到破坏,又可在陷入最优解时为种群引入新的基因。
    2、改进选择方式,放弃赌轮选择,以避免早期的高适应度个体迅速占据种群和后期的种群中因个体的适应度相差不大而导致种群停止进化。(赌轮选择方式会使每一个个体都获得复制一份的机会,体现不出好的个体的竞争力,无法实现遗传算法优胜劣汰的原则)。于是,采取一种基于种群的按个体适应度大小排序的选择算法来代替赌轮选择方法。
    first() {将种群众的个体按适应度大小进行排序}
   while   种群还没有扫描完
   do      {排在前面的个体复制两份;中间的复制一份;后面的不复制;}
  
    下面将改进的遗传算法具体描述如下:
    1、在初始种群中,对所有的个体按其适应度大小进行排序,然后计算个体的支持度和置信度。
   2、按一定的比例复制(即将当前种群中适应度最高的两个个体结构完整地复制到待配种群中)。
   3、按个体所处的位置确定其变异概率并变异;按优良个体复制4份,劣质个体不复制的原则。
   4、从复制组中孙继选择两个个体,对这两个个体进行多次交叉,从所得的结果中选择一个最优个体存入新种群
   5、弱满足结束条件,则停止;不然,转到第一步,直至找到所有符合条件的规则。
   本算法的 优点:在各代的每一次演化过程中,子代总是保留了父代中最好的个体,以在“高适应度模式为祖先的家族方向”搜索出更好的样本,从而保证最终可以搜索到全局最优解。
              
                  改进的遗传算法(二) 
     步骤如下:
    1、划分寻优空间。根据字符串中表示各个变量的最高位是0或1可将字符串划分成两个对等的子空间,假设有m个变量,则存在m种划分方式,可以形成m对子空间。
    2、设计空间退化。在演化到某一代时,如果适应度最高的前np个个体都位于同一字符串子空间内,可以认为最优点以很大概率落入该子空间中,可将该子空间作为下一代的寻优空间。
        还需一定的变化,此处略,未看懂。
     3、寻优空间的移动。如果当前最优解得某个分量处在当前设计空间的边界,该变量对应的子串的各位相同,均为0或1,则认为最有解有可能在当前寻优空间以外。此时,在该分量方向移动寻优空间,以避免寻优空间缩减而导致失去最优解。
                   改进的遗传算法(三) 
     再啰嗦一下,遗传算法的5个基本要素,到现在我一个都不知道如何解决
     基本要素:参数编码、初始群体的设定、适应度函数的设计、操作设计和控制参数设定
     1、初始群体的产生。
       要实现全局最优,初始群体在解空间中应尽可能分散。
       首先根据所给出的问题构造均匀数组或正交数组,然后执行如下算法产生初始群体:
       (1)讲解空间划分成S个子空间。
       (2)量化每个子空间,运用均匀数组或正交数组选择M个染色体。
       (3)从M.S个染色体中,选择适应度函数最大的N个作为初始群体。
       同时应保证任意两个个体之间的距离应大于特定的值。
    2、选择算子的改进。
       为解决“早熟收敛”和“搜索迟钝”问题,采用有条件的最佳保留策略,即有条件地将最佳个体直接传递到下一代或至少等同于前一代。
       也可使用“遗传--灾变”算法,即在遗传算法的基础上,模拟自然界的灾变现象,提高遗传算法的性能。当判断连续数代最佳染色体没有任何变化时,或者各个染色体已过于近似时,即可实施灾变。灾变方法很多,可以突然增大变异概率或对不同个体实施不同规模的突变。
    3、遗传算法重要参数的选择。
       需选择的参数有:染色体长度l,群体规模n,交叉概率Pc,变异概率Pm等。
       染色体长度的选择对二进制编码来说取决于特定问题的精度,存在定长和变长方式。
       群体规模通常取20--200。一般来说,求解问题的非线性越大,n的选择就应该越大。
       将进化过程分为渐进和突变两个阶段:渐进阶段强交叉,弱变异,强化优势型选择算子;突变阶段弱交叉,强变异,弱化优势型选择算子。
    4、适应度函数的设计。
        适应度函数的选择标准是:规范性(单值、连续、严格单调)、合理性(计算量小)、通用性。 
    5、进化过程中动态调整子代个体。
       在进化过程中,可对群体中的个体进行调整,包括引入移民因子、过滤相似个体、动态补充子代新个体等。
       所谓的 移民机制,就是在每一代进化过程中以一定的淘汰率(一般取为15%--20%)将最差个体淘汰,然后用产生的新个体代替。
       过滤相似个体,可以加快收敛速度,减少基因的单一性。
    6、小范围竞争择优的交叉、变异操作。
       将某一对父母A、B进行n次(3-5)交叉、变异操作,生成2n个不同的个体,选出其中一个最高适应度的个体,送入子代对个体中。反复随机选择父母对,直到生成设定个数的子代个体为止。
  
                        改进的遗传算法(四) 
      从适应度值标定和群体多样化两方面提出改进方法。
     1、适应度值标定
       适应度值标定:对适应度值超大的特殊个体,为防止其统治整个群体使算法陷入局部最优解,需限制其繁殖。在计算临近结束,遗传算法逐渐收敛时,由于群体中个体适应度值比较接近,继续优化选择较为困难,造成在最优解附近左右摇摆,此时应将个体使用度值加以放大,以提高选择能力。 
    2、群体多样化
       遗传算法的早熟原因是交叉算子在搜索过程中存在着严重的成熟化效应。可见,避免早熟的关键是使群体呈多样化发展,也就是应使搜索点分布在各极值点坐在的区域。
     改进的遗传算法步骤如下:
    (1)个体按适应度值大小排序
    (2)求平均适应度值,以此作为阈值,选择适应值大于平均适应度值的个体
    (3)判断相似程度,以最高适应度值为模板,选择不同末拌的个体组成群体
    (4)重复(3),逐次以适应能够度值高的个体为模板,选择不同模板的个体组成群体。
    (5)判断是否达到群体规模。如果是,则进行下一步交叉、变异等遗传操作;否则,重复(4)。如果不能得到足够的群体规模,则去除的个体按适应度值大小顺序顺次补足群体所缺数量。
    (6)判断是否满足结束要求。如果是,则结束,否则转到(1)


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

遗传算法求解多目标优化问题  

解决含多目标和多约束的优化问题称为多目标优化问题(Multi-objective Opimization)。    

   本项目为多目标优化问题

   Pareto最优解:不存在比其更优的解。常用方法:

1、  权重系数变换法:给每个目标函数赋予权重,其线性加权和为总的目标函数。

2、  并列选择法:先将群体中的全部个体按子目标函数的数目均等地划分为一些子群体,对每个子群体分配一个子目标函数,各个子目标函数在相应的子群体中独立地进行选择运算,各自选择出一些适应度高的个体组成一个新的子群体,然后再将所有这些新生成的子群体合并成一个完整的群体,在这个群体中进行交叉和变异操作,从而生成下一代的完整群体,如此不断地进行“分割—并列选择—合并”操作,最终可求出多目标优化问题的Pareto最优解。

3、  排列选择法:基于Pareto最优个体(Pareto最优个体是指群体中的这样一个或一些个体,群体中的其他个体都不比它或它们更优越),对群体中的各个个体进行排序,依据这个排列次序来进行进化过程中的选择运算,从而使得排在前面的Pareto最优个体将有更多的机会遗传到下一代群体中。如此这样经过一定代数的循环之后,最终就可求出多目标最优化问题的Pareto最优解。

4、  共享函数法:利用小生境遗传算法,将相同个体或类似个体的数量加以限制,以便能够产生出种类较多的不同的最优解。对于一个个体X,在它的附近还存在有多少种、多大程度相似的个体,是可以度量的,这种度量值称为小生镜数。

5、  混合法:选择算子的主体使用并列选择法,然后通过引入保留最佳个体和共享函数的思想来弥补只使用并列选择法的不足之处。(1)并列选择过程;(2)保留Pareto最优个体过程,对于子群体中的Pareto最优个体,不让其参与个体的交叉运算和变异运算,而是将这个或这些Pareto最优个体直接保留到下一代子群体中;(3)共享函数处理过程。

遗传算法有效性的理论依据为模式定理和积木块假设。模式定理保证了较优的模式(遗传算法的较优解)的样本呈指数级增长。积木块假设提出,遗传算法具备寻找到全局最优解的能力,即具有低阶、短距、高平均适应度的模式(积木块)在遗传算子作用下,相互结合,能生成高阶、长距、高平均适应度的模式,最终生成全局最优解。

   基于三值字符集{0,1,*}所产生的能描述具有某些结构相似性的0、1字符串集的字符串称作模式。模式H中确定位置的个数称作该模式的阶数。一个模式的阶数越高,其样本数就越少,因而确定性越高。模式H中第一个确定位置和最后一个确定位置之间的距离称作该模式的定义距。

  

  

   模式定理:在遗传算子选择、交叉和变异的作用下,具有阶数低、长度短、平均适应度高于群体平均适应度的模式在子代中将以指数级增长。

 

   积木块假设(Building Block Hypothesis):阶数低、长度短、适应度高的模式(积木块)在遗传算子作用下,相互结合,能生成阶数高、长度长、适应度高的模式,可最终生成全局最优解。

 

   在遗传算法中,将所有妨碍适应度高的个体的生成从而影响算法正常工作的问题统称为欺骗问题(Deceptive Problem)。

 

   竞争模式:若模式H和H’中*的位置完全一致,但任一确定位的编码均不同,则称H和H’互为竞争模式。

 

   欺骗性:假设f(X)的最大值对应的X的集合为X*,H为一包含X*的m阶模式,H的竞争模式为H’,而且f(H)>f(H’),则f为m阶欺骗。

 

   最小欺骗性:在欺骗问题中,为了造成骗局所需设置的最小的问题规模(即阶数)成为最小欺骗性。

 

   早熟(Premature Convergence,简称PC):未成熟收敛,即群体中个体的多样性过早地丢失,从而使算法陷入局部最优点。主要表现在两个方面:

1、  群体中所有的个体都陷入同一极值而停止进化。

2、  接近最优解的个体总是被淘汰,进化过程不收敛。

 

未成熟收敛的主要原因:

1、  理论上考虑的选择、交叉、变异操作都是绝对精确的,它们之间相互协调,能搜索到整个解空间,但是在具体实现时很难达到这个要求。

2、  所求解的问题是遗传算法欺骗问题。当解决的问题对于标准遗传算法来说比较困难时,遗传算法就会偏离寻优方向,这种问题被称为遗传算法欺骗问题。

3、  遗传算法处理的群体是有限的,因而存在随机误差,它主要包括取样误差和选择误差。取样误差是指所选择的有限群体不能代表整个群体所产生的误差。选择误差是指不能按期望的概率进行个体选择。

 

遗传算法早熟的具体表现:

1、  在进化初始阶段,生成了具有很高适应度的个体X。

2、  在基于适应度比例的选择下,其他个体被淘汰,大部分个体与X一致。

3、  相同的两个个体交叉,从而未能生成新个体。

4、  通过变异所生成的个体适应度高但数量少,所以被淘汰的概率很大。

5、  群体中的大部分个体都处于与X一致的状态。

 

   防止未成熟收敛的方法:

1、  重新启动法:碰到未成熟问题而不能继续时,随即选择一组初始值重新进行遗传算法操作。

2、  配对策略(Mating Strategies):为了维持群体的多样性,有目的的选择配对个体,以防止根本不相似的个体进行配对。Eshelman提出了一种可以更直接的防止相似个体交配的方法—防止乱伦机制(Incest Prevention Mechanism):参与交配的个体是随机配对的,但只有当参与配对的个体间的海明距离超过一定阈值时,才允许他们进行交配。

3、  重组策略(Recombination Strategies):就是使用交叉算子。主要是从使用频率和交叉点两方面考虑,来维持群体的多样性。

4、  替代策略(Replacement Strategies):确定在选择、交叉产生的个体中,选择哪一个个体进入新一代群体。

 

性能评估:

目前,遗传算法的评估指标大多采用适应度值。

1、  在线性能(On-line Performance)评估准则:可用从第一代到当前的优化进程的平均值来表示。

2、  离线性能(Off-line Performance)评估准则:是在特定时刻或特定值的最佳性能的累积平均。即在进化过程中,每进化一代,就统计目前为止的各代中的最佳适应度或最佳平均适应度,并计算对进化代数的平均值。

离线性能用于测试算法的收敛性,在应用时,优化问题的求解可以得到模拟,在一定的优化进程停止准则下,当前最好的解可以被保存和利用;而在线性能优于测量算法的动态性,在应用时,优化问题的求解必须通过真实的实验在线实现,可以迅速得到较好的优化结果。

 

一个好的优化算法为:当xi能稳定地接近于全局极小点(或极大点)的邻域时,迅速收敛于x*,当满足给定的收敛准则时,迭代中止。

 

   小生境技术:排挤机制----在一个有限的生存空间中,各种不同的生物为了延续生存,必须相互竞争各种有限的生存资源。差别较大的个体由于生活习性不同而很少竞争,处于平衡状态的大小固定的种群,新生个体将代替与之相似的旧个体。排挤机制用海明距离来度量个体之间的相似性。

 

   共享函数:用来度量两个个体的相邻关系和程度。给定个体g,它的共享函数由它与种群中的其他个体的相似程度决定。将g与种群中其他个体逐个比较,若很相似,则对g的共享函数加一个较大值;否则,就加一个较小值。个体共享度为该个体与群体内其他个体共享函数之和。


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

遗传算法的基本原理和方法

一、编码

 

编码:把一个问题的可行解从其解空间转换到遗传算法的搜索空间的转换方法。

解码(译码):遗传算法解空间向问题空间的转换。

 

二进制编码的缺点是汉明悬崖(Hamming Cliff),就是在某些相邻整数的二进制代码之间有很大的汉明距离,使得遗传算法的交叉和突变都难以跨越。

格雷码(Gray Code):在相邻整数之间汉明距离都为1。

 

(较好)有意义的积木块编码规则:所定编码应当易于生成与所求问题相关的短距和低阶的积木块;最小字符集编码规则,所定编码应采用最小字符集以使问题得到自然的表示或描述。

 

二进制编码比十进制编码搜索能力强,但不能保持群体稳定性。

 

动态参数编码(Dynamic Paremeter Coding):为了得到很高的精度,让遗传算法从很粗糙的精度开始收敛,当遗传算法找到一个区域后,就将搜索现在在这个区域,重新编码,重新启动,重复这一过程,直到达到要求的精度为止。

 

编码方法

1、  二进制编码方法

缺点:存在着连续函数离散化时的映射误差。不能直接反映出所求问题的本身结构特征,不便于开发针对问题的专门知识的遗传运算算子,很难满足积木块编码原则

2、  格雷码编码:连续的两个整数所对应的编码之间仅仅只有一个码位是不同的,其余码位都相同。

3、  浮点数编码方法:个体的每个基因值用某一范围内的某个浮点数来表示,个体的编码长度等于其决策变量的位数。

4、  各参数级联编码:对含有多个变量的个体进行编码的方法。通常将各个参数分别以某种编码方法进行编码,然后再将他们的编码按照一定顺序连接在一起就组成了表示全部参数的个体编码。

5、  多参数交叉编码:将各个参数中起主要作用的码位集中在一起,这样它们就不易于被遗传算子破坏掉。

 

评估编码的三个规范:完备性、健全性、非冗余性。

 

二、选择

 

遗传算法中的选择操作就是用来确定如何从父代群体中按某种方法选取那些个体遗传到下一代群体中的一种遗传运算,用来确定重组或交叉个体,以及被选个体将产生多少个子代个体。

 

常用的选择算子:

1、  轮盘赌选择(Roulette Wheel Selection):是一种回放式随机采样方法。每个个体进入下一代的概率等于它的适应度值与整个种群中个体适应度值和的比例。选择误差较大。

2、  随机竞争选择(Stochastic Tournament):每次按轮盘赌选择一对个体,然后让这两个个体进行竞争,适应度高的被选中,如此反复,直到选满为止。

3、  最佳保留选择:首先按轮盘赌选择方法执行遗传算法的选择操作,然后将当前群体中适应度最高的个体结构完整地复制到下一代群体中。

4、  无回放随机选择(也叫期望值选择Excepted Value Selection):根据每个个体在下一代群体中的生存期望来进行随机选择运算。方法如下

(1)       计算群体中每个个体在下一代群体中的生存期望数目N。

(2)       若某一个体被选中参与交叉运算,则它在下一代中的生存期望数目减去0.5,若某一个体未被选中参与交叉运算,则它在下一代中的生存期望数目减去1.0。

(3)       随着选择过程的进行,若某一个体的生存期望数目小于0时,则该个体就不再有机会被选中。

5、  确定式选择:按照一种确定的方式来进行选择操作。具体操作过程如下:

(1)       计算群体中各个个体在下一代群体中的期望生存数目N。

(2)       用N的整数部分确定各个对应个体在下一代群体中的生存数目。

(3)       用N的小数部分对个体进行降序排列,顺序取前M个个体加入到下一代群体中。至此可完全确定出下一代群体中M个个体。

6、无回放余数随机选择:可确保适应度比平均适应度大的一些个体能够被遗传到下一代群       体中,因而选择误差比较小。

7、均匀排序:对群体中的所有个体按期适应度大小进行排序,基于这个排序来分配各个个体被选中的概率。

8、最佳保存策略:当前群体中适应度最高的个体不参与交叉运算和变异运算,而是用它来代替掉本代群体中经过交叉、变异等操作后所产生的适应度最低的个体。

9、随机联赛选择:每次选取几个个体中适应度最高的一个个体遗传到下一代群体中。

10、排挤选择:新生成的子代将代替或排挤相似的旧父代个体,提高群体的多样性。

 

三、交叉

 

遗传算法的交叉操作,是指对两个相互配对的染色体按某种方式相互交换其部分基因,从而形成两个新的个体。

 

适用于二进制编码个体或浮点数编码个体的交叉算子:

1、单点交叉(One-point Crossover):指在个体编码串中只随机设置一个交叉点,然后再该点相互交换两个配对个体的部分染色体。

2、两点交叉与多点交叉:

(1)   两点交叉(Two-point Crossover):在个体编码串中随机设置了两个交叉点,然后再进行部分基因交换。

(2)   多点交叉(Multi-point Crossover)

3、均匀交叉(也称一致交叉,Uniform Crossover):两个配对个体的每个基因座上的基因都以相同的交叉概率进行交换,从而形成两个新个体。

4、算术交叉(Arithmetic Crossover):由两个个体的线性组合而产生出两个新的个体。该操作对象一般是由浮点数编码表示的个体。

 

四、变异

遗传算法中的变异运算,是指将个体染色体编码串中的某些基因座上的基因值用该基因座上的其它等位基因来替换,从而形成以给新的个体。

 

以下变异算子适用于二进制编码和浮点数编码的个体:

1、基本位变异(Simple Mutation):对个体编码串中以变异概率、随机指定的某一位或某几位仅因座上的值做变异运算。

2、均匀变异(Uniform Mutation):分别用符合某一范围内均匀分布的随机数,以某一较小的概率来替换个体编码串中各个基因座上的原有基因值。(特别适用于在算法的初级运行阶段)

3、边界变异(Boundary Mutation):随机的取基因座上的两个对应边界基因值之一去替代原有基因值。特别适用于最优点位于或接近于可行解的边界时的一类问题。

4、非均匀变异:对原有的基因值做一随机扰动,以扰动后的结果作为变异后的新基因值。对每个基因座都以相同的概率进行变异运算之后,相当于整个解向量在解空间中作了一次轻微的变动。

5、高斯近似变异:进行变异操作时用符号均值为P的平均值,方差为P的正态分布的一个随机数来替换原有的基因值。

 

五、适应度函数

 

适应度函数也称评价函数,是根据目标函数确定的用于区分群体中个体好坏的标准。适应度函数总是非负的,而目标函数可能有正有负,故需要在目标函数与适应度函数之间进行变换。

 

评价个体适应度的一般过程为:

1、对个体编码串进行解码处理后,可得到个体的表现型。

2、由个体的表现型可计算出对应个体的目标函数值。

3、根据最优化问题的类型,由目标函数值按一定的转换规则求出个体的适应度。

 

适应度函数的设计主要应满足以下要求:

1、单值、连续、非负、最大化。

2、合理、一致性。较难。

3、计算量小。

4、通用性强。

 

由目标函数f(x)到适应度函数Fit(f(x))的转换方法有以下三种:

1、直接以待解的目标函数f(x)转换为适应度函数。

      Fit(f(x))=f(x)  目标函数为最大化问题

      Fit(f(x))=-f(x) 目标函数为最小化问题

问题:可能不满足常用的轮盘赌选择中概率非负的要求;某携带求解的函数在函数值分布上相差很大,由此得到的平均适应度可能不利于体现种群的平均性能。

2、做转换。(具体转换方法略)

3、同2,转换公式不同。

 

    适应度尺度变换(Fitness Scaling Transform):在遗传算法的不同阶段,对个体的适应度进行适当的扩大或缩小。常用的尺度变换方法如下:

1、线性尺度变换:F'=aF+b

2、       乘幂尺度变换:F'=F

3、       指数尺度变换:F'=exp(-beitaF)

 

六、约束条件处理

1、搜索空间限定法:对遗传算法的搜索空间的大小加以限制,使得搜索空间中表示一个个体的点与解空间中的表示一个可行解的点有一一对应关系。

2、可行解变换法:在由个体基因型向个体表现型的变换中,增加使其满足约束条件的处理过程,即寻找个体基因型与个体表现型的多对一变换关系,扩大了搜索空间,使进化过程中所产生的个体总能通过这个变换而转化成杰空间中满足约束条件的一个可行解。

3、罚函数法:对在解空间中无对应可行解的个体计算其适应度时,处以一个惩罚函数,从而降低该个体的适应度,使该个体被遗传到下一代群体中的概率减小。

------------------------------------------------------------------------
这两天写代码总算有点成绩,跑出来的结果虽然并不太理想,至少给了我点信心---看来俺还是挖进去了。
    早上用一组数据进行了测试,迭代了100次,每次都初始化群体,并在初始化时设定模型最大变量个数为10,每次迭代设置代数为100代,在20组数据中选择16组作为拟合数据,其余4组作为测试数据,算法结束时,求每个个体的平均误差率和每次迭代落入一定误差范围内的个数。结果不是很好,平均误差率分别为:7.7%、8.5%、8.2%、9.4%.
    误差还是太大,并且每次运行的结果都不相同,选择的变量个数为16,但是基本上每组选择的变量都不相同。这可能就是误差很大,且结果不稳定的主要原因,方法可能还存在很大漏洞,只是目前只知道细节上的不足,大方向上还没有想法。
    并且,在初始群体设定时,我发现变量个数如果不加限制,效果很差;设置为10,改进非常大,但是<10目前并没有发现性能更好,此处还需再进行测试。
    误差如果能改进到2%左右,就比较完美了。可是那一天还太遥远。
    今天晚上准备跑1000次,看看平均效果能达到哪种程度。
    明天晚上如果可以的话,准备将模型最大变量个数设置到从1到10各跑100次,以求证究竟哪个变量个数可以提高算法性能。
    朋友找我,问题只能留下了......

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

这两天看书,觉得有启迪的地方:

                     种群的表示和初始化

一般情况下,在遗传算法中大多采用单层的二进制串染色体表示方法。

采用格雷码,可用来克服传统的二进制表示方法的不足。

不足:1、表示途中临近值之间过大的海明(Hamming)距离使用标准的二进制表示情况下,搜索过程易导致欺骗性结果或不能有效定位于全局最小值。

     2、对一些问题域,有一个争论时二进制表示事实上是靠不住的,它掩盖了搜索的自然性。

      3、Wright声称使用实值基因的遗传算法在数值函数优化上与二进制编码相比有许多的优点。表现为:在函数计算前,不需要从染色体到表现值的转换,提高了遗传算法的效率;计算机内部高效的浮点表示可直接使用,减少了内存需要;相对于离散的二进制或其他值,没有精度损失;对应用不同的遗传算子非常自由。(Michalewicz在其著作《进化策略(Evolution Strategies)》)中描述了使用实值编码的细节)

 如果通过重组产生的新种群的个体数目少于原始种群的大小,新种群和旧种群大小的差异被称为代购。在这种情况下,每一代产生的新个体数较少,这时的遗传算法称为“稳态”或“增量”的。如果一个或多个最适合个体被连续代繁殖,则遗传算法被称为得到“精英策略”。

稳态遗传算法(Steady-State  GA)最重要的一个特征是在每一代中不创建比现存种群多的后代,计算次数被减少,并且铲射功能后代时由于有少的新个体存储,内存要求也小。

策略:将最差适应度个体进行替代,将最老个体进行替代,要求最佳个体必须确保繁殖到下一代种群中。

遗传算法工具箱里有一个体函数reins使个体可在重组后重插入种群中。

以前总是认为,遗传算法的个体应该只剩下最后一个,所以编程出现了很大的误差,最后发现种群的数目不应该减少,从上文中又对此处有了新的认识,可以在小范围内减少个体数目,目前我的算法就是这样实现的。

下礼拜来可以看看书中的例子,刚翻了一下,有很多值得借鉴的地方。在很多细微之处对基本遗传算法进行了改进。

-----------------------------------------------------------------------------
本以为自己的算法已经初步达到了要求,没想到再对先前算法进行整合时,发现了一个很大的漏洞,这也是导致在预测y2时效果比其他算法好得多的原因。改正后,发现预测性能一下子就降低了将近20个百分点,真如五雷轰顶呀,不过既然发现了错误,才能找到改正的方向,看来做任何事情绝不能停滞于一点点的成绩,正是因为y2较高的误差,算法才需要切实地进一步改进。
 
    昨天下午,在开会的时候,认真地想了想算法目前还存在的问题及自认为尚需改进的地方,现总结如下:
 
    1、对上述程序中出现的漏洞,已解决,但是结果是误差变大。
 
    2、算法一直以来就存在一个警告,归其原因,是因为拟合矩阵为病态矩阵的原因。如果变量是与另一个变量完全冗余,这个矩阵称为病态矩阵,即矩阵不能求逆。例如,有一个变量是其他三个变量之和,这个变量也存在于模型中,这个矩阵就是病态矩阵。矩阵A和b存在的微小扰动δA和δb,会引起方程组Ax=b解的很大变化,则称Ax=b为病态方程组,称矩阵A为病态矩阵 解决方法:GS迭代和SOR迭代,matlab中无自带函数,必须自己写
  对付病态的线性方程组,可有如下途径:
(1)增加计算机字长(即机器精度)。例如,若在PC机上用单精度和GAUSS主元消去法或LU分解,可求出直至以5阶矩阵为系数矩阵的方程组Ax=y的稳定近似解,而当高于5阶时,上述算法即失效;若采用双精度计算,利用上述算法对20到30阶的方程组求解,仍能得到3位以上的有效数字。
(2)条件预优法,即:选择一个非奇异矩阵P,使得cond(PA)<<cond(A),这时可求解方程组 PAx=Py,由于该方程组与Ax=y的解等价,从而避开了病态所带来的困难.当然,选择P是一个困难问题,不过现在已经研究了一些相当成功的方法来构造P.
(3)正则化方法.(由于篇幅较长,请参阅相关文献,如<<不适定问题的正则化方法>>
  正则化技术,regularization)。比如在对角元素上加一个很小的量就是一种很常见的做法
(尚需进一步研究,现在还有疑问,是否真的是病态矩阵,或许是奇异矩阵八议遗传算法
 
    3、对于遗传算法,由于x的系数为系数矩阵, Matlab如何求解维数巨大的稀疏矩阵方程?
  Matlab提供了非常丰富的迭代型矩阵求解器,方法包括CG,BiCG,BiCGSTAB,     CGS,GMRES,LSQR,MINRES,P-CG,QMR,SYMMLQ等,为了加快矩阵求解速度,还        提供了两个Preconditioner函数:luinc(不完全LU分解),和cholinc(不完全     Cholesky分解)。下面是一个使用GMRES求解方程Amat*x=rhs的一个简单例子:
       
        [L2,U2] = luinc(Amat,1e-3);
        tic
           x=gmres(Amat,rhs,[],1e-6,100,L2,U2);
        toc
 
4、关于个人的论文问题,得抓紧,今天看到了一份征文报告,很好的杂志,应该没戏,不过决定试一下。

-----------------------------------------------------------
 这两天终于将程序整合到了一块,目前为止除过上篇文章中提出的warning问题,还没有发现其他大的问题,下面就该将算法性能作为首要解决的问题。
   以前的寻找最优解函数,只是随机挑选测试数据,然后迭代100次之后寻找最优解,重复n次后,得到整个系统的最优解。
   觉得这样不仅浪费时间,而且有很多是无用功,本项目的目标是准确率达到98%以上,故只要得到误差率小于2%的最优个体,即可结束。
   于是,准备在以下几个方面对前面的函数进行改进:
    1、设置迭代次数为n,每次迭代循环m次,若在循环过程中,得到最小误差小于2%,则认为已找到最优解,可直接结束程序。
    2、若在每次迭代中,连续p代的最小误差都相同,则认为算法陷入了局部最优解的误区,此时应该直接将适应度较小的q个个体从群体中滤去,任意生成或利用较优的个体生成q个个体,重新放入种群中。
    3、应该改变单一的变异率和交叉率,设置动态的交叉变异率。具体情况查阅资料。
    4、在旧算法执行结束后,y1的效果已达到目标,但是y2效果较差,故改进的算法验证主要依据y2来进行。
    目前能想到的问题就这么多,先把上述几个问题解决了看看效果再说。

猜你喜欢

转载自blog.csdn.net/tsroad/article/details/52448313