使用MATLAB遗传算法工具实例 联系客服

发布时间 : 星期日 文章使用MATLAB遗传算法工具实例更新完毕开始阅读ef65583904a1b0717ed5dd55

异,所以算法不能产生任何新的基因。算法利用这些第8代的基因来产生最好的个体,这时最佳适应度图形呈现为水平。此后,它从紧接着的一代选择最佳个体,产生新的最佳个体的副本。到了第17代,种群中的所有个体都相同,也就是说,都变成了最佳个体。当这种情形出现时,个体之间的平均距离为0。由于算法在第8代之后不能改善最佳适应度值,它在50代过后就陷于停滞,因为Stall generations(停滞代数)设置为50。

(2)无交叉的变异

为了查看遗传算法在没有交叉的情形下是如何工作的,设置Crossover fraction为0,并单击Start按钮,得到的最佳适应度值约等于3.5,如图8.47所示。

图8.47 无交叉的变异下函数的适应度值与平均距离

在这种情况下,算法应用的随机变化没有改善第一代最佳个体的适应度函数值。但是,它改善了其它个体的个体基因,可以由图8.49中的上部图形看到适应度函数的平均值逐渐减少,这些改善的基因没有和最佳个体基因结合,因为没有交叉。结果,最佳适应度图形是水平的,并且算法在50代停滞。

(3)比较遗传算法取不同交叉概率时的运行结果

在工具箱有一个演示函数deterministicstudy.m,Crossover fraction分别设置为0、0.2、0.4、0.6、0.8、1,把遗传算法应用到Rastrigin函数,比较不同的运行结果。遗传算法运行10代。对于交叉概率的每一个值,画出每一代之前的所有代的最佳适应度值的均值和标准差。在MATLAB 命令窗口,输入deterministicstudy,当演示结束时,画出图形,如图8.48所示。

177

图8.48 不同交叉概率下最佳适应度值的均值和标准差

图8.48中下面的图形显示10代不同的交叉概率下最佳适应度值的均值和标准差,上边图形的颜色显示每一代的最佳适应度值。对于这个适应度函数,当Crossover fraction等于0.8时得到最好结果。但是,对于其它适应度函数,交叉概率可能取另外的值,才能得到最好结果。 8.3.3.8 举例——相对于全局的局部最小值

有时,优化的目的是要找到函数的全局最小值或最大值——一个点的函数值比搜索空间中其他任何点上的函数值都要小或都要大。但是,最优化算法有时得到的是局部最小值——该点的函数值比它的附近点的函数值小,但是可能比搜索空间的其它点的函数值大。为了克服这个不足,遗传算法的参数必须设置适当。例如,考虑下面的函数

x2?当x?20 ??exp[?()],f(x)??20???exp(?1)?(x?20)(x?22),当x?20函数f (x)的图形如图8.49所示。

178

局部最小值

图8.49 函数f (x)的图形

这个函数有两个局部最小值,当x = 0时,函数值f (x)=-1;当x = 21时,函数值f (x)为

f (x)=-(1+1/e)≈-1.36787944117144

所以,全局最小值是当x = 21时的函数值。

以下列步骤运行遗传算法:

(1) 用MATLAB编辑器将下面的代码复制、粘贴到一个新M文件。

function y = two_min(x) if x<20

y = -exp(-(x/20).^2); else

y = -exp(-1)+(x-20)*(x-22); end

(2) 用MATLAB将这个文件保存为two_min.m。 (3) 在遗传算法工具中,进行如下设置: ? 设置Fitness function为@two_min。 ? 设置Number of variables等于1。 (4) 单击Start按钮。

遗传算法返回的值,接近局部最小值点x = 0,如图8.50所示。

179

图8.50 函数f (x)的局部最优解

图8.51说明为什么算法得到的是局部最小值,而不是全局最小值。该图画出了每代个体的范围以及最优个体。

最佳值 0.00028487

图8.51 初始范围为[0; 1]时每代个体的范围及最优个体

注意:所有个体的范围为-2~2.5。由于变异,这个范围比缺省Initial range [0;1]大,但是没有大到搜索全局最小值点x = 21的附近。

使遗传算法搜索更大范围的点的一个方法是增加种群的多样性,即增大Initial range。初始范围不一定包含点x = 21,但是它必须足够大,以便算法能产生x = 21附近的个体。设置Initial range为[0;15] ,如图8.52所示。

180