遗传算法工具箱的使用方法
在上一期介绍遗传算法的详细代码之后,有的人可能觉着用起来很不方便,那么这期咱们就来看看遗传算法工具箱的基本使用方法。这里的工具箱主要包括两种:(1)GUI用户界面;(2)调用函数ga。(Matlab版本 2014a)
准备工作(研究函数)
我们调用工具箱里专门测试遗传算法的最小值问题:
我们先看看函数图像的性质,
%%%%子函数代码
function [y]=ras(x1,x2)
[~,M1]=size(x1);
[~,M2]=size(x2);
for i=1:M1
for j=1:M2
y(i,j)=20+x1(i)^2+x2(j)^2-10*(cos(2*pi*x1(i))+cos(2*pi*x2(j)));
end
end
end
然后在Matlab界面输入作图代码,画出X1∈[-5,5],X2∈[-5,5]的图像。
syms x y z;
x=-5:0.05:5;
y=-5:0.05:5;
z=ras(x,y);
mesh(x,y,z)
很明显函数具有多个局部最优区域,所以该函数能够检验遗传算法的收敛性。
从图像上来看,我们可以看出该函数在给定范围里的最小值在X1=0,X2=0取得,结果f=0。
一.用户界面GUI
首先,在Matlab界面输入gatool,便会弹出窗口,
该窗口则是GUI界面,我们需要做的则是按照实际问题,将值输入到界面中的相应位置。
简单观察该界面会发现,该界面分成三个区域:
(1)左边是问题设置和结果显示区域;(2)中间是选项框,主要是参数的设置;(3)右边是一些常见问题的解决方案。
一般问题只需要使用左边框区域,在界面中“Fitness function”输入“@rastriginsfcn”,然后在“Number of variables”中输入变量数量“2”。
点击“start”按钮
然后在下方会出现结果以及对应的取值点
迭代结束的原因(Optimization terminated)是“适应值的平均变化小于默认值”。这里会产生一个问题,最小值是0.08左右,对应两个变量值分别为0.001与0.02。这与函数图像结果相比偏差很大,原因是遗传算法的迭代有一定随机性,重复几次之后就会发现每次计算结果均不相同,这里需要修改默认选项,即是界面中间区域,使得遗传算法能够收敛到全局最优解(这里可以理解为如果算法迭代条件不够强,算法容易陷入局部最优;而迭代条件达到一定强度后,继续加强迭代条件无法提高结果的精度,只会带来计算能力的浪费)。
我们先来看看选项栏中的选项分类
经过上期对于遗传算法的简要介绍,相信大家对于这些词条的意义都很明确,常见的词条则是初始种群设置,适应度函数设置,选择规则,子代产生规则,变异规则,交互规则和结果输出规则,其他词条较少使用,有兴趣的同学可以自己调试看看。下面以“Population”为例,简单介绍下常用词条的设置方法。
点开Population,会出现如下选项
这里所设置的是种群形式和大小,还有初始值分数和范围,可以看出,这里选中的都是默认值。如果根据实际情况,选中“Specify”进行设置即可。类似的,“Selection”,“Mutation”和“Crossover”后面选项如果需要修改默认值,选中“Specify”设置即可。
需要着重介绍的两个词条是“Stopping criteria”和“Plot function”。
“Stopping criteria”指的是算法停止的标准,这里将停止的标准设置为迭代200代,那么相应的运算结果为
最后函数最小值为0.01左右,相应两个变量值分别为:0.007和0.004,其结果比默认迭代50代更加精确。
“Plot function”则是GUI用户界面自带的结果输出工具,它可以根据需求做出遗传算法的迭代结果图。
遗传算法在一般使用中所需要的就是迭代中适应度最优值的变化图(Best fitness),我们来看看同样的问题在200次迭代中,每次迭代适应度的最优值是怎么变化的。
选中“Best fitness”
然后点击“Start”
图中出现两类点:(1)蓝点,则是每次迭代中适应度最优值;(2)黑点,则是每次迭代中适应度的平均值。
至此,遗传算法GUI用户界面的基本使用方法已经介绍完毕,实际问题不会像以上例子这样简单,有时候初始种群会有复杂的条件限制,或者迭代后的子代会有整数约束等等,此时,用遗传算法GUI用户界面求解起来则会复杂得多,需要修改的词条会更多。
二.调用函数 ga
遗传算法函数ga调用的基本格式为:
[x fval]表示返回的最终点和对应的适应度函数值,@fitnessfun是对应的适应度函数文件,nvars表示独立变量的个数。我们来看看调用函数在默认条件下求解出的最小值为
我们会发现,无论是两个变量值或函数最小值,其结果与函数仿真图中结果偏差很大。说明调用函数ga中默认选项的精度无法满足使用要求,需要对调用函数ga中具体细节进行修正,首先看看ga句柄中能够设置遗传算法的哪些条件。
在matlab界面中输入gaoptimset,
gaoptimset即是ga函数的句柄,用来修改遗传算法的具体细节,我们从上图可以看到,虽然句柄中包含了遗传算法的各个细节,但是实际应用中所需要的并不多。
gaoptimset的使用代码为
options=gaoptimset('X','X_index');
options=gaoptimset(options,'Y', 'Y_index') ;
换成文字解释是:如果要修改两个句柄X和Y,首先在句柄表里找到X和Y分别对应的英文代码,比如X表示种群形式,Y表示种群大小,那么对照句柄表,X是populationtype;Y是populationsize。然后在查找句柄表,每个句柄里所包含的内容,比如
X_index处只能填入三个选项:1. bitstring;2. custom;3. doubleVector 。一般来说选择默认doubleVector即可。同样的Y_index处能够填写的选项从句柄表里可以查出,剩下的句柄完全按照这个思路填写即可,不做修改的句柄视为取值为默认条件,即是每个句柄后大括号中的内容。
好了,有了以上调用ga函数的基本方法,我们写出代码,重新对原最小值问题进行求解。同样的,我们将迭代次数修改为200,将种群数量由默认值50改为100,那么写出的代码为
clc;
clear all;
options=gaoptimset('populationtype','doublevector'); %%%%%%%%种群形式
options=gaoptimset(options,'populationsize',100);%%%%%%种群数量
options=gaoptimset(options,'PlotFcns',@gaplotbestf);%%%%%画图选项-最佳适应度
options=gaoptimset(options,'generations',200);%%%%%%%%迭代次数上限
options=gaoptimset(options,'stallgenlimit',inf);%%%%%%%迭代停止条件-最优个体经过多少代不变则迭代停止,这里选为‘inf’指的是若未达到迭代上限则一直进行算法
record=[];
[x,fval]=ga(@rastriginsfcn,2,options); %%%%%%%遗传算法代码
record=[record;fval]; %%%%%%%记录迭代次数和最优解
xlabel('generation');
ylabel('fval')
disp(x)
disp(fval)
我们来看看导出的迭代结果图和最优解处的取值情况。
首先是迭代结果图
再看看最优解处的取值情况
可以看出这一次计算,精度可以达到,已经比较理想了,后面也可以仿照代码书写方式,对交互概率和变异概率进行设置,可以使迭代上限在小于200代的情况下达到的精度。
三.总结
本期主要介绍了遗传算法的两种工具箱使用方法,回避了上一期中对于遗传算法详细程序的代码编写,提高了遗传算法的使用效率。当然,在实际科研使用中,遗传算法的使用条件不会如此简单,约束也不会这么单一,但是万变不离其宗,希望这两期关于遗传算发的介绍,能让遗传算法的初学者们感到容易上手一些。
【内容相关】:
遗传算法原理与代码解析编辑:庄桢
“交通科研Lab”:分享学习点滴,期待科研交流!
如果觉得还不错
点这里!???