主要内容

基于问题的串行或并行中具有共同函数的目标和约束

这个例子展示了当使用基于问题的方法计算目标和约束的值时,如何避免两次调用一个函数。关于基于求解器的方法,请参见目标约束与非线性约束在同一函数中

通常在模拟中使用这样的函数。求解器通常分别求解目标约束函数和非线性约束函数。当对两个结果使用相同的计算时,这种评估是浪费的。

这个例子也显示了并行计算对求解速度的影响。对于耗时的函数,并行计算可以加快求解速度,因为可以避免在同一点重复调用耗时的函数。同时使用这两种技术可以最大程度地提高求解速度。

创建计算多个数量的耗时函数

computeall函数返回作为目标和非线性约束的一部分的输出。

类型computeall
函数[f1,c1] = computeall(x) c1 = norm(x)²- 1;F1 = 100*(x(2) - x(1)^2)^2 + (1 - x(1)^2;Pause(1) %模拟昂贵的计算结束

函数包括暂停(1)语句来模拟一个耗时的函数。

创建优化变量

这个问题使用了一个四元素优化变量。

x = optimvar (“x”4);

转换函数使用“ReuseEvaluation”

转换computeall函数转换为优化表达式。为了节省优化过程中的时间,请使用“ReuseEvaluation”名称-值对。为节省求解器确定输出表达式大小的时间(这种情况只发生一次),将“OutputSize”名称-值对[1],表明两者fc是标量

[f、c] = fcn2optimexpr (@computeall x,“ReuseEvaluation”,真的,“OutputSize”[1]);

创建目标、约束和问题

创建目标函数f表达式。

x(3) - x(4)^2 + 5*(1 - x(4))^2;

建立非线性不等式约束c表达式。

条件:c <= 0;

创建一个优化问题,包括目标和约束。

概率= optimproblem (“目标”、obj);prob.Constraints.cons =缺点;显示(概率)
OptimizationProblem:解:x最小化:((长度+(20。* x (x(3) -(4) ^ 2)。^ 2))+(5。* (1 - x(4)) ^ 2))地点:[长度~]= computeall (x);subject to cons: arg_LHS <= 0 where: [~,arg_LHS] = computeall(x);

解决问题

从初始点开始监控解决问题所需的时间x0。x = (1; 1; 1; 2)

x0。x = (1; 1; 1; 2);x0。x = x0.x /规范(x0.x);可行起始点Tic [sol,fval,exitflag,output] = solve(prob,x0)
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。> <停止标准细节
索尔=结构体字段:x(4×1双):
fval = 0.7107
exitflag = OptimalSolution
输出=结构体字段:firstderopt: 4.0000e-07 cgiterations:↵Local minimum found that满足约束。↵↵优化完成,因为目标函数在↵可行方向上不减小到最优性容差值内,↵和约束条件满足到约束容差值内。↵↵<停止标准详细信息>↵↵优化完成:相对一阶优化度量,2.909695e-07,↵小于选项。OptimalityTolerance = 1.000000e-06,相对最大约束↵违例,0.000000e+00,小于选项。ConstraintTolerance = 1.000000 e-06。↵↵”解算器:“fmincon”
time1 = toc
time1 = 149.9299

求解所需的秒数刚好超过函数求值的次数,这表明求解器只计算了每个求值一次。

流(“需要求解的秒数为%g,计算点数为%g.\n”、time1 output.funcCount)
解题秒数为149.93,评分点数为149。

如果,相反,你不打电话fcn2optimexpr使用“ReuseEvaluation”,解的时间就翻倍了。

(f2 c2) = fcn2optimexpr (@computeall x,“ReuseEvaluation”、假);methoda = f2 + 20 * x (x (3) - (4) ^ 2) ^ 2 + 5 * (1 - x (4)) ^ 2;stickline (c > = 0, c, 0), colorred;prob2 = optimproblem (“目标”, methoda);prob2.Constraints。cons2 = cons2;Tic [sol2,fval2,exitflag2,output2] = solve(prob2,x0);
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。> <停止标准细节
time2 = toc
time2 = 298.4493

并行处理

如果您拥有Parallel Computing Toolbox™许可证,则可以通过并行计算节省更多时间。为此,设置选项以使用并行处理,并调用解决与选择。

选择= optimoptions(概率,“UseParallel”,真正的);Tic [sol3,fval3,exitflag3,output3] = solve(prob,x0, x0)“选项”、选择);
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。> <停止标准细节
历史问题= toc
历史问题= 74.7043

使用并行处理和“ReuseEvaluation”一起提供比使用更快的解决方案“ReuseEvaluation”一个人。看看单独使用并行处理解决问题需要多长时间。

Tic [sol4,fval4,exitflag4,output4] = solve(prob2,x0, x0)“选项”、选择);
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。> <停止标准细节
time4 = toc
time4 = 145.5278

计时结果总结

将计时结果合并到一个表中。

timingtable =表([time1; time2;历史问题;time4],...“RowNames”,[“串行重用”“没有串行重用”“重用平行”“没有重用平行”])
timingtable =4×1表Var1 ______ Reuse Serial 149.93 No Reuse Serial 298.45 Reuse Parallel 74.704 No Reuse Parallel 145.53

对于这个问题,在一台6核处理器的计算机上,并行计算花费的时间大约是串行计算的一半“ReuseEvaluation”只需要一半的时间“ReuseEvaluation”.并行计算“ReuseEvaluation”大约是串行计算时间的四分之一“ReuseEvaluation”

另请参阅

相关的话题