主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

最適化問題の確認または変更

显示またはを使用した問題の確認

最適化問題を作成した後,显示を使用してその定式化を確認できます。大規模な問題の場合は,代わりにを使用します。たとえば,

概率= optimproblem;x = optimvar (' x ' 2下界,0);概率。目标= x(1) - 2*x(2);prob.Constraints。con1 = x(1) + 2*x(2) <= 4;prob.Constraints。con2 = -x(1) + x(2) <= 1;显示(概率)
优化问题:求解:x最小化:x(1) - 2*x(2) subject to con1: x(1) + 2*x(2) <= 4 subject to con2: -x(1) + x(2) <= 1 variable bounds: 0 <= x(1) 0 <= x(2)

この確認では,問題が最小化であるか最大化であるか,変数の範囲など,問題の基本要素が示されます。確認では,変数で使用されているインデックス名があれば,その名前が表示されます。確認では,変数が整数値であるかどうかは表示されません。

既定のソルバーまたはオプションの変更

解または計算速度を改善するには,既定のソルバーまたはオプションを調べて変更します。

既定のソルバーおよびオプションを確認するには,optimoptions(概率)を使用します。たとえば,

rng默认x = optimvar('x',3,'LowerBound',0);expr =总和((兰德(3,1)。* x) ^ 2);概率= optimproblem(“目标”,expr);= sum(sum(randn(size(x)).*x)) <= randn;选项= optimoptions(概率)
options = lsqlin options: options by current Algorithm (' internal -point'):(其他可用算法:'trust-region-reflective')设置属性:没有设置选项。默认属性:Algorithm: 'interior-point' constraintolerance: 1.0000e-08 Display: 'final' LinearSolver: 'auto' MaxIterations: 200 OptimalityTolerance: 1.0000e-08 StepTolerance: 1.0000e-12显示当前算法('interior-point')没有使用的选项。

この問題の既定ソルバーはlsqlinです。また,既定のオプションがわかります。

ソルバーを変更するには,解决で名前と値のペア“规划求解”を設定します。異なるソルバーで使用できるオプションを確認するには,optimoptionsを使用して現在のオプションを別のソルバーに渡します。たとえば,問題を続行します。

选项= optimoptions(“quadprog”选项)
设置属性:constraintolerance: 1.0000e-08 MaxIterations: 200 OptimalityTolerance: 1.0000e-08 StepTolerance: 1.0000e-12默认属性:Algorithm: 'interior-point-凸'显示:'final' LinearSolver: 'auto'显示当前算法未使用的选项('interior-point-凸')

オプションを変更するには,optimoptionsまたはドット表記を使用してオプションを設定し,名前と値のペア“选项”でオプションを解决に渡します。詳細は,一般的に使用されるオプション:調整とトラブルシューティングを参照してください。例を続けます。

选项。显示=“iter”;索尔=解决(问题,选项,选择,“解决”,“quadprog”);
Iter Fval Primal infas Dual infas (e+00 3.068423e-01 2.275437e+00 2.500000e-01 1 1.728717e-01 0.000000e+00 7.719860e-03 3.637874e-02 2 2.604108e-02 0.000000e+00 0.000000e+00 5.245260e-03 3 7.822161e-03 0.000000e+00 2.775558e-17 1.407915e-03 4 2.909218e-03 0.000000e+00 6.938894e-18 2.070784e-04 5 1.931264e-03 0.000000e+001.734723e-18 2.90772424e -05 6 1.797508e-03 0.000000e+00 2.602085e-18 4.083167e-06 7 1.775398e-03 0.000000e+00 4.336809e-19 5.102453e-07 8 1.772971e-03 0.000000e+00 2.632684e-19 3.064243e-08 9 1.772848e-03 0.000000e+00 5.228973e-19 4.371356e-11发现满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。

指定を間違えた問題の修正

問題が正しいことを確認するには,そのあらゆる面について検討します。たとえば,次のスクリプトを実行して、数独問題を解く最適化問題を作成します。

x = optimvar (9 ' x ', 9日,9日下界,0,' UpperBound ', 1);Cons1 = sum(x,1) == 1;Cons2 = sum(x,2) == 1;con3 = sum(x,3) == 1;概率= optimproblem;prob.Constraints。cons1 = cons1;prob.Constraints。cons2 = cons2;prob.Constraints。cons3 = cons3;mul = 1 (1, 1, 9);mul = cumsum (mul 3); prob.Objective = sum(sum(sum(x,1),2).*mul); cons4 = optimconstr(3,3,9); for u = 1:3 for v = 1:3 arr = x(3*(u-1)+1:3*(u-1)+3,3*(v-1)+1:3*(v-1)+3,:); cons4(u,v,:) = sum(sum(arr,1),2) <= ones(1,1,9); end end prob.Constraints.cons4 = cons4; B = [1,2,2; 1,5,3; 1,8,4; 2,1,6; 2,9,3; 3,3,4; 3,7,5; 4,4,8; 4,6,6; 5,1,8; 5,5,1; 5,9,6; 6,4,7; 6,6,5; 7,3,7; 7,7,6; 8,1,4; 8,9,8; 9,2,3; 9,5,4; 9,8,2]; for u = 1:size(B,1) x.LowerBound(B(u,1),B(u,1),B(u,1)) = 1; end

このスクリプトには,変数,目的,制約を調べることで見つけることができるいくつかのエラーがあります。最初に,変数xを調べます。

x
x = 9×9×9 OptimizationVariable array with properties: array wide properties: Name: 'x' Type: 'continuous' IndexNames: {{} {}} Elementwise properties: LowerBound: [9×9×9 double] UpperBound: [9×9×9 double]参见variables with show。见bounds with showbounds。

この表示は,変数の型が連続であることを示しています。変数は整数値でなければなりません。型を変更します。

x.Type =“整数”
x = 9×9×9 OptimizationVariable array with properties: array wide properties: Name: 'x' Type: 'integer' IndexNames: {{} {}} Elementwise properties: LowerBound: [9×9×9 double] UpperBound: [9×9×9 double]参见variables with show。见bounds with showbounds。

範囲を確認します。Bの各行に1つずつ,値1の下限が21個存在していなければなりません。xは大規模な配列であるため,範囲をコマンドラインに表示する代わりに,ファイルに書き込みます。

writebounds (x,“xbounds.txt”

ファイルxbounds.txt1 < =のすべてのインスタンスを検索します。値1の下限は,変数x (1, 1, 1)x (2, 2, 2)、……x (9, 9, 9)内の9つのみです。この不一致を調べるには,下限を設定しているコードを調べます。

u = 1:尺寸(B, 1) x.LowerBound (B (u, 1), B (u, 1), B (u, 1)) = 1;结束

ループ内の行は,x.LowerBound (B (u, 1)、B (u, 2), B (u, 3)) = 1;でなければなりません。すべての下限をゼロにリセットしてから、修正したコードを実行します。

x.LowerBound = 0;u = 1:尺寸(B, 1) x.LowerBound (B (u, 1), B (u, 2), B (u, 3)) = 1;结束writebounds (x, xbounds.txt)

今度は,xbounds.txtに,正しい個数の値1の下限エントリが存在します。

目的関数を調べます。目的関数の式は大規模なため,式をファイルに書き込みます。

写(概率。目标,“objectivedescription.txt”
x (1 1 1) + (2, 1, 1) + x(3、1,1)+ (4 1 1)+ x(5、1、1)+ (6,1,1)+ x (7, 1, 1) + (8, 1, 1) + x (9, 1, 1) + x(1、2、1)+ (2 2 1)+ x (3,2,1) + x(4、2、1)+ (2,1)+ x(6 2…9 * x (7 8 9) + 9 * x (8 8 9) + 9 * x (9, 8, 9) + 9 * x (1 9 9) + 9 * x(2、9、9)+ 9 * x(3、9、9)+ 9 * x(4、9、9)+ 9 * x (5 9 9) + 9 * x (6 9 9) + 9 * x (7 9 9) + 9 * x(8、9、9)+ 9 * x (9, 9, 9)

目的関数は,スカラー式の和であるため妥当に見えます。

調べるために,制約をファイルに書き込みます。

写(prob.Constraints.cons1“cons1.txt”)写(prob.Constraints.cons2“cons2.txt”)写(prob.Constraints.cons3“cons3.txt”)写(prob.Constraints.cons4“cons4.txt”

cons4.txtを確認すると,間違いがわかります。すべての制約が、等式ではなく不等式です。この制約を作成しているコード行を修正し、修正した制約を問題に含めます。

cons4 = optimconstr(3、3、9);为u = 1:3 v = 1:3 arr = x (3 * (u-1) + 1:3 * (u-1) + 3, 3 *(它们)+ 1:3 *(它们)+ 3:);con4 (u,v,:) = sum(sum(arr,1),2) == ones(1,1,9);结束prob.Constraints结束。cons4 = cons4;

これらの変更の後,問題を正常に解くことができます。

索尔=解决(问题);x =圆(sol.x);y = 1(大小(x));For k = 2:9 y(:,:,k) = k;每个深度k结束S = x.*y的%乘法器;%乘以每个条目的深度% S是9乘9的,持有已解决的谜题。

変数名の重複

変数を作成し直していても,古い変数を使用する式が既に存在する場合,式を単一の問題に組み込んだときにエラーが発生することがあります。詳細は,変数名の重複は許可されないを参照してください。

参考

|||||||

関連するトピック