当前位置:文档之家› 遗传算法

遗传算法

遗传算法的基本理论一、起源:早在20世纪50年代和60年代,就有少数人几个计算机科学家独立地进行了所谓的“人工进化系统”研究,其出发点是进化的思想可以发展成为许多工程问题的优化工具。

早期的研究形成了遗传算法的雏形,如大多数系统都遵循“适者生存”的仿自然法则,有些系统采用了基于群体(population)的设计方案,并且加入了自然选择与变异操作,还有一些系统对生物染色体编码进行了抽象处理,应用二进制编码。

由于缺乏一种通用的编码方案,人们只能依赖变异而非交叉来产生新的基因结构,早期的算法收敛甚微。

20世纪60年代中期,美国Michigan大学的John Holland在A.S.Fraser和H.J.Bremermann等人工作的基础上提出了位串编码技术。

这种编码既适用于变异操作,又适用于交叉(即杂交)操作。

并且强调将交叉作为主要的遗传操作。

随后,Holland将该算法用于自然和人工系统的自适应行为的研究中,并于1975年出版了其开创性著作“Adaption in Natural and Artificial System”。

以后,Holland等人将该算法加以推广,应用到优化及机器学习等问题中,并正式定名为遗传算法。

遗传算法的通用编码技术和简单有效的遗传操作作为其广泛、成功地应用奠定了基础。

Holland早期有关遗传算法的许多概念一直沿用至今,可见Holland对遗传算法的贡献之大。

他认为遗传算法本质上是适应算法,应用最多的是系统最优化的研究。

二、发展:年份贡献者内容1962Holland程序漫游元胞计算机自适应系统框架1968Holland模式定理的建立1971Hollstein具有交配和选择规则的二维函数优化1972Bosworth、Foo、Zeigler提出具有复杂变异、类似于遗传算法的基因操作1972Frantz位置非线性和倒位操作研究1973Holland遗传算法中试验的最优配置和双臂强盗问题1973Martin类似遗传真法的概率算法理论1975De Jong用于5个测试函数的研究基本遗传算法基准参数1975Holland 出版了开创性著作《Adaptation in Natural andArtificial System》1981Bethke应用Walsh函数分析模式1981Brindle研究遗传算法中的选择和支配问题1983Pettit、Swigger遗传算法应用于非稳定问题的粗略研究1983Wetzel用遗传算法解决旅行商问题(TSP)1984Mauldin基本遗传算法小用启发知识维持遗传多样性1985Baker试验基于排序的选择方法1985Booker建议采用部分匹配计分、分享操作和交配限制法1985Goldberg、Lingle TSP问题个采用部分匹配交叉1985Grefenstette、Fitzpattrick对含噪声的函数进行测试1985Schaffer多种群遗传算法解决多目标优化问题1986Goldberg最优种群大小估计1986Grefenstette元级遗传算法控制的遗传算法1987Baker选择中随机误差的减少方法1987Goldberg复制和交叉时最小欺骗问题(MDP)1987Goldberg、Richardson借助分享函数的小生境和物种归纳法1987Goldberg、Segrest复制和交叉的有限马尔可夫链1987Goldberg、Smith双倍染色体遗传算法应用于非稳定函数优化1987Oliver、Smith、Holland排列重组算于的模拟和分析1987Schaffer、Morishima串编码自适应交叉试验1987Whitley子孙测试应用于遗传算法的选择操作之后,遗传算法发展的趋势是遗传算法的改进(如自适应遗传算法、分层遗传算法、并行遗传算法、基于小生境技术的遗传算法等)和基于遗传算法与其他算法相结合的混合智能优化算法(如量子遗传算法、协同遗传算法、免疫遗传算法等)。

三、基本原理:1、生物进化论与遗传学的相关原理达尔文进化论主要有四个学说:一般进化论、共同祖先学说、渐变论和自然选择学说。

其中自然选择学说的主要内容为:自然选择来自繁殖过剩和生存斗争。

由于弱肉强食的生存斗争不断地进行,其结果是适者生存,具有适应性变异的个体被保留下来,不只有适应性变异的个体被淘汰,通过一代代的生存环境的选择作用,物种变异被定向着一个方向积累,于是性状逐渐和原先的祖先种不同,演变为新的物种。

这种自然选择过程是一个长期的、缓慢的、连续的过程。

关于达尔文的进化论有很多的争议,可以参考文献[1]。

孟德尔遗传定律:分离规律和自由组合定律。

种群遗传学:这是一种以种群为单位而不是以个体为单位的遗传学,是研究种群中基因的组成及其变化的生物学。

在一定地域中,一个物种的全体成员构成一个种群(population),种群的主要特征是种群内的雌雄个体能够通过有性生殖实现基因的交流。

生物的进化实际上是种群的进化,个体总是要消亡,但种群则是继续保留,每一代个体基因型的改变会影响种群基因库(gene pool)的组成。

而种群基因库组成的变化就是这一种群的进化,没有所谓的生存斗争问题、单是个体繁殖机会的差异也能造成后代遗传组成的改变,自然选择也能够进行。

综合进化论对达尔文式的进化给予了新的更加精确的解释。

至于基本概念的定义详见参考文献[2]中的“遗传算法扼要”。

2、遗传算法的基本思想遗传算法模拟的是怎样的生物进化模型呢?假设对相当于自然界中的一群人的一个种群进行操作,第一步的选择是以现实世界中的优胜劣汰现象为背景的;第二步的重组交叉则相当于人类的结婚和生育;第三步的变异则与自然界中偶然发生的变异是一致的。

我们用专业术语来更好地描述遗传算法的基本思想。

遗传算法是从代表问题可能潜在解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码(coding)的一定数目的个体(individual)组成。

每个个体实际上是染色体(chromosome)带有特征的实体。

染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如黑头发的特征是由染色体中控制这一特征的某种基因组合决定的。

因此,在一开始需要实现从表现型到基因型的映射即编码工作。

由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码。

初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解。

在每一代,根据问题域中个体的适应度(fitness)大小挑选(selection)个体,并借助于自然遗传学的遗传算子(genetic operators)进行组合交叉(crossover)和变异(mutation).产生出代表新的解集的种群。

这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码maxgen=200; %进化代数,即迭代次数sizepop=20; %种群规模pcross=0.6; %交叉概率选择,0和1之间pmutation=0.01; %变异概率选择,0和1之间lenchrom=[1 1 1 1 1]; %每个变量的字串长度,如果是浮点变量,则长度都为1 bound=[0 0.9*pi;0 0.9*pi;0 0.9*pi;0 0.9*pi;0 0.9*pi];%%个体初始化individuals=struct('fitness',zeros(1,sizepop),'chrom',[]); %种群结构体%初始化种群for i=1:sizepop%随机产生一个群体individuals.chrom(i,:)=unifrnd(0,0.9*pi,[1 sum(lenchrom)]);%随机产生染色体x=individuals.chrom(i,:);individuals.fitness(i)=fun(x); %染色体的适应度end%找最好的染色体[bestfitness bestindex]=min(individuals.fitness);bestchrom=individuals.chrom(bestindex,:); %最好的染色体avgfitness=sum(individuals.fitness)/sizepop; %染色体的平均适应度%记录每一代进化中最好的适应度和平均适应度trace=[];%%进化开始for i=1:maxgen%选择individuals=select(individuals,sizepop);avgfitness=sum(individuals.fitness)/sizepop;%交叉individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);%变异individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,[i maxgen],bound);%每进化10代,以所得值为初始值进行非线性寻优%if mod(i,10)==0% individuals.chrom=nonlinear(individuals.chrom,sizepop);%end%计算适应度for j=1:sizepopx=individuals.chrom(j,:);individuals.fitness(j)=fun(x);end%找到最优染色体及它们在种群中的位置[newbestfitness,newbestindex]=min(individuals.fitness);%代替上一次进化中最好的染色体if bestfitness>newbestfitnessbestfitness=newbestfitness;bestchrom=individuals.chrom(newbestindex,:);endavgfitness=sum(individuals.fitness)/sizepop;trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度end %进化结束function y = fun(x)y=-5*sin(x(1))*sin(x(2))*sin(x(3))*sin(x(4))*sin(x(5))-sin(5*x(1))*sin(5*x(2))*s in(5*x(3))*sin(5*x(4))*sin(5*x(5))+8;function ret = select(individuals,sizepop)%本函数在每一代种群中得染色体进行选择,以进行后面的交叉和变异%individuals input ;种群信息%sizepop input ;种群规模%opts input ;选择方法的选择%ret output;经过选择后的种群individuals.fitness=1./(individuals.fitness);sumfitness=sum(individuals.fitness);sumf=individuals.fitness./sumfitness;index=[];for i=1:sizepop %转sizepop次轮盘pick=rand;while pick==0pick=rand;endfor j=1:sizepoppick=pick-sumf(j);if pick<0index=[index j];break;%寻找落入区间的染色体,此次选择为3endendendindividuals.chrom=individuals.chrom(index,:);individuals.fitness=individuals.fitness(index);ret=individuals;function ret = Cross(pcross,lenchrom,chrom,sizepop,bound)%本函数完成交叉操作%pcross input ;交叉概率%lenchrom input ;染色体的长度%chrom input ;染色体群%sizepop input ;种群规模%ret output;交叉后的染色体for i=1:sizepop %是否进行交叉操作则由交叉概率决定(continune控制)%随机选择两个染色体进行交叉pick = rand(1,2);while prod(pick)==0pick=rand(1,2);endindex=ceil(pick.*sizepop);%交叉概率决定是否进行交叉pick=rand;while pick==0pick=rand;endif pick>pcrosscontinue;endflag=0;while flag==0%随机选择交叉位置pick=rand;while pick==0pick=rand;endpos=ceil(pick.*sum(lenchrom)); %随机选择进行交叉的位置pick=rand; %交叉开始v1=chrom(index(1),pos);v2=chrom(index(2),pos);chrom(index(1),pos)=pick*v2+(1-pick)*v1;chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束flag=1;for j=1:2if chrom(index(j),pos)>bound(pos,2)flag=0;endif chrom(index(j),pos)<bound(pos,1)flag=0;endendendendret=chrom;function ret = Mutation(pmutation,lenchrom,chrom,sizepop,pop,bound) %本函数完成变异操作%pcross input :变异概率%lenchrom input :染色体长度%chrom input :染色体群%sizepop input :种群规模%pop input :当前种群的进化代数和最大的进化代数信息%ret output:变异后的染色体for i=1:sizepop%随机选择一个染色体进行变异pick=rand;while pick==0pick=rand;endindex=ceil(pick*sizepop);%变异概率决定该轮循环是否进行变异pick=rand;if pick>pmutationcontinue;endflag=0while flag==0%变异位置pick=rand;while pick==0pick=rand;endpos=ceil(pick*sum(lenchrom));v=chrom(i,pos);v1=v-bound(pos,2);v2=bound(pos,1)-v;pick=rand; %变异开始if pick>=0.5delta=v1*pick*((1-pop(1)/pop(2))^2);chrom(i,pos)=v+delta;elsedelta=v2*pick*((1-pop(1)/pop(2))^2);chrom(i,pos)=v+delta;end %变异结束if chrom(i,pos)>bound(pos,2)flag=1;endif chrom(i,pos)<bound(pos,1)flag=1;endendendret=chrom;function ret =nonlinear(chrom,sizepop)for i=1:sizepopx=fmincon(inline('-5*sin(x(1))*sin(x(2))*sin(x(3))*sin(x(4))*sin(x(5))-sin(5 *x(1))*sin(5*x(2))*sin(5*x(3))*sin(5*x(4))*sin(5*x(5))'),chrom(i,:)',[],[],[ ],[],[0 0 0 0 0],[2.8274 2.8274 2.8274 2.8274 2.8274]);ret(i,:)=x';end其最坏情况下的时间复杂度随着问题规模的增大指数方式增大,到目前为止还未找到一个多项式例2、TSP(traveling salesman problem,旅行商问题)是典型的NP完全问题,即参考文献[1]孙关龙. 达尔文进化论的五大缺陷[J].化石.1999.[2]王小平,曹立明.遗传算法-理论、应用与软件实现[M].西安交通大学出版社.2002.[3]史峰,王辉等.Matlab智能算法30个案例分析[M].北京航空航天大学出版社.2011.。

相关主题