1、遗传算法遗传算法程序的编写、改进及测试姓名: 学号:一、课题研究主要内容1、编写基本遗传算法程序并加以改进,进行函数测试。实现方式:自行编程。2、编写基本遗传算法程序并加以改进,进行函数测试。实现方式:MATLAB工具箱命令行函数和图形用户接口。3、进行遗传算法的应用研究(可参考文献,或结合课题)。二、测试函数的基本特征 我选取的测试函数为Schaffer函数,它描述为: 该函数在其定义域内只具有一个全局极小点 为了更为直观的观察它的全局极小值点,用MATLAB画图命令画出了它在xi取值范围内的图形。可见Schaffer函数在xi取值范围内除了全局极小点之外,还有很多很多的局部极小值点。我的作
2、业目标就是通过程序实现,搜索出Schaffer函数在其定义域内的全局极小点,即最小值和取最小值的点xi(x1,x2)。 三 用MATLAB基本命令语句编程实现遗传算法 遗传算法(Genetic Algorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。它是由美国的J.Holland教授1975年首先提出,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。对于一个求函数最小值的优化问题(求函数最大值也类同
3、),遗传算法作为一种全局优化搜索算法提供了一个有效的途径和通用的框架。3.1 基本遗传算法的实现用MATLAB基本命令语句进行基本遗传算法编写,我的程序流程图为: 此时整个程序是基本的遗传算法,只包含三个基本算子,没有改进,其中初始化为随机生成矩阵(rand命令),编码采用简单实用的10位二进制编码,需要说明的是,框图中遗传算子包含了遗传算法的三个算子,每一代通过选择后交叉,再变异生成下一代。选择采用的是轮盘赌,交叉采用的是单点交叉,变异采用基本位变异(取反),编码中每一位都有概率变异。详细见附录代码1。3.2 改进的遗传算法多次调整程序参数(种群大小、代数、码长、交叉概率、变异概率)并多次运
4、行代码1(即基本的遗传算法),程序的运行结果变异太大,有高有低,通过改变参数值虽然运行结果能够在一定范围内去接近Schaffer函数的最小值点,但离目标值还总是差得很大一段距离。而且不管取什么参数值,从输出的图形的中可以很明显的看出,xi的取值随着代数增加跳跃在目标值的一定范围内,既没有很好的逼近目标值,也没有趋向一个稳定的值,见图3.1。 Result: k =200 MIN =1.4160 xb1 = 1.6618 xb2 =0.8798图3.1算法的稳定性和收敛性似乎不强,程序运行结果的准确性也不高,需要改进。优秀个体保护法对于每代中一定数量的最优个体,使之直接进入下一代,防止优秀个体由
5、于复制、交叉或变异中的偶然因素而被破坏掉,能够增强算法的稳定性和收敛性。在代码1.中添加了优秀个体保护法后,程序运行结果的稳定性收敛性准确性明显地提高了很多很多,效果立竿见影,xi也能很好的逼近目标值并且很好地收敛并呈阶梯状稳定,见图3.2。改进代码为附录代码2,改进的地方有标识。改进前和改进后的参数是一样的:参数M=200; %种群大小T=200; %遗传运算得终止进化代数CL=10; %二进制编码长度10位F=0.7; %交叉概率Bi=0.5; %变异概率Max=100; %输入值的取值上限Min=-100; %输入值的取值下限 Result: k = 200 MIN =0.5995 xb
6、1 =-0.0978 xb2 =0.0978图3.2由于改进前和改进后程序运行差异明显,改进后明显优于改进前,且改进后的算法程序能非常好地逼近目标值,故没有做一些性能指标(如多次运行结果的峰峰值,均值,方差)来描述和对比二者的性能。四、用MATLAB遗传算法工具箱进行函数测试 可以直接运用MATLAB遗传算法工具箱Genetic Algorithm Toolbox寻求Schaffer函数在其定义域内的全局极小值 运用MATLAB遗传算法工具箱有两种方法,一种方法是用命令行函数ga,另一种方法是用图形用户界面gatool,但他们对应的输入输出变量是一样的,对应的遗传算法源代码是一样的。使用Gen
7、etic Algorithm Toolbox,主要有以下几个步骤:v Write an M-file that computes the function you want to optimize. v Number of variablesv Genetic Algorithm Options (gaoptimset)v Run方法一:寻求Schaffer函数的最小值,用ga函数具体实现如下:Step1首先要写目标函数的M文件schaffer.m,文件代码见附录fitnessFunction = schaffer; Step2 变量为2,nvars = 2;Step3 Set Genetic
8、 Algorithm Options:options = gaoptimset(options,PopInitRange ,-1 ; 1 );options = gaoptimset(options,PopulationSize ,1000);options = gaoptimset(options,CrossoverFraction ,0.33);options = gaoptimset(options,Generations ,200);options = gaoptimset(options,SelectionFcn , selectiontournament 4 );options =
9、 gaoptimset(options,CrossoverFcn ,crossoversinglepoint);options = gaoptimset(options,MutationFcn , mutationgaussian 1 1 );options = gaoptimset(options,Display ,off);options = gaoptimset(options,PlotFcns , gaplotbestf );Step4 runX,FVAL,REASON,OUTPUT,POPULATION,SCORES = ga(fitnessFunction,nvars,option
10、s);方法二:若用gatool图形界面,在相应的设置项填入或选择设置,然后运行即可。以上的设置运行结果如下(多次试验得出的设置,多次运行得出的比较好的结果):图形为:Status and results: GA running. GA terminated. Fitness function value: 0.006667532430880696 Optimization terminated: stall generations limit exceeded.4、作业总结1、我把options中的PopInitRange设置为-1 ; 1 ,使得初代个体就能在最优值(0 ,0)附近,倘若我们
11、不知道函数的最优值点在哪里,依照函数定义域把PopInitRange设置为-100 100,工具箱的运行结果不会在最优值点附近,而且会差很多很多。所以,如果不知道目标点位置如何设置PopInitRange,如何评估最终结果的准确性。 2、MATLAB7.0自带的遗传算法工具箱GADS好像不适用于求有约束条件的极值问题 3、由于期末在即,时间有限,所以没有对某个参数值对算法性能的影响进行讨论。 参考文献1、 李玉榕.人工智能第三章求解优化问题的智能算法.福州大学.20102、 刘会灯、朱飞.MATLAB编程基础与典型应用.人民邮电出版社.2008附录%-代码1:clear all;close a
12、ll;%遗传算法参数设定和初始化M=200; %种群大小T=200; %遗传运算得终止进化代数CL=10; %二进制编码长度10位F=0.7; %交叉概率Bi=0.5; %变异概率Max=100; %输入值的取值上限Min=-100; %输入值的取值下限G=round(rand(M,CL*2); %初始化NG=zeros(M,CL*2);for k=1:1:TT(k)=k;for s=1:1:M N=G(s,:); y1=0;y2=0;N1=N(1:1:CL); %对x1进行解码,for i=1:1:CL y1=y1+N1(i)*2(i-1);endx1=(Max-Min)*y1/(2CL-1
13、)+Min; N2=N(CL+1:1:2*CL); %对x2进行解码for i=1:1:CL y2=y2+N2(i)*2(i-1);endx2=(Max-Min)*y2/(2CL-1)+Min; F(s)=-(x12+x22)0.25)*(sin(50*(x12+x22)0.1)2+1); %目标函数表达式endFit=F;Order,Index=sort(Fit); %将适应度从小到大进行排列BF=Order(M); %选出适应度最大得值N=G(Index(M),:);y1=0;y2=0;N1=N(1:1:CL);for i=1:1:CL y1=y1+N1(i)*2(i-1);endxb1=
14、(Max-Min)*y1/(2CL-1)+Min; x1_G(k)=xb1; %为了便于最后图形输出,而引进的类似指针型变量N2=N(CL+1:1:2*CL); %对x2进行解码for i=1:1:CL y2=y2+N2(i)*2(i-1);endxb2=(Max-Min)*y2/(2CL-1)+Min;x2_G(k)=xb2;BFI(k)=BF; BG=G(Index(M),:); %selectionada_sum=0;for i=1:1:M %直到累加和=fit_n,最后的累加就是复制个体 ada_sum=ada_sum+F(i);endfor i=1:(M-10) %最后10个体留给历
15、代最优解 r=rand*ada_sum; %随机产生一个数 ada_temp=0; %初始化累加值为0 j=1; while(ada_tempr)&(jRn %交叉条件,F=0.6,Rn=20) continue; end for j=Cn:1:2*CL %随机交换部分染色体的基因,交换的位从Cn到末位止 temp=NG(i,j); NG(i,j)=NG(i+1,j); NG(i+1,j)=temp; end endend%mutationfor i=1:1:M %变异运算 for j=1:1:2*CL Mr=rand; %产生基本位变异位,同样Mr是0-1之间的数 if BiMr %变异条件
16、 if NG(i,j)=0 NG(i,j)=1; else NG(i,j)=0; end end endendG=NG;end%resultkMIN=-BFxb1xb2%plotsubplot(3,1,3);plot(T,-BFI,.); xlabel(次数);ylabel(最小值);subplot(3,1,2);plot(T,x2_G,.black); xlabel(次数);ylabel(X2);subplot(3,1,1);plot(T,x1_G,.black); xlabel(次数);ylabel(X1);%-代码2:clear all;close all;%遗传算法参数设定和初始化M=
17、200; %种群大小T=200; %遗传运算得终止进化代数CL=10; %二进制编码长度10位F=0.7; %交叉概率Bi=0.5; %变异概率Max=100; %输入值的取值上限Min=-100; %输入值的取值下限G=round(rand(M,CL*2); %初始化NG=zeros(M,CL*2);for k=1:1:TT(k)=k;for s=1:1:M N=G(s,:); y1=0;y2=0;N1=N(1:1:CL); %对x1进行解码,for i=1:1:CL y1=y1+N1(i)*2(i-1);endx1=(Max-Min)*y1/(2CL-1)+Min; N2=N(CL+1:1
18、:2*CL); %对x2进行解码for i=1:1:CL y2=y2+N2(i)*2(i-1);endx2=(Max-Min)*y2/(2CL-1)+Min; F(s)=-(x12+x22)0.25)*(sin(50*(x12+x22)0.1)2+1); %目标函数表达式endFit=F;Order,Index=sort(Fit); %将适应度从小到大进行排列BF=Order(M);%选出适应度最大得值N=G(Index(M),:);y1=0;y2=0;N1=N(1:1:CL);for i=1:1:CL y1=y1+N1(i)*2(i-1);endxb1=(Max-Min)*y1/(2CL-1
19、)+Min; x1_G(k)=xb1; %为了便于最后图形输出,而引进的类似指针型变量N2=N(CL+1:1:2*CL); %对x2进行解码for i=1:1:CL y2=y2+N2(i)*2(i-1);endxb2=(Max-Min)*y2/(2CL-1)+Min;x2_G(k)=xb2;BFI(k)=BF; BG=G(Index(M),:); In=M; %保护10个最优个体for i=1:1:10 BGG(i,:)=G(Index(In),:); In=In-1;end%selection%采用赌盘选择法ada_sum=0;for i=1:1:M %直到累加和=fit_n,最后的累加就是
20、复制个体 ada_sum=ada_sum+F(i);endfor i=1:(M-10) %最后10个体留给历代最优解 r=rand*ada_sum; %随机产生一个数 ada_temp=0; %初始化累加值为0 j=1; while(ada_tempr)&(jRn %交叉条件,F=0.6,Rn=20) continue; end for j=Cn:1:2*CL %随机交换部分染色体的基因,交换的位从Cn到末位止 temp=NG(i,j); NG(i,j)=NG(i+1,j); NG(i+1,j)=temp; end endend%mutationfor i=1:1:(M-10) %变异运算 f
21、or j=1:1:2*CL Mr=rand; %产生基本位变异位,同样Mr是0-1之间的数 if BiMr %变异条件 if NG(i,j)=0 NG(i,j)=1; else NG(i,j)=0; end end endendRs=10;%(即后10位)进行保优for i=1:1:10 NG(M-Rs,:)=BGG(i,:); Rs=Rs-1;endG=NG;endkMIN=-BFxb1xb2subplot(3,1,3);plot(T,-BFI,.); xlabel(次数);ylabel(最小值);subplot(3,1,2);plot(T,x2_G,.black); xlabel(次数);ylabel(X2);subplot(3,1,1);plot(T,x1_G,.black); xlabel(次数);ylabel(X1);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1