Main Content

本页采用了机器翻译。点击此处可查看英文原文。

模拟退火选项

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

通过使用 optimoptions 函数创建 options 对象来指定选项,如下所示:

options = optimoptions(@simulannealbnd,...
    'Param1',value1,'Param2',value2, ...);

本节中的每个选项均按 options 中的字段名称列出。例如 InitialTemperature 引用 options 的对应字段。

绘图选项

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

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

要在从命令行调用 simulannealbnd 时显示绘图,请将 optionsPlotFcn 字段设置为内置绘图函数名称或绘图函数的句柄。您可以指定以下任意一个图:

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

  • 'saplotbestx' 绘制当前最佳点。

  • 'saplotf' 绘制当前函数值。

  • 'saplotx' 绘制当前点。

  • 'saplotstopping' 绘制停止条件水平。

  • 'saplottemperature' 绘制每次迭代时的温度。

  • @myfun 绘制自定义绘图函数,其中 myfun 是函数的名称。请参阅绘图函数的结构了解语法的描述。

例如,为了显示最佳目标图,请按如下方式设置 options

options = optimoptions(@simulannealbnd,'PlotFcn','saplotbestf');

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

options = optimoptions(@simulannealbnd,...
    'PlotFcn',{@plotfun1,@plotfun2, ...});

其中 @plotfun1@plotfun2 等是绘图函数的函数句柄。

如果指定多个绘图函数,则所有绘图都会作为子绘图出现在同一个窗口中。右键单击任意子图可在单独的图形窗口中获取更大版本。

绘图函数的结构

绘图函数的第一行具有以下形式

function stop = plotfun(options,optimvalues,flag)

该函数的输入参量是

  • options - 使用 optimoptions 创建的选项。

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

    • x - 当前点

    • fval - x 处的目标函数值

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

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

    • temperature - 当前温度

    • iteration - 当前迭代

    • funccount -函数计算的次数

    • t0 - 算法的开始时间

    • k - 退火参数

  • flag - 调用绘图函数的当前状态。flag 的可能值为

    • 'init' - 初始化状态

    • 'iter' - 迭代状态

    • 'done' - 最终状态

输出参量 stop 提供了一种在当前迭代停止算法的方法。stop 可以具有以下值:

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

  • true - 算法在当前迭代终止。

温度选项

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

  • InitialTemperature - 算法开始时的初始温度。默认值为 100。初始温度可以是与未知数向量 x 长度相同的向量。simulannealbnd 将标量初始温度扩展为向量。

  • TemperatureFcn - 用于更新温度计划的函数。让 k 表示退火参数。(退火参数与迭代次数相同,直到重新退火。)选项包括:

    • 'temperatureexp' - 温度等于 InitialTemperature * 0.95^k。这是默认设置。

    • 'temperaturefast' - 温度等于 InitialTemperature / k

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

    • @myfun - 使用自定义函数 myfun 来更新温度。语法为:

      temperature = myfun(optimValues,options)

      其中 optimValues绘图函数的结构 中描述的结构体。options 可以使用 optimoptions 创建,或者由默认选项组成(如果您未创建任何选项)。退火参数 optimValues.k 和温度 optimValues.temperature 都是长度等于当前点 x 的元素数量的向量。例如函数 temperaturefast 是:

      temperature = options.InitialTemperature./optimValues.k;

算法设置

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

可以为 simulannealbnd 指定的参数有:

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

    • 'double'(默认)- double 类型的向量。

    • 'custom' - 任何其他数据类型。您必须提供 'custom' 退火函数。您不能使用混合函数。

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

    • 'annealingfast' - 步骤的长度为温度,方向均匀随机。这是默认设置。

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

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

      newx = myfun(optimValues,problem)
      其中 optimValues输出函数的结构 中描述的结构体,而 problem 是包含以下信息的结构体:

      • objective:目标函数的函数句柄

      • x0:起点

      • nvar:决策变量的数量

      • lb:决策变量的下界

      • ub:决策变量的上界

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

      您可以通过修改 saannealingfcntemplate.m 文件来编写自定义目标函数。为了使所有迭代都在边界内,请让自定义退火函数调用 sahonorbounds 作为最终命令。

  • ReannealInterval - 重新退火之前接受的点数。默认值为 100

  • AcceptanceFcn - 用于确定新点是否被接受的函数。选项包括:

    • 'acceptancesa' - 模拟退火接受函数,默认。如果新的目标函数值小于旧的目标函数值,则新的点总是被接受。否则,将根据目标函数值的差异和当前温度的概率随机接受新点。接受概率是

      11+exp(Δmax(T)),

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

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

      acceptpoint = myfun(optimValues,newx,newfval);
      其中 optimValues输出函数的结构 中描述的结构体,newx 是被评估为可接受的点,而 newfvalnewx 处的目标函数。acceptpoint 是一个布尔值,其值为 true 表示接受 newx,而 false 表示拒绝 newx

混合函数选项

混合函数是另一个最小化函数,它在求解器迭代期间或迭代结束时运行。HybridInterval 指定调用混合函数的间隔(如果不是 neverend)。您可以使用 HybridFcn 选项指定混合函数。选项包括:

  • [] - 没有混合函数。

  • 'fminsearch' - 使用 MATLAB® 函数 fminsearch 执行无约束最小化。

  • 'patternsearch' - 使用 patternsearch 执行约束或无约束最小化。

  • 'fminunc' - 使用 Optimization Toolbox™ 函数 fminunc 执行无约束最小化。

  • 'fmincon' - 使用 Optimization Toolbox 函数 fmincon 执行约束最小化。

注意

确保您的混合函数接受您的问题约束。否则,simulannealbnd 将引发错误。

您可以为混合函数设置单独的选项。使用 optimset 代替 fminsearch,或使用 optimoptions 代替 fminconpatternsearchfminunc。例如:

hybridopts = optimoptions('fminunc',...
    'Display','iter','Algorithm','quasi-newton');
simulannealbnd options 中包含混合选项如下:
options = optimoptions(@simulannealbnd,options,...
    'HybridFcn',{@fminunc,hybridopts}); 
在设置 options 之前,hybridopts 必须存在。

有关示例,请参阅遗传算法中的混合方案。请参阅 何时使用混合函数

停止条件选项

停止标准决定导致算法终止的原因。您可以指定以下选项:

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

  • MaxIterations - 如果迭代次数超过此最大迭代次数,则算法停止。您可以将最大迭代次数指定为正整数或 InfInf 是默认值。

  • MaxFunctionEvaluations 指定目标函数的最大评估次数。如果函数计算的次数超出了最大函数计算的次数,则算法停止。允许的最大值为 3000*numberofvariables

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

  • ObjectiveLimit - 如果可行点的最佳目标函数值小于 ObjectiveLimit,则算法停止。

输出函数选项

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

使用优化应用程序:

  • 输出函数指定为 @myfun,其中 myfun 是您的函数的名称。

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

  • 对于多个输出函数,请输入输出函数句柄的元胞数组:{@myfun1,@myfun2,...}

在命令行中:

  • options = optimoptions(@simulannealbnd,'OutputFcn',@myfun);

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

    options = optimoptions(@simulannealbnd,...
        'OutputFcn',{@myfun1,@myfun2,...});

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

edit saoutputfcntemplate

(在 MATLAB 命令行进行此输入)。

输出函数的结构

输出函数具有以下调用语法。

[stop,options,optchanged] = myfun(options,optimvalues,flag)

该函数具有以下输入参量:

  • options - 使用 optimoptions 创建的选项。

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

    • x - 当前点

    • fval - x 处的目标函数值

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

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

    • temperature - 当前温度,与 x 长度相同的向量

    • iteration - 当前迭代

    • funccount -函数计算的次数

    • t0 - 算法的开始时间

    • k - 退火参数,与 x 长度相同的向量

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

    • 'init' - 初始化状态

    • 'iter' - 迭代状态

    • 'done' - 最终状态

传递额外参数 解释如何向输出函数提供附加参数。

输出函数返回以下参量:

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

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

    • true - 算法在当前迭代终止。

  • options - 由输出函数修改的选项。

  • optchanged - 一个布尔标志,表示对 options 做出了更改。如果选项发生变化,则必须将其设置为 true

显示选项

使用 Display 选项指定在算法运行时在命令行上显示多少信息。可用选项包括

  • off - 没有显示输出。这是从优化应用程序导出的 options 的默认值。

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

  • diagnose - 每次迭代时都会显示信息。此外,诊断还列出了一些问题信息和已从默认值更改的选项。

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

iterdiagnose 都显示以下信息:

  • Iteration - 迭代序号

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

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

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

  • Mean Temperature - 平均温度函数值