主要内容

模拟退火选项

此示例显示了如何为模拟退火功能创建和管理选项simulanealbnd使用最佳选择在全局优化工具箱中。

优化问题设置

simulanealbndsearches 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);

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

现在,我们可以运行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,选项);

图模拟退火包含4轴objects. Axes object 1 with title Best Function Value: 0.998004 contains an object of type line. Axes object 2 with title Current Temperature contains an object of type bar. Axes object 3 with title Current Function Value: 0.998004 contains an object of type line. Axes object 4 with title Stopping Criteria contains an object of type bar.

优化终止:最佳功能值的更改小于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给出不同的结果。

如果我们使用由返回的信息重置求解器的运行之间的随机数生成器的状态,则可以重现结果simulanealbndsimulanealbnd当时返回随机数生成器的状态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*numberOfVariablessimulanealbnd跟踪函数值的平均变化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

也可以看看

Related Topics