主要内容

模拟退火方法

这个例子显示了如何创建和管理选项模拟退火函数simulannealbnd使用optimoptions在全球优化工具箱。

优化问题设置

simulannealbnd搜索函数的最小使用模拟退火。在这个例子中,我们使用simulannealbnd以最小化目标函数dejong5fcn。这个函数是一个实值函数的两个变量和有很多局部最小值很难优化。只有一个全球最低x = (-32、-32),在那里f (x) = 0.998。定义我们的问题,我们必须定义目标函数,指定的起始点和边界范围-64 < = x (i) < = 64为每一个x(我)

ObjectiveFunction = @dejong5fcn;startingPoint = (-30 0);磅= (-64 - -64);乌兰巴托= (64 - 64);

这个函数plotobjective在工具箱阴谋的目标函数的范围-64 < = x1 < = 64,< = -64 x2 < = 64

plotobjective (ObjectiveFunction (-64 64;-64 64]);视图(-15150);

图包含一个坐标轴对象。坐标轴对象包含2类型的对象表面轮廓。

现在,我们可以运行simulannealbnd求解目标函数最小化。

rng默认的%的再现性[x, fval exitFlag、输出]= simulannealbnd (ObjectiveFunction startingPoint,磅,乌兰巴托);
优化终止:变化函数值小于options.FunctionTolerance最好。
流(的迭代的数量是:% d \ n ',output.iterations);
迭代的数量是:1095
流(功能评估的数量是:% d \ n ',output.funccount);
功能评估的数量是:1104
流(“最好的函数值发现:% g \ n ',fval);
最好的函数值发现:2.98211

请注意,当您运行这个例子,您的结果可能不同于上面所示的结果,因为模拟退火算法使用随机数来生成点。

添加可视化

simulannealbnd可以接受一个或多个情节功能通过一个“选择”的论点。这个功能是用于可视化解算器在运行时的性能。情节功能选择使用optimoptions。工具箱包含一组情节功能可供选择,或者你可以提供您自己的自定义图功能。

选择多个情节功能,设置PlotFcn选择通过optimoptions函数。对于本例,我们选择saplotbestf情节最好的函数值每次迭代,saplottemperature显示当前温度,在每次迭代中每个维度,saplotf显示当前函数值(记住当前值不一定是最好的),和saplotstopping的情节满足停止条件的比例每十迭代。

选择= optimoptions (@simulannealbnd,“PlotFcn”,{@saplotbestf、@saplottemperature @saplotf, @saplotstopping});

运行的能手。

simulannealbnd (ObjectiveFunction startingPoint,磅,乌兰巴托,选项);

图模拟退火包含4轴对象。坐标轴对象1和标题最好的函数值:0.998004包含一个类型的对象。轴2标题当前温度包含一个对象类型的酒吧。坐标轴对象3标题当前函数值:0.998004包含一个类型的对象。轴停止准则4标题包含一个对象类型的酒吧。

优化终止:变化函数值小于options.FunctionTolerance最好。

指定温度的选择

用于模拟退火温度参数控制整个搜索结果。每个维度的温度是用于限制搜索的范围尺寸。工具箱允许您指定初始温度以及更新的解决方案过程中温度的方法。这两个是跟温度有关的选项InitialTemperatureTemperatureFcn

指定初始温度

默认的初始温度是为每个维度设置为100。如果你想要不同的初始温度在不同的维度,那么你必须指定一个向量的温度。这可能是必要的情况下,问题在每个维度的比例是不同的。例如,

选择= optimoptions (@simulannealbnd,“InitialTemperature”,50 [300]);

InitialTemperature可以设置为一个向量的长度小于变量的数量(维度);剩余的解算器扩展了向量维度通过最后一个元素的初始温度向量。这里我们希望所有维度的初始温度是一样的,所以我们只需要指定一个温度。

选项。InitialTemperature = 100;

指定的温度函数

默认的温度函数使用simulannealbnd被称为temperatureexp。temperatureexp时间表,温度在任何给定的步骤是.95乘以温度在前一步。这将导致温度下降缓慢,但最终得到冷却器比其他方案。如果另一个计划,例如玻耳兹曼计划或安排退火速度“快”,temperatureboltztemperaturefast可以分别使用。选择快速温度时间表,我们可以更新之前创建选项,改变TemperatureFcn直接。

选项。TemperatureFcn = @temperaturefast;

指定再次退火

再次退火是退火过程的一部分。一定数量后点接受,希望的温度提高到一个更高的价值重新启动搜索和搬出一个局部最小值。执行再次退火过早可能不会帮助解决者确定一个最低,所以相对较高的间隔是一个不错的选择。再次退火的时间间隔可以设置使用ReannealInterval选择。这里,我们默认再次退火间隔减少到50因为函数似乎是平在许多地区和解决可能会迅速被卡住了。

选项。ReannealInterval = 50;

现在我们已经建立了新的温度选项我们再次运行解算器。

[x, fval exitFlag、输出]= simulannealbnd (ObjectiveFunction startingPoint,磅,乌兰巴托,选项);
优化终止:变化函数值小于options.FunctionTolerance最好。
流(的迭代的数量是:% d \ n ',output.iterations);
迭代的数量是:1306
流(功能评估的数量是:% d \ n ',output.funccount);
功能评估的数量是:1321
流(“最好的函数值发现:% g \ n ',fval);
最好的函数值发现:16.4409

复制的结果

simulannealbnd是一个非确定性的算法。这意味着运行解决者不止一次在不改变任何设置可能会给不同的结果。这是因为simulannealbnd利用MATLAB®随机数生成器生成后续点时,也当它决定是否接受新观点。每次一个随机数生成随机数生成器的状态变化。

看到这,两分的simulannealbnd解算器收益率:

[x, fval] = simulannealbnd (ObjectiveFunction startingPoint,磅,乌兰巴托,选项);
优化终止:变化函数值小于options.FunctionTolerance最好。
流(“最好的函数值发现:% g \ n ',fval);
最好的函数值发现:1.99203

而且,

[x, fval] = simulannealbnd (ObjectiveFunction startingPoint,磅,乌兰巴托,选项);
优化终止:变化函数值小于options.FunctionTolerance最好。
流(“最好的函数值发现:% g \ n ',fval);
最好的函数值发现:10.7632

在前面的两个运行simulannealbnd给出了不同的结果。

我们可以复制我们的结果如果我们重置状态之间的随机数生成器运行的解算器通过使用返回的信息simulannealbndsimulannealbnd返回美国的随机数生成器simulannealbnd被称为输出参数。此信息可用于重置状态。这里我们重置状态之间的运行使用这个输出信息,所以接下来的两个运行的结果是一样的。

[x, fval exitFlag、输出]= simulannealbnd (ObjectiveFunction startingPoint,磅,乌兰巴托,选项);
优化终止:变化函数值小于options.FunctionTolerance最好。
流(“最好的函数值发现:% g \ n ',fval);
最好的函数值发现:20.1535

我们重置随机数发生器的状态。

strm = RandStream.getGlobalStream;strm。状态= output.rngstate.State;

现在,让我们来运行simulannealbnd一次。

[x, fval] = simulannealbnd (ObjectiveFunction startingPoint,磅,乌兰巴托,选项);
优化终止:变化函数值小于options.FunctionTolerance最好。
流(“最好的函数值发现:% g \ n ',fval);
最好的函数值发现:20.1535

修改的停止标准

simulannealbnd使用六种不同的标准来确定何时停止解决者。simulannealbnd停止时的最大迭代数超过或功能评价;默认情况下,设置最大迭代次数正和功能评估的最大数量3000 * numberOfVariablessimulannealbnd跟踪的平均函数值的变化MaxStallIterations迭代。如果平均变化小于公差函数,FunctionTolerance,那么该算法将停止。解算器也将停止当目标函数值达到ObjectiveLimit。最后解决后将停止运行MaxTime秒。在这里我们设置FunctionTolerance1 e-5。

选项。FunctionTolerance = 1 e-5;

运行simulannealbnd解算器。

[x, fval exitFlag、输出]= simulannealbnd (ObjectiveFunction startingPoint,磅,乌兰巴托,选项);
优化终止:变化函数值小于options.FunctionTolerance最好。
流(的迭代的数量是:% d \ n ',output.iterations);
迭代的数量是:1843
流(功能评估的数量是:% d \ n ',output.funccount);
功能评估的数量是:1864
流(“最好的函数值发现:% g \ n ',fval);
最好的函数值发现:6.90334

另请参阅

相关的话题