主要内容

目标和约束有一个串行或并行的常见功能,具体问题具体分析

这个例子展示了如何避免两次调用函数时计算值为目标和约束使用具体问题具体分析的方法。solver-based方法,请参阅客观和非线性约束在同一功能

您通常使用这样一个函数在一个模拟世界中。解决者通常单独评估目标和非线性约束函数。这个评价是浪费时都使用相同的计算结果。

这个示例还显示在解决并行计算速度的影响。耗时的函数,计算并行可以速度解算器,可以避免反复调用耗时的函数在同一点。结合使用这两种技术的速度解算器最多的人。

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

computeall函数返回输出的客观和非线性约束。

类型computeall
函数[f1, c1 = computeall c1 =规范(x) (x) ^ 2 - 1;f1 = 100 * (x (2) - (1) ^ 2) ^ 2 + (1 - x (1)) ^ 2;暂停(1)%昂贵的模拟计算

功能包括一个暂停(1)模拟一个耗时的函数声明。

创建优化变量

这个问题使用一个研制出优化变量。

x = optimvar (“x”4);

转换函数使用“ReuseEvaluation”

转换computeall函数表达式的优化。在优化节省时间,使用“ReuseEvaluation”名称-值对。节省时间的解算器来确定输出表达式大小(这只发生一次),设置“OutputSize”名称-值对[1],这表明两fc是标量

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

创建目标、约束和问题

创建的目标函数f表达式。

obj = f + 20 * x (x (3) - (4) ^ 2) ^ 2 + 5 * (1 - x (4)) ^ 2;

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

缺点= c < = 0;

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

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

解决问题

监控时间从起始点开始解决这个问题x0。x = (1; 1; 1; 2)

x0。x = (1; 1; 1; 2);x0。x = x0.x /规范(x0.x);%可行的初始点抽搐(溶胶,fval、exitflag、输出)=解决(x0概率)
使用fmincon解决问题。局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。<停止标准细节>
索尔=结构体字段:x(4×1双):
fval = 0.7107
exitflag = OptimalSolution
输出=结构体字段:迭代:25 funcCount: 149 constrviolation: 0 stepsize: 1.2914 e-07算法:“内点”firstorderopt: 4.0000 e-07 cgiterations: 7日消息:“↵局部最小值发现,满足约束。↵↵优化完成,因为目标函数中引入↵可行的方向,在最优值的宽容,↵和约束满足约束的值公差内。↵↵<停止标准细节>↵↵优化完成:相对一阶最优性措施,2.909695 e-07↵小于选项。OptimalityTolerance = 1.000000 e-06,相对最大约束↵违反,0.000000 e + 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;cons2 = c2 < = 0;prob2 = optimproblem (“目标”,methoda);prob2.Constraints。cons2 = cons2;(sol2抽搐,fval2、exitflag2 output2] =解决(x0 prob2);
使用fmincon解决问题。局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。<停止标准细节>
time2 = toc
time2 = 298.4493

并行处理

如果你有一个并行计算工具箱™许可,你可以节省更多的时间并行计算。为此,设置选项使用并行处理,电话解决与选择。

选择= optimoptions(概率,“UseParallel”,真正的);(sol3抽搐,fval3、exitflag3 output3] =解决(x0,概率“选项”、选择);
使用fmincon解决问题。局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。<停止标准细节>
历史问题= toc
历史问题= 74.7043

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

(sol4抽搐,fval4、exitflag4 output4] =解决(x0, prob2“选项”、选择);
使用fmincon解决问题。局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。<停止标准细节>
time4 = toc
time4 = 145.5278

计时结果的总结

结合成一个表的计时结果。

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

这个问题,在电脑上6-core处理器并行计算耗时大约一半的串行计算,和计算“ReuseEvaluation”花一半的时间计算“ReuseEvaluation”。并行计算与“ReuseEvaluation”需要大约四分之一的时间计算的序列没有“ReuseEvaluation”

另请参阅

相关的话题