模拟退火选项
在命令行设置模拟退火选项
通过使用 optimoptions
函数创建 options
对象来指定选项,如下所示:
options = optimoptions(@simulannealbnd,... 'Param1',value1,'Param2',value2, ...);
本节中的每个选项均按 options
中的字段名称列出。例如 InitialTemperature
引用 options
的对应字段。
绘图选项
绘图选项使您能够在模拟退火求解器运行时绘制其中的数据。
PlotInterval
指定连续调用绘图函数之间的迭代次数。
要在从命令行调用 simulannealbnd
时显示绘图,请将 options
的 PlotFcn
字段设置为内置绘图函数名称或绘图函数的句柄。您可以指定以下任意一个图:
'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'
- 模拟退火接受函数,默认。如果新的目标函数值小于旧的目标函数值,则新的点总是被接受。否则,将根据目标函数值的差异和当前温度的概率随机接受新点。接受概率是其中 Δ = 新目标 - 旧目标,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});
options
之前,hybridopts
必须存在。有关示例,请参阅遗传算法中的混合方案。请参阅 何时使用混合函数。
停止条件选项
停止标准决定导致算法终止的原因。您可以指定以下选项:
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
- 平均温度函数值