このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
共通の関数を持目的関数と制約の逐次評価または並列評価,問題ベス
この例では,問題ベースのアプローチを使用して,目的関数と制約の両方に対して値を計算する場合に関数を2回呼び出すことを回避する方法を説明します。ソルバベスのアプロチにいては,同じ関数における目的と非線形制約を参照してください。
このような関数は一般にシミュレ,ションで使用されます。ソルバ,では通常,目的関数と非線形制約関数が別々に評価されます。両方の結果に対して同じ計算を使用する場合は,この評価は無駄なものです。
この例では,並列計算がソルバ,の速度にもたらす効果に,いても説明します。時間のかかる関数の場合,並列計算を使用すると同じ点で時間のかかる関数を繰り返し呼び出さなくてもよいため,ソルバーを高速化することができます。両方の手法を一緒に使用することによって,ソルバ,が最大限に高速化されます。
複数の量を計算する時間のかかる関数の作成
関数computeall
は,目的関数と非線形制約の一部である出力を返します。
类型computeall
函数[f1,c1] = computeall(x) c1 = norm(x)^2 - 1;F1 = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;暂停(1)%模拟昂贵的计算结束
この関数には,時間のかかる関数のシミュレ,ションを行うために,暂停(1)
ステ,トメントが含まれています。
最適化変数の作成
この問題では,4要素の最適化変数を使用します。
X = optimvar(“x”4);
“ReuseEvaluation”
を使用した関数の変換
関数computeall
を最適化式に変換します。最適化にかかる時間を短縮するには,名前と値のペア“ReuseEvaluation”
を使用します。ソルバが出力式のサズを決定する(1回のみ行われる)時間を短縮するには、名前と値のペア“OutputSize”
を[1]
に設定し,f
とc
の両方がスカラ,であることを示します。
[f,c] = fcn2optimexpr(@computeall,x,“ReuseEvaluation”,真的,“OutputSize”[1]);
目的関数,制約,および問題の作成
式f
から目的関数を作成します。
Obj = f + 20*(x(3) - x(4)²)²+ 5*(1 - x(4))²;
式c
から非線形不等式制約を作成します。
Cons = c <= 0;
最適化問題を作成し,目的関数と制約を含めます。
问题=优化问题(“目标”、obj);probo . constraints .cons = cons;显示(概率)
OptimizationProblem:解:x最小化:((长度+(20。* x (x(3) -(4) ^ 2)。^ 2))+(5。* (1 - x(4)) ^ 2))地点:[长度~]= computeall (x);where: [~,arg_LHS] = computeall(x);
問題を解く
初期点x0。X = [-1;1;1;2]
から始めて,問題を解くのにかかる時間を監視します。
x0。X = [-1;1;1;2];x0。X = xx . X /norm(xx . X);%可行起始点Tic [sol,fval,exitflag,output] = solve(prob,x0)
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。<停止条件详细信息>
索尔=带字段的结构:X: [4×1 double]
Fval = 0.7107
exitflag = OptimalSolution
输出=带字段的结构:迭代:25 funcCount: 149 constrviolation: 0 stepsize: 1.2914e-07 algorithm: ' internal -point' firstorderopt: 4.0000 -07 cgiterations: 7 message: '(发现满足约束的局部最小值)。(()优化完成,因为目标函数在()可行方向上不下降,直到最优性公差的值之内,()且约束条件满足到约束公差的值之内。(0) <停止条件详细信息>(完成优化):相对一阶最优性度量2.909695e-07,(0)小于选项。OptimalityTolerance = 1.000000e-06,相对最大约束(违例)为0.000000e+00,小于选项。约束容忍= 1.000000e-06。(() '求解器:'fmincon'
Time1 = toc
Time1 = 149.9299
求解にかかる秒数は,関数評価の回数をわずかに超える程度です。これは,ソルバ,が各評価で一度だけ計算したことを示します。
流(“解决的秒数为%g,评估点的数量为%g。\n”、time1 output.funcCount)
求解秒数为149.93秒,评估点数为149点。
代わりに,“ReuseEvaluation”
を使用してfcn2optimexpr
を呼び出さない場合,求解の所要時間が2倍になります。
[f2,c2] = fcn2optimexpr(@computeall,x,“ReuseEvaluation”、假);methoda = f2 + 20 * x (x (3) - (4) ^ 2) ^ 2 + 5 * (1 - x (4)) ^ 2;con2 = c2 <= 0;Prob2 =优化问题(“目标”, methoda);prob2.Constraints。con2 = con2;Tic [sol2,fval2,exitflag2,output2] = solve(prob2,x0);
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。<停止条件详细信息>
Time2 = toc
Time2 = 298.4493
並列処理
并行计算工具箱™のライセンスをお持ちの場合は,並列計算によって時間をさらに短縮できます。これを行うには,並列処理を使用するようにオプションを設定し,オプションを指定して解决
を呼び出します。
选项= optimoptions(问题,“UseParallel”,真正的);Tic [sol3,fval3,exitflag3,output3] = solve(prob,x0,“选项”、选择);
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。<停止条件详细信息>
Time3 = toc
Time3 = 74.7043
並列処理と“ReuseEvaluation”
を一緒に使用することで,“ReuseEvaluation”
のみを使用する場合より求解を高速化できます。並列処理のみを使用して問題を解くのにかかる時間は次のとおりです。
Tic [sol4,fval4,exitflag4,output4] = solve(prob2,x0,“选项”、选择);
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。<停止条件详细信息>
Time4 = toc
Time4 = 145.5278
時間測定の結果の要約
時間測定の結果を1表に結合します。
Timingtable = table([time1;time2;time3;time4],...“RowNames”, (“串行重用”;“不可重复使用系列”;“重用平行”;“无重用并行”])
timingtable =4×1表Var1 ______复用串行149.93无复用串行298.45复用并行74.704无复用并行145.53
この問題では6コアプロセッサを搭載したコンピューターで並列計算を行った場合,所要時間は逐次計算の約半分になります。“ReuseEvaluation”
を使用して計算を行った場合,所要時間は“ReuseEvaluation”
を使用せずに計算する場合の約半分になります。“ReuseEvaluation”
を使用した並列計算の所要時間は,“ReuseEvaluation”
を使用しない逐次計算の約4分の1になります。