主要内容

模拟退火方法

在命令行设置模拟退火选项

通过创建选项对象使用optimoptions函数如下:

选择= optimoptions (@simulannealbnd,...“Param1”value1,“Param2”value2,...);

中的字段名列出了本节中的每个选项选项。例如,InitialTemperature表示对应的字段选项

绘图选项

绘图选项使您能够在模拟退火求解器运行时绘制数据。

PlotInterval指定连续调用plot函数之间的迭代次数。

调用时显示情节simulannealbnd从命令行中,设置PlotFcn领域的选项作为绘图函数的内置绘图函数名或句柄。你可以指定以下任意一个图:

  • “saplotbestf”绘制最佳目标函数值。

  • “saplotbestx”画出当前最好的点。

  • “saplotf”绘制当前函数值。

  • “saplotx”绘制当前点。

  • “saplotstopping”地块停止标准水平。

  • “saplottemperature”绘制每次迭代的温度。

  • @myfun绘制自定义绘图函数,其中myfun是函数的名称。看到情节功能的结构查询语法说明。

例如,要显示最好的目标图,设置选项如下

选项= optimoptions (@simulannealbnd ' PlotFcn ', ' saplotbestf ');

要显示多个图,请使用单元格数组语法

选择= optimoptions (@simulannealbnd,...“PlotFcn”, {@plotfun1 @plotfun2,...});

在哪里@plotfun1@plotfun2,等等是plot函数的函数句柄。

如果指定多个绘图函数,所有绘图将作为子绘图显示在同一个窗口中。在单独的图形窗口中,右键单击任何子图以获得更大的版本。

情节功能的结构

plot函数的第一行有这样的形式

函数stop = plotfun(options,optimvalues,flag)

函数的输入参数是

  • 选项-使用optimoptions

  • optimvalues-包含关于求解器当前状态信息的结构。该结构包含以下字段:

    • x——当前点

    • fval-目标函数在x处的值

    • bestx-迄今为止发现的最好的点

    • bestfval-最佳点的目标函数值

    • 温度——当前温度

    • 迭代——当前迭代

    • funccount—函数计算次数

    • t0—算法的开始时间

    • k——退火参数

  • 国旗-调用plot函数的当前状态。的可能值国旗

    • “init”——初始化状态

    • “通路”——迭代状态

    • “完成”——最终状态

输出参数停止提供在当前迭代时停止算法的方法。停止可以有以下值:

  • -算法继续进行下一次迭代。

  • 真正的—算法在当前迭代结束。

温度的选择

温度选项指定在算法过程中的每次迭代中如何降低温度。

  • InitialTemperature—算法开始时的初始温度。默认值是One hundred.。初始温度可以是一个长度相同的向量x,未知量的向量。simulannealbnd将标量初始温度展开成矢量。

  • TemperatureFcn—更新温度时间表。让k表示退火参数。(退火参数与重新退火前的迭代次数相同。)的选项是:

    • “temperatureexp”-温度等于InitialTemperature * 0.95 ^k。这是默认值。

    • “temperaturefast”-温度等于InitialTemperature /k

    • “temperatureboltz”-温度等于InitialTemperature / ln (k)

    • @myfun-使用自定义函数,myfun,以更新温度。的语法是:

      温度= myfun (optimValues选项)

      在哪里optimValues结构描述在情节功能的结构选项是由optimoptions,或由默认选项组成,如果您没有创建任何选项。退火参数optimValues.k和温度optimValues.temperature向量的长度是否等于当前点的元素个数x。例如,函数temperaturefast是:

      温度= options.InitialTemperature. / optimValues.k;

算法设置

算法设置定义了算法的特定参数,用于在每次迭代时生成新的点。

可指定的参数simulannealbnd是:

  • 数据类型-在目标函数中使用的数据类型。选择:

    • “双”(默认)-一个类型的向量

    • “自定义”—其他数据类型。你必须提供“自定义”退火函数。不能使用混合函数。

  • AnnealingFcn-用于为下一次迭代生成新点的函数。的选择是:

    • “annealingfast”-台阶具有长度温度,方向均匀随机。这是默认值。

    • “annealingboltz”-步长为温度的平方根,方向均匀随机。

    • @myfun-使用自定义退火算法,myfun。的语法是:

      newx = myfun (optimValues问题)
      在哪里optimValues结构描述在输出函数的结构,问题是一个包含以下信息的结构:

      • 客观的:目标函数的句柄

      • x0:起点

      • 据nvar:决策变量的数量

      • :决策变量的下界

      • 乌兰巴托:决策变量的上界

      例如,当前的位置是optimValues.x,当前目标函数值为problem.objective (optimValues.x)

      可以通过修改来编写自定义目标函数saannealingfcntemplate.m文件。要保持所有迭代都在限定范围内,可以使用自定义的退火函数调用sahonorbounds作为最后的命令。

  • ReannealInterval-重新退火前接受的点数。默认值为One hundred.

  • AcceptanceFcn-用于确定是否接受新点的函数。的选择是:

    • “acceptancesa”—模拟退火验收函数,默认值。如果新的目标函数值小于旧的目标函数值,则总是接受新的点。否则,新点被随机接受,其概率取决于目标函数值的差值和当前温度。接受概率为

      1 1 + 经验值 Δ 马克斯 T ) )

      其中Δ =新目标-旧目标,和T为当前温度。因为Δ和T是正的,接受的概率在0到1/2之间。温度越低,接受概率越小。此外,Δ越大,接受概率越小。

    • @myfun-自定义接受函数,myfun。的语法是:

      acceptpoint = myfun (optimValues newx newfval);
      在哪里optimValues结构描述在输出函数的结构newx这个点是否被评估为可接受的,并且newfval目标函数在newxacceptpoint是布尔值吗真正的接受newx,拒绝newx

混合功能选项

混合函数是求解器迭代过程中或迭代结束时运行的另一个最小化函数。HybridInterval指定间隔(如果不是的话)从来没有结束),调用混合函数。属性指定混合函数HybridFcn选择。的选择是:

  • []—无混合功能。

  • “fminsearch”-使用MATLAB®函数fminsearch执行无约束极小化。

  • “patternsearch”——使用patternsearch执行有约束或无约束的最小化。

  • “fminunc”-使用优化工具箱™功能fminunc执行无约束极小化。

  • “fmincon”—使用“优化工具箱”功能fmincon执行约束最小化。

请注意

确保您的混合函数接受您的问题约束。否则,simulannealbnd抛出一个错误。

您可以为混合功能设置单独的选项。使用optimsetfminsearch,或optimoptionsfminconpatternsearch,或fminunc。例如:

hybridopts = optimoptions (“fminunc”...“显示”“通路”“算法”“拟牛顿”);
的混合选项simulannealbnd 选项如下:
选择= optimoptions (@simulannealbnd选项,...“HybridFcn”, {@fminunc, hybridopts});
hybridopts必须在你设置之前存在选项

看到遗传算法中的混合方案了一个例子。看到何时使用混合函数

停止条件的选择

停止条件确定导致算法终止的原因。您可以指定以下选项:

  • FunctionTolerance-算法运行直到目标函数值的平均变化StallIterLim迭代次数少于FunctionTolerance。默认值为1 e-6

  • MaxIterations—当迭代次数超过最大迭代次数时,算法停止。您可以将最大迭代次数指定为正整数或是默认的。

  • MaxFunctionEvaluations指定目标函数的最大求值次数。如果函数求值的数量超过最大函数求值的数量,则算法停止。允许的最大值为3000 * numberofvariables

  • MaxTime指定算法停止前运行的最大时间(以秒为单位)。

  • ObjectiveLimit—当可行点的最佳目标函数值小于时,算法停止ObjectiveLimit

输出函数的选择

输出函数是算法在每次迭代时调用的函数。默认值是没有输出函数,[]。首先必须使用中描述的语法创建输出函数输出函数的结构

使用优化应用程序:

  • 指定输出函数作为@myfun,在那里myfun是函数的名称。

  • 要在输出函数中传递额外的参数,请使用匿名函数

  • 对于多个输出函数,输入输出函数句柄的单元格数组:{@myfun1, @myfun2,…}

在命令行:

  • 选择= optimoptions (@simulannealbnd OutputFcn, @myfun);

  • 对于多个输出函数,请输入函数句柄的单元格数组:

    选择= optimoptions (@simulannealbnd,...“OutputFcn”, {@myfun1 @myfun2,...});

要查看可用于编写自己的输出函数的模板,请输入

编辑saoutputfcntemplate

在MATLAB命令行。

输出函数的结构

输出函数的调用语法如下。

(停止、选择optchanged) = myfun(选项、optimvalues标志)

该函数有以下输入参数:

  • 选项-使用optimoptions

  • optimvalues-包含关于求解器当前状态信息的结构。该结构包含以下字段:

    • x——当前点

    • fval-目标函数在x处的值

    • bestx-迄今为止发现的最好的点

    • bestfval-最佳点的目标函数值

    • 温度-当前温度,与之长度相同的矢量x

    • 迭代——当前迭代

    • funccount—函数计算次数

    • t0—算法的开始时间

    • k-退火参数,一个长度相同的矢量x

  • 国旗-调用输出函数的当前状态。的可能值国旗

    • “init”——初始化状态

    • “通路”——迭代状态

    • “完成”——最终状态

传递额外的参数说明如何向输出函数提供附加参数。

输出函数返回以下参数:

  • 停止-提供在当前迭代时停止算法的方法。停止可以有以下值:

    • -算法继续进行下一次迭代。

    • 真正的—算法在当前迭代结束。

  • 选项—输出函数修改的选项。

  • optchanged-一个布尔标志,指示更改选项。这个必须设置为真正的如果选项改变了。

显示选项

使用显示选项指定在运行算法时在命令行显示多少信息。可用的选项有

  • —无回显信息。的默认值选项从优化应用程序导出。

  • iter—每次迭代都会显示信息。

  • 诊断—每次迭代都会显示信息。此外,诊断程序还列出了一些问题信息和从默认设置更改的选项。

  • 最后—显示停止原因。这是使用创建的选项的默认值optimoptions

这两个iter诊断显示如下信息:

  • 迭代——迭代数

  • f-count-目标函数评估的累计次数

  • 最好的f (x)-最佳目标函数值

  • 当前f (x)-当前目标函数值

  • 平均温度-平均温度函数值