模拟退火选项
在命令行设置模拟退火选项
通过使用 options 函数创建 optimoptions 对象来指定选项,如下所示:
options = optimoptions(@simulannealbnd,... 'Param1',value1,'Param2',value2, ...);
本节中的每个选项均按 options 中的字段名称列出。例如 InitialTemperature 引用 options 的对应字段。
绘图选项
绘图选项使您能够在模拟退火求解器运行时绘制其中的数据。
PlotInterval 指定连续调用绘图函数之间的迭代次数。
要在从命令行调用 simulannealbnd 时显示绘图,请将 PlotFcn 的 options 字段设置为内置绘图函数名称或绘图函数的句柄。您可以指定以下任意一个图:
'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- 算法在当前迭代终止。
注意
绘图函数不支持 subplot 语句,因为绘图函数框架管理轴。要指定多个子图,请编写单独的绘图函数,并将其作为元胞数组传递给求解器:
options = optimoptions("solvername",PlotFcn={@plot1,@plot2,@plot3});输出函数支持 subplot,因此您可以使用输出函数代替绘图函数,在一个函数中包含多个绘图。
温度选项
温度选项指定在算法过程中每次迭代时温度如何降低。
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'- 模拟退火接受函数,默认。如果新的目标函数值小于旧的目标函数值,则新的点总是被接受。否则,将根据目标函数值的差异和当前温度的概率随机接受新点。接受概率是其中 Δ = 新目标 - 旧目标,T 是当前温度。由于 Δ 和 T 都为正数,因此接受的概率介于 0 和 1/2 之间。温度越小,接受概率就越小。此外,Δ 越大,接受概率就越小。
@myfun-自定义接受函数,myfun。语法为:其中acceptpoint = myfun(optimValues,newx,newfval);
optimValues是 输出函数的结构 中描述的结构体,newx是被评估为可接受的点,而newfval是newx处的目标函数。acceptpoint是一个布尔值,其值为true表示接受newx,而false表示拒绝newx。
混合函数选项
混合函数是另一个最小化函数,它在求解器迭代期间或迭代结束时运行。HybridInterval 指定调用混合函数的间隔(如果不是 never 或 end)。您可以使用 HybridFcn 选项指定混合函数。选项包括:
[]- 没有混合函数。'fminsearch'- 使用 MATLAB® 函数fminsearch执行无约束最小化。'patternsearch'- 使用patternsearch执行约束或无约束最小化。'fminunc'- 使用 Optimization Toolbox™ 函数fminunc执行无约束最小化。'fmincon'- 使用 Optimization Toolbox 函数fmincon执行约束最小化。
注意
确保您的混合函数接受您的问题约束。否则,simulannealbnd 将引发错误。
您可以为混合函数设置单独的选项。使用 optimset 代替 fminsearch,或使用 optimoptions 代替 fmincon、patternsearch 或 fminunc。例如:
hybridopts = optimoptions('fminunc',... 'Display','iter','Algorithm','quasi-newton');
simulannealbnd options 中包含混合选项如下:options = optimoptions(@simulannealbnd,options,... 'HybridFcn',{@fminunc,hybridopts});
hybridopts 之前,options 必须存在。有关示例,请参阅遗传算法中的混合方案。请参阅 何时使用混合函数。
停止条件选项
停止标准决定导致算法终止的原因。您可以指定以下选项:
FunctionTolerance- 算法运行直到StallIterLim次迭代中目标函数值的平均变化小于FunctionTolerance。默认值为1e-6。MaxIterations- 如果迭代次数超过此最大迭代次数,则算法停止。您可以将最大迭代次数指定为正整数或Inf。Inf是默认值。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创建的选项的默认值。
iter 和 diagnose 都显示以下信息:
Iteration- 迭代序号f-count-目标函数评估的累计次数Best f(x)- 最佳目标函数值Current f(x)- 当前目标函数值Mean Temperature- 平均温度函数值