遗传算法Word格式.docx
《遗传算法Word格式.docx》由会员分享,可在线阅读,更多相关《遗传算法Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
用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;
%输入值的取值下限
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]);
PopulationSize'
1000);
CrossoverFraction'
0.33);
Generations'
200);
SelectionFcn'
{@selectiontournament4});
CrossoverFcn'
@crossoversinglepoint);
MutationFcn'
{@mutationgaussian11});
Display'
'
off'
);
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;
%遗传算法参数设定和初始化
G=round(rand(M,CL*2));
%初始化
NG=zeros(M,CL*2);
fork=1:
1:
T
T(k)=k;
fors=1:
M
N=G(s,:
y1=0;
y2=0;
N1=N(1:
CL);
%对x1进行解码,
fori=1:
CL
y1=y1+N1(i)*2^(i-1);
end
x1=(Max-Min)*y1/(2^CL-1)+Min;
N2=N(CL+1:
2*CL);
%对x2进行解码
CL
y2=y2+N2(i)*2^(i-1);
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);
%目标函数表达式
Fit=F;
[Order,Index]=sort(Fit);
%将适应度从小到大进行排列
BF=Order(M);
%选出适应度最大得值
N=G(Index(M),:
y1=0;
xb1=(Max-Min)*y1/(2^CL-1)+Min;
x1_G(k)=xb1;
%为了便于最后图形输出,而引进的类似指针型变量
xb2=(Max-Min)*y2/(2^CL-1)+Min;
x2_G(k)=xb2;
BFI(k)=BF;
BG=G(Index(M),:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%selection
ada_sum=0;
M%直到累加和>
=fit_n,最后的累加就是复制个体
ada_sum=ada_sum+F(i);
(M-10)%最后10个体留给历代最优解
r=rand*ada_sum;
%随机产生一个数
ada_temp=0;
%初始化累加值为0
j=1;
while(ada_temp<
r)&
(j<
81)
ada_temp=ada_temp+F(j);
j=j+1;
end
ifj==1
else
j=j-1;
NG(i,:
)=G(j,:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%crossover
2:
Rn=rand;
%Rn为0-1之间的随机数
ifF>
Rn%交叉条件,F=0.6,Rn<
0.6时就进行交叉运算
Cn=ceil(2*CL*Rn);
ifor(Cn==0,Cn>
=20)
continue;
forj=Cn:
2*CL%随机交换部分染色体的基因,交换的位从Cn到末位止
temp=NG(i,j);
NG(i,j)=NG(i+1,j);
NG(i+1,j)=temp;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%mutation
M%变异运算
forj=1:
2*CL
Mr=rand;
%产生基本位变异位,同样Mr是0-1之间的数
ifBi>
Mr%变异条件
ifNG(i,j)==0
NG(i,j)=1;
NG(i,j)=0;
G=NG;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%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'
X2'
subplot(3,1,1);
plot(T,x1_G,'
X1'
%---------------------------------------代码2:
%选出适应度最大得值
In=M;
%保护10个最优个体
10
BGG(i,:
)=G(Index(In),:
In=In-1;
%采用赌盘选择法
(M-10)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
(M-10)%变异运算
Rs=10;
%(即后10位)进行保优
10
NG(M-Rs,:
)=BGG(i,:
Rs=Rs-1;