最小化拉斯特里金函数
拉斯特里金函数
此示例说明如何找到拉斯特里金函数的最小值,该函数经常用于测试遗传算法。该示例介绍了两种最小化方法:使用优化实时编辑器任务和在命令行上工作。
对于两个独立变量,拉斯特里金函数定义为
运行此示例时,可以使用计算拉斯特里金函数值的 rastriginsfcn.m
文件。创建拉斯特里金函数的曲面图。
fsurf(@(x,y)reshape(rastriginsfcn([x(:),y(:)]),size(x)),... "MeshDensity",100,... "ShowContours","on",... "LineStyle",":")
如图所示,拉斯特里金函数有许多局部极小值- 图中的“谷值”。但是,该函数只有一个全局最小值,它出现在 xy 平面上的点 [0 0] 处,该处函数的值为 0。在 [0 0] 以外的任何局部最小值处,拉斯特里金函数的值都大于 0。局部最小值距离原点越远,该点的函数值越大。
拉斯特里金函数经常被用来测试遗传算法,因为它的许多局部极小值使得标准的基于梯度的方法很难找到全局最小值。
尽量减少使用优化实时编辑器任务
本节讲解如何利用遗传算法寻找拉斯特里金函数的最小值。
注意:由于遗传算法使用随机数生成器,因此每次运行该算法都会返回不同的结果。
点击主页选项卡上文件部分中的新建实时脚本按钮,创建一个新的实时脚本。
插入
Optimize
实时编辑器任务。点击插入选项卡,然后在代码部分中选择任务 > 优化。
点击基于求解器按钮。
为了输入问题数据,请点击插入选项卡上的分节符按钮插入新节。新节出现在任务的上方和下方。
在任务上方的新部分中,输入以下代码来定义变量的数量和目标函数。
rng default % For reproducibility nvar = 2; fun = @rastriginsfcn;
要将这些变量放入工作区,请按 Ctrl+Enter 运行该部分。
在任务的指定问题类型部分,点击目标 > 非线性按钮。
选择求解器 > ga - 遗传算法。
在任务的选择问题数据部分中,选择目标函数> 函数句柄,然后选择
fun
。选择变量数量 > nvar。
在任务的显示进度部分,选择最佳适应度图。
要运行求解器,请点击任务窗口右上角的选项按钮 ⁝,并选择运行节。绘图出现在单独的图窗窗口中和任务输出区域中。请注意,您的图可能与所示的图不同,因为
ga
是一种随机算法。
图底部的点表示最佳适应度值,而其上方的点表示每代适应度值的平均值。图的顶部以数字形式显示了当前代中的最佳值和平均值。
要查看解和适应度函数值,请查看任务的顶部。
要查看这些变量的值,请在任务下方的部分中输入以下代码。
disp(solution) disp(objectiveValue)
显示的值与拉斯特里金函数的实际最小值 0 不太接近。主题 设置初始范围、变异和交叉 和 设置最大代数和停滞代数 描述了实现更接近实际最小值的结果的方法。或者,您可以简单地重新运行求解器以尝试获得更好的结果。
实时编辑器任务的最终状态显示在这里。
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
disp(solution)
0.9785 0.9443
disp(objectiveValue)
2.5463
在命令行中最小化
要在命令行中找到拉斯特里金函数的最小值,请输入以下代码。
rng default % For reproducibility options = optimoptions('ga','PlotFcn','gaplotbestf'); [solution,objectiveValue] = ga(@rastriginsfcn,2,... [],[],[],[],[],[],[],options)
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
solution = 1×2
0.9785 0.9443
objectiveValue = 2.5463
图底部的点表示最佳适应度值,而其上方的点表示每代适应度值的平均值。图的顶部以数字形式显示了当前代中的最佳值和平均值。
Optimize
实时编辑器任务和命令行都允许您制定和解决问题,并且它们给出相同的结果。命令行更加精简,但对于选择求解器、设置问题以及选择绘图函数等选项提供的帮助较少。您还可以使用 Optimize
开始一个问题,然后生成用于命令行的代码,如 使用优化实时编辑器任务或求解器的有约束非线性问题。