遗传算法深入学习下

来源:互联网 发布:java 异常类 课件 编辑:程序博客网 时间:2024/05/20 05:56

        在正式进入遗传算法深入学习的内容之前,笔者想先就我们人生不同阶段(或层次)所学知识的特点做一下简单的分析和概括:  

       我们起初(大学以前)学习的知识都有一个共同的特点,即都是静态的,如:数学、物理、化学等,问题的求解都是通过解方程就可以完成的。

       稍微深入一点的学习(大学时期)的知识大都是动态的,如:高等数学、电路分析、信号与系统、自控原理、电拖、微积分等,这里好多问题大都需要通过微分方程、差分方程等去解决。

       更加深入一点的就莫过于建模与仿真了,这些更多的应该是通过建模去更加精确细致的描述客观世界,去分析系统运行的机理,当然能走到这一步已经实属不易了。

       再有更高点的就应该是定格于设计创新了,通过自己掌握的知识进行相应的实验验证、分析、抽象、推理,从而对自己所研究的领域进行拓宽(即探索未知领域),因此,能走到这一步就少之又少了。下面举两个小例子:

       智能车,相信很多同学大学时都有做过智能小车的经历,起初很长一段时间我们只是对小车有一个表象的认识(小车大都有轮子、电机、车体等组成),这些还都是静态的(表面的),最多是买些零件组装起来;随着学习的深入,我们开始接触小车的主控系统、驱动模块等,开始做一些动态的设计呀、仿真之类的,比如传感器信号的处理、互补滤波、卡尔曼滤波、直立控制、方向控制、速度控制等等,通过参考已有的设计实现小车整个软件系统的设计,再通过一些调试(近似盲调)进行效果上的优化;更高一点应该是在实现小车软硬件设计的基础上,通过对小车进行建模,通过仿真的手段确定小车各方面的参数,比如直立控制采用PI控制实现,通过仿真已确定小车的最佳比例和积分参数的整定;当然更高层次的就是通过创新设计更优的小车了(如独轮车)。

        直升机,应该会有一部分同学对直升机比较了解,至少目前很多人从事多旋翼无人机的设计工作。所以笔者还是想多此一举,再举一例来为后续内容做一下铺垫。起初很长一段时间也是停留在对直升机表象的认识,最多是组装过或是玩过;随着无人飞行器的应用的多元化,以及市场需求的日益增加,以大疆、Parrot、3DR等为代表的公司开始成长起来,越来越多的人参与了无人机的研发和制作工作,尤其是以3DR为代表的一些公司为促进无人飞行器的发展拓展了开源无人机领域(造福了一批又一批小伙伴),很多人通过开源代码开发无人机,(PS跑题有点远了,回到直升机上来)。3DR的开源代码也广泛分布在直升机控制领域,通过参考开源代码就能完成直升机软件系统的设计,通过近似盲调的手段来优化系统,达到设计的目的。更高层次的应该是在软硬件设计的基础上,对直升机进行建模,通过仿真的手段确定直升机各方面的控制参数,比如(增稳控制回路)角速率、(姿态控制回路)姿态角、(高度速度航向控制回路)高度速度航向、(航迹控制回路)大地坐标等参数的整定,通过建模和仿真的手段才能确保飞行器各方面的稳定(这也就是很多新型飞机在刚开始时由于建模不准确、或仿真手段太落后导致参数整定存在偏差而时常会有坠机的情况发生,随着建模的优化以及仿真平台的发展,后续针对该机型的改进型飞起来就相对稳定多了)。当然,更高层次的就是创新了,比喻目前分析的是固定翼直升机,人们随后发明了倾转翼直升机(美国的鱼鹰)。

        好了,讲了这么多,下面进入正题。目前应该说很多人(PS:其实,现在很多小公司也大都处于这个层次,想要成长起来几乎是不可能的,淘汰是迟早的事情。不建模、不研究机理,就很难谈创新,没有创新没有未来)都处于大学这个层次,就是通过参考别人的代码,去以实验性的方法整定参数,很少有一部分人会通过建模的方法,去深入的研究系统的机理。所以,接下来就希望大家更多的去学习建模,可能过程苦了点,可学会了就受益终生了,如果你愿意并从事这个行业,早学早好。

        一般我们在设备上(直升机或小车)都采用微处理器设计,运行的就是我们用c、c++等语言编写好的通过编译、链接、下载的微代码,但对系统建模要采用较为先进的软件进行,目前我们使用最多的是MATLAB(矩阵实验室)软件,梳理一下:同过计算机上的matlab软件对所设计的系统进行建模与仿真,确定目标参数的值,然后通过c、c++等语言编写程序在微处理器上运行。

       matlab语法比较随意,但正如其全名 matrix &laboraty(矩阵实验室)所言,相比于其他语言,它可以非常便捷实现矩阵运算,就像我们标量的加减乘除一样简单。对于矩阵运算的强大支持和强大数学和科学计算函数库也垫定了其可以广泛应用在各种科学计算中,研究人员可以快速的使用matlab验证一个算法使用matlab验证算法相比C/C++/JAVA等工作量小了很多,算法验证达到了一个较好的效果,我们也可以比较迅速的使用C、C++等语言把它用到实际工程和产品中去。

        MATLAB如此重要,研究遗传算法,我们怎会放过他。前面的两篇文章讲的是c语言下遗传算法的实现。下面讲一下matlab下遗传算法的实现:

       下面我们就简要遗传算法的原理,然后介绍重要的代码,后面附上笔者调试的代码连接,供大家下载学习。

首先,介绍简要遗传算法原理:

遗传算法可以用来求函数的极值。
(1)用二进制编码来离散自变量,码长根据离散精度来确定。码长为log2[maxmin)/+1]
(2)交叉方法采用单点交叉
(3)变异是根据变异概率反转子代某个位的值
(4)选择策略采用轮盘赌策略,令
PPi=ij=1pi,PP0=0,其中PPi为累计概率,pi为个体的选择概率,公式为:pi=fitness(xi)NPi=1fitness(xi),其中fitnessxi为个体的适应度,共轮转NP次,每次轮转时,产生随机数r,当PPi1<=r<PPi时选择个体i


然后,通过main函数了解算法的整体框架:

function gmain()tic;popsize=50; %群体大小chromlength=10; %字符串长度(个体长度)pc=0.4; %交叉概率pm=0.002; %变异概率%第一步:随机产生种群pop=initpop(popsize,chromlength); %随机产生初始群体for i=1:30 %30为迭代次数%第二步:用轮盘赌策略确定个体的适应度,判断是否符合优化准则,若符合,输出最佳个体及其最优解,结束,       %否则,进行下一步 [objvalue]=calobjvalue(pop); %计算目标函数fitvalue=calfitvalue(objvalue); %计算群体中每个个体的适应度%第三步:依据适应度选择再生个体,适应度高的个体被选中的概率高,适应度低的个体被淘汰[newpop]=selection(pop,fitvalue); %复制%第四步:按照一定的交叉概率和交叉方法,生成新的个体[newpop]=crossover(pop,pc); %交叉%第五步:按照一定的变异概率和变异方法,生成新的个体[newpop]=mutation(pop,pc); %变异//%第六步:由交叉和变异产生新一代种群,返回步骤2[bestindividual,bestfit]=best(pop,fitvalue); %求出群体中适应值最大的个体及其适应值y(i)=max(bestfit);n(i)=i;pop5=bestindividual;x(i)=decodechrom(pop5,1,chromlength)*10/1023;pop=newpop;endfplot('10*sin(5*x)+7*cos(4*x)',[0 10])hold onplot(x,y,'r*')hold off[z index]=max(y); %计算最大值及其位置x5=x(index)%计算最大值对应的x值y=ztoc


下面介绍一下计算个体的适应值的函数calfitva.m

function fitvalue=calfitvalue(objvalue)global Cmin;Cmin=0;[px,py]=size(objvalue);for i=1:pxif objvalue(i)+Cmin>0  %计算值大于零temp=Cmin+objvalue(i);elsetemp=0.0;endfitvalue(i)=temp;endfitvalue=fitvalue';

下面介绍一下选择函数selection.m。该函数选择或复制操作是决定哪些个体可以进入下一代。程序中采用赌轮盘选择法选择,这种方法较易实现。

function [newpop]=selection(pop,fitvalue)totalfit=sum(fitvalue); %求适应值之和fitvalue=fitvalue/totalfit; %单个个体被选择的概率fitvalue=cumsum(fitvalue); %如 fitvalue=[1 2 3 4],则 cumsum(fitvalue)=[1 3 6 10] [px,py]=size(pop);ms=sort(rand(px,1)); %从小到大排列fitin=1;newin=1;while newin<=pxif(ms(newin))<fitvalue(fitin)newpop(newin)=pop(fitin);newin=newin+1;elsefitin=fitin+1;endend

至于交叉、变异等函数这里就不做过多的介绍,下面是仿真效果图:




总结:

        遗传算法使用过程中影响算法效率的主要因素包括:和理解的编码形式,初始种群的选定,评价函数即适应度函数的设计,及选择算子、交叉算子及变异算子的确定。保持种群的多样性及合理选择个体间的竞争机制能有效防止种群“早熟”或者不收敛。如对早期种群中适应值非常高的个体,须加以抑制,否则该个体将大量繁殖,减少种群的多样性,从而过早收敛。而搜索后期,平均适应度附件的个体以及适应值较大的个体繁殖后代的概率相同,使收敛停滞。


下面附上原代码下载链接:


http://download.csdn.net/download/qq_26292325/10028750










原创粉丝点击