模拟退火选项
此示例显示了如何为模拟退火功能创建和管理选项simulanealbnd
使用最佳选择
在全局优化工具箱中。
优化问题设置
simulanealbnd
searches for a minimum of a function using simulated annealing. For this example we usesimulanealbnd
最小化目标函数dejong5fcn
。该函数是两个变量的真正有价值函数,并且具有许多局部最小值,因此很难优化。只有一个全球最低限度x =(-32,-32)
, 在哪里F(x)= 0.998
。要定义我们的问题,我们必须定义目标函数,起点和范围指定的界限-64 <= x(i)<= 64
每个x(i)
。
objectivefunction = @dejong5fcn;起点= [-30 0];lb = [-64 -64];ub = [64 64];
功能plotObjective
在工具箱中绘制了整个范围内目标函数-64 <= x1 <= 64
,,,,-64 <= x2 <= 64
。
plotObjective(目标函数,[-64 64; -64 64]);查看(-15,150);
现在,我们可以运行simulanealbnd
求解器以最小化我们的目标函数。
RNG默认%可再现性[X,FVAL,EXITFLAG,输出] = SimulannealBnd(目标输入,起点,LB,UB);
优化终止:最佳功能值的更改小于options.functionTolerance。
fprintf('The number of iterations was : %d\n',,,,output.iterations);
The number of iterations was : 1095
fprintf('功能评估的数量为:%d \ n',output.funccount);
功能评估的数量为:1104
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值是:2.98211
请注意,当您运行此示例时,您的结果可能与上面显示的结果不同,因为模拟的退火算法使用随机数来生成点。
添加可视化
simulanealbnd
可以通过“选项”参数接受一个或多个绘图函数。此功能可用于可视化求解器在运行时的性能。使用绘图功能使用最佳选择
。该工具箱包含一组绘图功能供您选择,或者您可以提供自己的自定义绘图功能。
要选择多个绘图功能,请设置plotfcn
选项通过最佳选择
功能。对于此示例,我们选择saplotbestf
,绘制每个迭代的最佳功能价值,苗条
,显示在每个迭代时每个维度的电流温度,saplotf
,显示当前功能值(请记住,当前值不一定是最好的值),并且SaplotStopping
,其中绘制了停止标准的百分比每十个迭代满足。
options = optimoptions(@simulannealbnd,...'plotfcn',{@saplotbestf,@saplottemperature,@saplotf,@saplotStopping});
运行求解器。
simulaneAlbnd(客观功能,起点,lb,ub,选项);
优化终止:最佳功能值的更改小于options.functionTolerance。
指定温度选项
模拟退火中使用的温度参数控制总体搜索结果。每个维度的温度用于限制该维度的搜索程度。该工具箱使您可以指定初始温度以及在解决方案过程中更新温度的方法。两个与温度有关的选项是初始效果
和温度
。
指定初始温度
每个维度的默认初始温度设置为100。如果您希望初始温度在不同的维度上有所不同,则必须指定温度的向量。如果在每个维度上对问题的缩小缩小不同,则可能是必要的。例如,
options = optimoptions(@simulannealbnd,“初始温度”,[300 50]);
初始效果
可以将其设置为长度小于变量数(尺寸)的矢量;求解器通过采用初始温度向量的最后一个元素将矢量扩展到其余尺寸。在这里,我们希望初始温度在所有维度上都相同,因此我们只需要指定单个温度即可。
options.InitialTemperature = 100;
指定温度函数
由simulanealbnd
叫做温度增强
。在温度表的时间表中,任何给定步骤的温度是上一步时温度的0.95倍。这会导致温度起初缓慢下降,但最终比其他方案快得多。如果需要另一个方案,例如Boltzmann时间表或“快速”时间表退火,然后温度螺栓
或者温度快
可以分别使用。要选择快速温度时间表,我们可以更新以前创建的选项,更改温度
直接地。
options.temperaturefcn = @temperaturefast;
指定Reannealing
Reannealing是退火过程的一部分。接受一定数量的新点后,将温度提高到更高的价值,希望重新启动搜索并移出当地的最小值。过早执行重新启动可能无法帮助求解器确定最低限度,因此相对较高的间隔是一个不错的选择。可以使用Reannealing发生的间隔使用ReannealInterval
选项。在这里,我们将默认的reannealing间隔减少到50,因为该功能在许多地区似乎是平坦的,而求解器可能会迅速卡住。
options.ReannealInterval = 50;
现在,我们已经设置了新的温度选项,我们再次运行求解器。
[X,FVAL,EXITFLAG,输出] = simulannealBnd(objectionFunction,起点,lb,ub,options);
优化终止:最佳功能值的更改小于options.functionTolerance。
fprintf('The number of iterations was : %d\n',,,,output.iterations);
迭代次数为:1306
fprintf('功能评估的数量为:%d \ n',output.funccount);
功能评估的数量为:1321
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值是:16.4409
再现结果
simulanealbnd
是一种非确定算法。这意味着在不更改任何设置的情况下多次运行求解器可能会产生不同的结果。这是因为simulanealbnd
当它生成后续点以及确定是否接受新点时,它会使用MATLAB®随机数生成器。每次生成随机数时,随机数生成器的状态都会更改。
为此,两次运行simulanealbnd
求解器产量:
[x,fval] = simulannealbnd(客观功能,起点,lb,ub,options);
优化终止:最佳功能值的更改小于options.functionTolerance。
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值是:1.99203
和,
[x,fval] = simulannealbnd(客观功能,起点,lb,ub,options);
优化终止:最佳功能值的更改小于options.functionTolerance。
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值是:10.7632
在前两次simulanealbnd
给出不同的结果。
如果我们使用由返回的信息重置求解器的运行之间的随机数生成器的状态,则可以重现结果simulanealbnd
。simulanealbnd
当时返回随机数生成器的状态simulanealbnd
在输出参数中称为。该信息可用于重置状态。在这里,我们使用此输出信息重置在运行之间的状态,因此接下来的两个运行的结果相同。
[X,FVAL,EXITFLAG,输出] = simulannealBnd(objectionFunction,起点,lb,ub,options);
优化终止:最佳功能值的更改小于options.functionTolerance。
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值是:20.1535
我们重置随机数生成器的状态。
strm = randstream.getGlobalStream;strm.State = output.rngstate.state;
现在,让我们跑步simulanealbnd
再次。
[x,fval] = simulannealbnd(客观功能,起点,lb,ub,options);
优化终止:最佳功能值的更改小于options.functionTolerance。
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值是:20.1535
修改停止标准
simulanealbnd
使用六个不同的标准来确定何时阻止求解器。simulanealbnd
当超过最大迭代或功能评估数量时,停止;默认情况下,最大迭代次数设置为INF,最大函数评估数为3000*numberOfVariables
。simulanealbnd
跟踪函数值的平均变化MaxStalliterations
迭代。如果平均变化小于功能公差,则函数授体
,然后该算法将停止。当目标函数值达到目标时,求解器也将停止Objectivelimit
。最后,求解器将在运行后停止maxtime
秒。在这里,我们设置函数授体
到1E-5。
options.functionTolerance = 1e-5;
跑过simulanealbnd
求解器。
[X,FVAL,EXITFLAG,输出] = simulannealBnd(objectionFunction,起点,lb,ub,options);
优化终止:最佳功能值的更改小于options.functionTolerance。
fprintf('The number of iterations was : %d\n',,,,output.iterations);
迭代次数是:1843年
fprintf('功能评估的数量为:%d \ n',output.funccount);
功能评估的数量为:1864
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值是:6.90334