有关遗传算法

爱笑的懒人女

爱笑的懒人女

2016-02-19 17:59

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐有关遗传算法,无聊中的都看过来。

  遗传算法(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与其适应度值成正比。最通常的实现方法是轮盘赌(roulette wheel)模型。
  
  (2) 交叉算子(Crossover): 交叉算子将被选中的两个个体的基因链按概率pc进行交叉,生成两个新的个体,交叉位置是随机的。其中Pc是一个系统参数。
  
  (3) 变异算子(Mutation): 变异算子将新个体的基因链的各位按概率pm进行变异,对二值基因链(0,1编码)来说即是取反。
  
  上述各种算子的实现是多种多样的,而且许多新的算子正在不断地提出,以改进GA的某些性能。系统参数(个体数n,基因链长度l,交叉概率Pc,变异概率Pm等)对算法的收敛速度及结果有很大的影响,应视具体问题选取不同的值。
  
  GA的程序设计应考虑到通用性,而且要有较强的适应新的算子的能力。OOP中的类的继续为我们提供了这一可能。定义两个基本结构:基因(ALLELE)和个体(INDIVIDUAL),以个体的集合作为群体类TPopulation的数据成员,而TSGA类则由群体派生出来,定义GA的基本操作。对任一个应用实例,可以在TSGA类上派生,并定义新的操作。
  
  TPopulation类包含两个重要过程:
  
  FillFitness: 评价函数,对每个个体进行解码(decode)并计算出其适应度值,具体操作在用户类中实现。
  Statistic: 对当前群体进行统计,如求总适应度sumfitness、平均适应度average、最好个体fmax、最坏个体fmin等。
  
  SGA的结构及类定义如下(用C++编写):
  
  typedef char ALLELE; // 基因类型
  typedef struct{
  ALLELE *chrom;
  float fitness; // fitness of Chromosome
  }INDIVIDUAL; // 个体定义
  
  class TPopulation{ // 群体类定义
  public:
  int size; // Size of population: n
  int lchrom; // Length of chromosome: l
  float sumfitness, average;
  INDIVIDUAL *fmin, *fmax;
  INDIVIDUAL *pop;
  
  TPopulation(int popsize, int strlength);
  ~TPopulation();
  inline INDIVIDUAL &Individual(int i){ return pop[i];};
  void FillFitness(); // 评价函数
  virtual void Statistics(); // 统计函数
  };
  
  class TSGA : public TPopulation{ // TSGA类派生于群体类
  public:
  float pcross; // Probability of Crossover
  float pmutation; // Probability of Mutation
  int gen; // Counter of generation
  
  TSGA(int size, int strlength, float pm=0.03, float pc=0.6):
  TPopulation(size, strlength)
  {gen=0; pcross=pc; pmutation=pm; } ;
  virtual INDIVIDUAL& Select();
  virtual void Crossover(INDIVIDUAL &parent1, INDIVIDUAL
  &parent2,INDIVIDUAL &child1, INDIVIDUAL &child2);
  virtual ALLELE Mutation(ALLELE alleleval);
  virtual void Generate(); // 产生新的一代
  };
  
  用户GA类定义如下:
  
  class TSGAfit : public TSGA{
  
  public:
  
  TSGAfit(int size,float pm=0.0333,float pc=0.6)
  
  :TSGA(size,24,pm,pc){};
  
  void print();
  
  };
  
  由于GA是一个概率过程,所以每次迭代的情况是不一样的;系统参数不同,迭代情况也不同。在实验中参数一般选取如下:个体数n=50-200,变异概率Pm=0.03, 交叉概率Pc=0.6。变异概率太大,会导致不稳定。
  
展开更多 50%)
分享

猜你喜欢

有关遗传算法

编程语言 网络编程
有关遗传算法

左撇子跟遗传有关吗

生活常识
左撇子跟遗传有关吗

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

肺癌可能与家族遗传有关

冬季 孕前
肺癌可能与家族遗传有关

唇腭裂与遗传有关吗?

优生优育 孕前
唇腭裂与遗传有关吗?

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

唇腭裂与遗传有关吗?

电脑网络
唇腭裂与遗传有关吗?

孩子寿命胖瘦与遗传有关

电脑网络
孩子寿命胖瘦与遗传有关

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

C语言入门之运算符和表达式(1)

C语言入门之运算符和表达式(1)

Excel中完美冻结第一行、第一列的技巧

Excel中完美冻结第一行、第一列的技巧
下拉加载更多内容 ↓