输出函数允许您检查优化中的中间结果。此外,它们允许您以编程方式停止求解器。
有两种类型的输出函数,例如输出结构:
全局输出函数在每个局部求解器运行后运行。它们也在全局求解器开始和结束时运行。
局部输出函数在局部求解器的每次迭代之后运行。看到优化工具箱的输出函数.
使用全局输出函数:
使用中描述的语法编写输出函数OutputFcn.
设置OutputFcn
你的属性GlobalSearch
或MultiStart
解算器到输出函数的函数句柄。属性可以使用多个输出函数OutputFcn
属性设置为函数句柄的单元格数组。
这个输出函数停止GlobalSearch
在它找到五个不同的带有正退出标志的局部最小值之后,或者在它找到一个小于的局部最小值之后0.5
.输出函数使用一个持久的局部变量,foundLocal
,以存储本地结果。foundLocal
允许输出函数确定本地解决方案是否不同于其他解决方案,以达到1的军医
.
要使用嵌套函数而不是持久变量存储局部结果,请参见嵌套输出函数的示例.
使用中描述的语法编写输出函数OutputFcn.
function stop = StopAfterFive(optimValues, state) persistent foundLocal stop = false;switch state case 'init' foundLocal = [];%初始化为空的情况'iter' newf = optimValues.localsolution.Fval;eflag = optimValues.localsolution.Exitflag;%现在检查退出标志是否为正数,并且新值与其他值至少相差1e-4 %如果是,如果eflag > 0 && all(abs(newf - foundLocal) > 1e-4) foundLocal = [foundLocal;newf];如果有,则停止,如果foundLocal(end) < 0.5 || length(foundLocal) >= 5 stop = true;结束结束结束
保存StopAfterFive.m
作为MATLAB文件夹中的一个文件®路径。
写出目标函数并创建一个优化问题结构,如寻找全局或多个局部极小值.
函数f = sawtoothxy(x,y) [t r] = cart2pol(x,y);极坐标h = cos(2*t - 1/2)/2 + cos(t) + 2;g = (sin (r) -罪(2 * r) / 2 +罪(3 * r) / 3 -罪(4 * r) / 4 + 4)…。* r。^ 2. / (r + 1);f = g。* h;结束
保存sawtoothxy.m
作为MATLAB路径中的一个文件夹中的文件。
在命令行中,创建问题结构:
问题= createOptimProblem(“fmincon”,…“客观”,@ (x) sawtoothxy (x(1),(2)),…x0,(100、-50),“选项”,…optimoptions (@fmincon、“算法”、“sqp”));
创建一个GlobalSearch
对象与@StopAfterFive
作为输出函数,并将迭代显示属性设置为“通路”
.
@StopAfterFive gs = GlobalSearch(“OutputFcn”,“显示”,“iter”);
(可选)若要获得与本例相同的答案,请设置默认随机数流。
rng违约
运行问题。
[x,fval] = run(gs,problem) Num Pts最佳电流阈值Local Local Analyzed f -count f(x) Penalty Penalty f(x) exitflag2个本地求解器中有1个在本地求解器退出标志为正的情况下运行。X = 0.0414 * 0.1298 fval = 1.5467e-15
跑得早是因为GlobalSearch
找到一个函数值小于的点0.5
.
而MultiStart
可以并行运行,它不支持全局输出函数和绘图函数并行运行。金宝app此外,当本地输出函数和plot函数运行在工人MultiStart
并行运行,其效果不同于连续运行。当在工人上运行时,本地输出和plot函数不会创建显示。在工作人员将其结果传递给客户端之前,您不会看到输出和绘图函数的任何其他影响MultiStart
并行工作)。
查阅有关跑步的资料MultiStart
同时,看到并行计算.