模拟退火方法
这个例子显示了如何创建和管理选项模拟退火函数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);
现在,我们可以运行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,磅,乌兰巴托,选项);
优化终止:变化函数值小于options.FunctionTolerance最好。
指定温度的选择
用于模拟退火温度参数控制整个搜索结果。每个维度的温度是用于限制搜索的范围尺寸。工具箱允许您指定初始温度以及更新的解决方案过程中温度的方法。这两个是跟温度有关的选项InitialTemperature
和TemperatureFcn
。
指定初始温度
默认的初始温度是为每个维度设置为100。如果你想要不同的初始温度在不同的维度,那么你必须指定一个向量的温度。这可能是必要的情况下,问题在每个维度的比例是不同的。例如,
选择= optimoptions (@simulannealbnd,“InitialTemperature”,50 [300]);
InitialTemperature
可以设置为一个向量的长度小于变量的数量(维度);剩余的解算器扩展了向量维度通过最后一个元素的初始温度向量。这里我们希望所有维度的初始温度是一样的,所以我们只需要指定一个温度。
选项。InitialTemperature = 100;
指定的温度函数
默认的温度函数使用simulannealbnd
被称为temperatureexp
。temperatureexp时间表,温度在任何给定的步骤是.95乘以温度在前一步。这将导致温度下降缓慢,但最终得到冷却器比其他方案。如果另一个计划,例如玻耳兹曼计划或安排退火速度“快”,temperatureboltz
或temperaturefast
可以分别使用。选择快速温度时间表,我们可以更新之前创建选项,改变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
给出了不同的结果。
我们可以复制我们的结果如果我们重置状态之间的随机数生成器运行的解算器通过使用返回的信息simulannealbnd
。simulannealbnd
返回美国的随机数生成器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 * numberOfVariables
。simulannealbnd
跟踪的平均函数值的变化MaxStallIterations
迭代。如果平均变化小于公差函数,FunctionTolerance
,那么该算法将停止。解算器也将停止当目标函数值达到ObjectiveLimit
。最后解决后将停止运行MaxTime
秒。在这里我们设置FunctionTolerance
1 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