遗传算法.docx
《遗传算法.docx》由会员分享,可在线阅读,更多相关《遗传算法.docx(17页珍藏版)》请在冰豆网上搜索。
![遗传算法.docx](https://file1.bdocx.com/fileroot1/2023-2/5/c9834276-50df-475a-8322-6039ab97cf2c/c9834276-50df-475a-8322-6039ab97cf2c1.gif)
遗传算法
遗传算法程序的编写、改进及测试
姓名:
学号:
一、课题研究主要内容
1、编写基本遗传算法程序并加以改进,进行函数测试。
实现方式:
自行编程。
2、编写基本遗传算法程序并加以改进,进行函数测试。
实现方式:
MATLAB工具箱命令行函数和图形用户接口。
3、进行遗传算法的应用研究(可参考文献,或结合课题)。
二、测试函数的基本特征
我选取的测试函数为Schaffer函数,它描述为:
该函数在其定义域内只具有一个全局极小点
为了更为直观的观察它的全局极小值点,用MATLAB画图命令画出了它在xi取值范围内的图形。
可见Schaffer函数在xi取值范围内除了全局极小点之外,还有很多很多的局部极小值点。
我的作业目标就是通过程序实现,搜索出Schaffer函数在其定义域内的全局极小点,即最小值和取最小值的点xi(x1,x2)。
三用MATLAB基本命令语句编程实现遗传算法
遗传算法(GeneticAlgorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。
它是由美国的J.Holland教授1975年首先提出,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。
对于一个求函数最小值的优化问题(求函数最大值也类同),遗传算法作为一种全局优化搜索算法提供了一个有效的途径和通用的框架。
3.1基本遗传算法的实现
用MATLAB基本命令语句进行基本遗传算法编写,我的程序流程图为:
此时整个程序是基本的遗传算法,只包含三个基本算子,没有改进,其中初始化为随机生成矩阵(rand命令),编码采用简单实用的10位二进制编码,需要说明的是,框图中遗传算子包含了遗传算法的三个算子,每一代通过选择后交叉,再变异生成下一代。
选择采用的是轮盘赌,交叉采用的是单点交叉,变异采用基本位变异(取反),编码中每一位都有概率变异。
详细见附录代码1。
3.2改进的遗传算法
多次调整程序参数(种群大小、代数、码长、交叉概率、变异概率)并多次运行代码1(即基本的遗传算法),程序的运行结果变异太大,有高有低,通过改变参数值虽然运行结果能够在一定范围内去接近Schaffer函数的最小值点,但离目标值还总是差得很大一段距离。
而且不管取什么参数值,从输出的图形的中可以很明显的看出,xi的取值随着代数增加跳跃在目标值的一定范围内,既没有很好的逼近目标值,也没有趋向一个稳定的值,见图3.1。
Result:
k=200MIN=1.4160xb1=1.6618xb2=0.8798
图3.1
算法的稳定性和收敛性似乎不强,程序运行结果的准确性也不高,需要改进。
优秀个体保护法对于每代中一定数量的最优个体,使之直接进入下一代,防止优秀个体由于复制、交叉或变异中的偶然因素而被破坏掉,能够增强算法的稳定性和收敛性。
在代码1.中添加了优秀个体保护法后,程序运行结果的稳定性收敛性准确性明显地提高了很多很多,效果立竿见影,xi也能很好的逼近目标值并且很好地收敛并呈阶梯状稳定,见图3.2。
改进代码为附录代码2,改进的地方有标识。
改进前和改进后的参数是一样的:
参数
M=200;%种群大小
T=200;%遗传运算得终止进化代数
CL=10;%二进制编码长度10位
F=0.7;%交叉概率
Bi=0.5;%变异概率
Max=100;%输入值的取值上限
Min=-100;%输入值的取值下限
Result:
k=200MIN=0.5995xb1=-0.0978xb2=0.0978
图3.2
由于改进前和改进后程序运行差异明显,改进后明显优于改进前,且改进后的算法程序能非常好地逼近目标值,故没有做一些性能指标(如多次运行结果的峰峰值,均值,方差)来描述和对比二者的性能。
四、用MATLAB遗传算法工具箱进行函数测试
可以直接运用MATLAB遗传算法工具箱GeneticAlgorithmToolbox寻求Schaffer函数在其定义域内的全局极小值
运用MATLAB遗传算法工具箱有两种方法,一种方法是用命令行函数ga,另一种方法是用图形用户界面gatool,但他们对应的输入输出变量是一样的,对应的遗传算法源代码是一样的。
使用GeneticAlgorithmToolbox,主要有以下几个步骤:
vWriteanM-filethatcomputesthefunctionyouwanttooptimize.
vNumberofvariables
vGeneticAlgorithmOptions(gaoptimset)
vRun
方法一:
寻求Schaffer函数的最小值,用ga函数具体实现如下:
Step1首先要写目标函数的M文件schaffer.m,文件代码见附录
fitnessFunction=@schaffer;
Step2变量为2,
nvars=2;
Step3SetGeneticAlgorithmOptions:
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',{@selectiontournament4});
options=gaoptimset(options,'CrossoverFcn',@crossoversinglepoint);
options=gaoptimset(options,'MutationFcn',{@mutationgaussian11});
options=gaoptimset(options,'Display','off');
options=gaoptimset(options,'PlotFcns',{@gaplotbestf});
Step4run
[X,FVAL,REASON,OUTPUT,POPULATION,SCORES]=ga(fitnessFunction,nvars,options);
方法二:
若用gatool图形界面,在相应的设置项填入或选择设置,然后运行即可。
以上的设置运行结果如下(多次试验得出的设置,多次运行得出的比较好的结果):
图形为:
Statusandresults:
GArunning.
GAterminated.
Fitnessfunctionvalue:
0.006667532430880696
Optimizationterminated:
stallgenerationslimitexceeded.
4、作业总结
1、我把options中的PopInitRange设置为[-1;1],使得初代个体就能在最优值(0,0)附近,倘若我们不知道函数的最优值点在哪里,依照函数定义域把PopInitRange设置为[-100100],工具箱的运行结果不会在最优值点附近,而且会差很多很多。
所以,如果不知道目标点位置如何设置PopInitRange,如何评估最终结果的准确性。
2、MATLAB7.0自带的遗传算法工具箱GADS好像不适用于求有约束条件的极值问题
3、由于期末在即,时间有限,所以没有对某个参数值对算法性能的影响进行讨论。
参考文献
1、李玉榕.人工智能第三章求解优化问题的智能算法.福州大学.2010
2、刘会灯、朱飞.MATLAB编程基础与典型应用.人民邮电出版社.2008
附录
%-------------------------------------------代码1:
clearall;
closeall;
%遗传算法参数设定和初始化
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);
fork=1:
1:
T
T(k)=k;
fors=1:
1:
M
N=G(s,:
);
y1=0;y2=0;
N1=N(1:
1:
CL);%对x1进行解码,
fori=1:
1:
CL
y1=y1+N1(i)*2^(i-1);
end
x1=(Max-Min)*y1/(2^CL-1)+Min;
N2=N(CL+1:
1:
2*CL);%对x2进行解码
fori=1:
1:
CL
y2=y2+N2(i)*2^(i-1);
end
x2=(Max-Min)*y2/(2^CL-1)+Min;
F(s)=-((x1^2+x2^2)^0.25)*((sin(50*(x1^2+x2^2)^0.1))^2+1);%目标函数表达式
end
Fit=F;
[Order,Index]=sort(Fit);%将适应度从小到大进行排列
BF=Order(M);%选出适应度最大得值
N=G(Index(M),:
);
y1=0;y2=0;
N1=N(1:
1:
CL);
fori=1:
1:
CL
y1=y1+N1(i)*2^(i-1);
end
xb1=(Max-Min)*y1/(2^CL-1)+Min;
x1_G(k)=xb1;%为了便于最后图形输出,而引进的类似指针型变量
N2=N(CL+1:
1:
2*CL);%对x2进行解码
fori=1:
1:
CL
y2=y2+N2(i)*2^(i-1);
end
xb2=(Max-Min)*y2/(2^CL-1)+Min;
x2_G(k)=xb2;
BFI(k)=BF;
BG=G(Index(M),:
);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%selection
ada_sum=0;
fori=1:
1:
M%直到累加和>=fit_n,最后的累加就是复制个体
ada_sum=ada_sum+F(i);
end
fori=1:
(M-10)%最后10个体留给历代最优解
r=rand*ada_sum;%随机产生一个数
ada_temp=0;%初始化累加值为0
j=1;
while(ada_tempada_temp=ada_temp+F(j);
j=j+1;
end
ifj==1
j=1;
else
j=j-1;
end
NG(i,:
)=G(j,:
);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%crossover
fori=1:
2:
M
Rn=rand;%Rn为0-1之间的随机数
ifF>Rn%交叉条件,F=0.6,Rn<0.6时就进行交叉运算
Cn=ceil(2*CL*Rn);
ifor(Cn==0,Cn>=20)
continue;
end
forj=Cn:
1:
2*CL%随机交换部分染色体的基因,交换的位从Cn到末位止
temp=NG(i,j);
NG(i,j)=NG(i+1,j);
NG(i+1,j)=temp;
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%mutation
fori=1:
1:
M%变异运算
forj=1:
1:
2*CL
Mr=rand;%产生基本位变异位,同样Mr是0-1之间的数
ifBi>Mr%变异条件
ifNG(i,j)==0
NG(i,j)=1;
else
NG(i,j)=0;
end
end
end
end
G=NG;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%result
k
MIN=-BF
xb1
xb2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%plot
subplot(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:
clearall;
closeall;
%遗传算法参数设定和初始化
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);
fork=1:
1:
T
T(k)=k;
fors=1:
1:
M
N=G(s,:
);
y1=0;y2=0;
N1=N(1:
1:
CL);%对x1进行解码,
fori=1:
1:
CL
y1=y1+N1(i)*2^(i-1);
end
x1=(Max-Min)*y1/(2^CL-1)+Min;
N2=N(CL+1:
1:
2*CL);%对x2进行解码
fori=1:
1:
CL
y2=y2+N2(i)*2^(i-1);
end
x2=(Max-Min)*y2/(2^CL-1)+Min;
F(s)=-((x1^2+x2^2)^0.25)*((sin(50*(x1^2+x2^2)^0.1))^2+1);%目标函数表达式
end
Fit=F;
[Order,Index]=sort(Fit);%将适应度从小到大进行排列
BF=Order(M);%选出适应度最大得值
N=G(Index(M),:
);
y1=0;y2=0;
N1=N(1:
1:
CL);
fori=1:
1:
CL
y1=y1+N1(i)*2^(i-1);
end
xb1=(Max-Min)*y1/(2^CL-1)+Min;
x1_G(k)=xb1;%为了便于最后图形输出,而引进的类似指针型变量
N2=N(CL+1:
1:
2*CL);%对x2进行解码
fori=1:
1:
CL
y2=y2+N2(i)*2^(i-1);
end
xb2=(Max-Min)*y2/(2^CL-1)+Min;
x2_G(k)=xb2;
BFI(k)=BF;
BG=G(Index(M),:
);
In=M;%保护10个最优个体
fori=1:
1:
10
BGG(i,:
)=G(Index(In),:
);
In=In-1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%selection
%采用赌盘选择法
ada_sum=0;
fori=1:
1:
M%直到累加和>=fit_n,最后的累加就是复制个体
ada_sum=ada_sum+F(i);
end
fori=1:
(M-10)%最后10个体留给历代最优解
r=rand*ada_sum;%随机产生一个数
ada_temp=0;%初始化累加值为0
j=1;
while(ada_tempada_temp=ada_temp+F(j);
j=j+1;
end
ifj==1
j=1;
else
j=j-1;
end
NG(i,:
)=G(j,:
);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%crossover
fori=1:
2:
(M-10)
Rn=rand;%Rn为0-1之间的随机数
ifF>Rn%交叉条件,F=0.6,Rn<0.6时就进行交叉运算
Cn=ceil(2*CL*Rn);
ifor(Cn==0,Cn>=20)
continue;
end
forj=Cn:
1:
2*CL%随机交换部分染色体的基因,交换的位从Cn到末位止
temp=NG(i,j);
NG(i,j)=NG(i+1,j);
NG(i+1,j)=temp;
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%mutation
fori=1:
1:
(M-10)%变异运算
forj=1:
1:
2*CL
Mr=rand;%产生基本位变异位,同样Mr是0-1之间的数
ifBi>Mr%变异条件
ifNG(i,j)==0
NG(i,j)=1;
else
NG(i,j)=0;
end
end
end
end
Rs=10;%(即后10位)进行保优
fori=1:
1:
10
NG(M-Rs,:
)=BGG(i,:
);
Rs=Rs-1;
end
G=NG;
end
k
MIN=-BF
xb1
xb2
subplot(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');