ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

prob2struct

最適化問題のソルバー形式への変換

説明

problem = prob2struct(prob) は、linprogintlinprogquadproglsqlinfmincon、または fminunc を使用した問題の求解に適した最適化問題構造体を返します。非線形問題の場合、prob2struct は、目的関数用のファイルと、必要に応じて非線形制約関数用のファイルおよびサポート ファイルを作成します。

また、problem = prob2struct(prob,x0) は初期点構造体 x0 を変換し、これを problem に含めます。

problem = prob2struct(___,Name,Value) は、すべての入力引数に対して、1 つ以上の名前と値のペアの引数を使用して追加オプションを指定します。たとえば非線形問題の場合、problem = prob2struct(prob,'ObjectiveFunctionName','objfun1') は、prob2struct が現在のフォルダーに objfun1.m という名前の目的関数ファイルを作成することを指定します。

すべて折りたたむ

最適化問題オブジェクトを問題構造体に変換します。

混合整数線形計画法の基礎: 問題ベースから基本的な MILP 問題を入力します。

ingots = optimvar('ingots',4,1,'Type','integer','LowerBound',0,'UpperBound',1);
alloys = optimvar('alloys',4,1,'LowerBound',0);

weightIngots = [5,3,4,6];
costIngots = weightIngots.*[350,330,310,280];
costAlloys = [500,450,400,100];
cost = costIngots*ingots + costAlloys*alloys;

steelprob = optimproblem;
steelprob.Objective = cost;

totalweight = weightIngots*ingots + sum(alloys);

carbonIngots = [5,4,5,3]/100;
molybIngots = [3,3,4,4,]/100;
carbonAlloys = [8,7,6,3]/100;
molybAlloys = [6,7,8,9]/100;

totalCarbon = (weightIngots.*carbonIngots)*ingots + carbonAlloys*alloys;
totalMolyb = (weightIngots.*molybIngots)*ingots + molybAlloys*alloys;

steelprob.Constraints.conswt = totalweight == 25;
steelprob.Constraints.conscarb = totalCarbon == 1.25;
steelprob.Constraints.consmolyb = totalMolyb == 1.25;

問題を intlinprog 問題構造体に変換します。

problem = prob2struct(steelprob);

結果として得られる線形等式制約の行列とベクトルを検証します。

Aeq = problem.Aeq
Aeq = 
   (1,1)       1.0000
   (2,1)       0.0800
   (3,1)       0.0600
   (1,2)       1.0000
   (2,2)       0.0700
   (3,2)       0.0700
   (1,3)       1.0000
   (2,3)       0.0600
   (3,3)       0.0800
   (1,4)       1.0000
   (2,4)       0.0300
   (3,4)       0.0900
   (1,5)       5.0000
   (2,5)       0.2500
   (3,5)       0.1500
   (1,6)       3.0000
   (2,6)       0.1200
   (3,6)       0.0900
   (1,7)       4.0000
   (2,7)       0.2000
   (3,7)       0.1600
   (1,8)       6.0000
   (2,8)       0.1800
   (3,8)       0.2400

beq = problem.beq
beq = 3×1

   25.0000
    1.2500
    1.2500

範囲を検証します。

problem.lb
ans = 8×1

     0
     0
     0
     0
     0
     0
     0
     0

problem.ub
ans = 8×1

   Inf
   Inf
   Inf
   Inf
     1
     1
     1
     1

intlinprog を呼び出して問題を解きます。

x = intlinprog(problem)
LP:                Optimal objective value is 8125.600000.                                          

Cut Generation:    Applied 3 mir cuts.                                                              
                   Lower bound is 8495.000000.                                                      
                   Relative gap is 0.00%.                                                          


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap
tolerance of the optimal value, options.AbsoluteGapTolerance = 0 (the default
value). The intcon variables are integer within tolerance,
options.IntegerTolerance = 1e-05 (the default value).
x = 8×1

    7.2500
         0
    0.2500
    3.5000
    1.0000
    1.0000
         0
    1.0000

問題ベース フレームワークで非線形問題を作成します。

x = optimvar('x',2);
fun = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
prob = optimproblem('Objective',fun);
mycon = dot(x,x) <= 4;
prob.Constraints.mycon = mycon;
x0.x = [-1;1.5];

prob を最適化問題構造体に変換します。生成された目的関数ファイルに 'rosenbrock'、制約関数ファイルに 'circle2' という名前を付けます。

problem = prob2struct(prob,x0,'ObjectiveFunctionName','rosenbrock',...
    'ConstraintFunctionName','circle2');

prob2struct は、現在のフォルダーに非線形目的関数ファイルと非線形制約関数ファイルを作成します。これらのファイルを別のフォルダーに作成するには、名前と値のペア 'FileLocation' を使用します。

問題を解きます。

[x,fval] = fmincon(problem)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x = 2×1

    1.0000
    1.0000

fval = 4.6241e-11

入力引数

すべて折りたたむ

最適化問題。OptimizationProblem オブジェクトとして指定します。optimproblem を使用して問題を作成します。

例: prob = optimproblem; prob.Objective = obj; prob.Constraints.cons1 = cons1;

初期点。prob の変数名に等しいフィールド名をもつ構造体として指定します。

名前付きインデックス変数と共に x0 を使用する例については、名前付きインデックス変数による最適化の初期点の作成を参照してください。

例: prob に変数 xy がある場合: x0.x = [3,2,17]; x0.y = [pi/3,2*pi/3]

データ型: struct

名前と値のペアの引数

引数 Name,Value のオプションのコンマ区切りペアを指定します。Name は引数名、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順番で指定できます。

例: problem = prob2struct(prob,'FileLocation','C:\Documents\myproblem')

prob2struct によって作成された非線形制約関数ファイルの名前。'ConstraintFunctionName' とファイル名で構成されるコンマ区切りのペアとして指定します。この引数は、fmincon または fminunc 問題に適用されます。problem を参照してください。ファイル拡張子 .m をファイル名に含めないでください。prob2struct はファイルの作成時にファイル拡張子を追加します。

ConstraintFilename を指定しない場合、prob2struct'generatedConstraints.m' を上書きします。FileLocation を指定しない場合、prob2struct は現在のフォルダーにファイルを作成します。

返される problem 構造体はこの関数ファイルを参照します。

例: "mynlcons"

データ型: char | string

生成されたファイル (目的関数ファイル、制約関数ファイル、その他のサブ関数ファイル) の場所。'FileLocation' と書き込み可能なフォルダーへのパスで構成されるコンマ区切りのペアとして指定します。生成されたすべてのファイルはこのフォルダーに保存されます。複数のフォルダーはサポートされていません。

例: 'C:Documents\MATLAB\myproject'

データ型: char | string

prob2struct によって作成された目的関数ファイルの名前。'ObjectiveFunctionName' とファイル名で構成されるコンマ区切りのペアとして指定します。この引数は、fmincon または fminunc 問題に適用されます。problem を参照してください。ファイル拡張子 .m をファイル名に含めないでください。prob2struct はファイルの作成時にファイル拡張子を追加します。

ObjectiveFilename を指定しない場合、prob2struct'generatedObjective.m' を上書きします。FileLocation を指定しない場合、prob2struct は現在のフォルダーにファイルを作成します。

返される problem 構造体はこの関数ファイルを参照します。

例: "myobj"

データ型: char | string

最適化オプション。'Options'optimoptions によって作成された options オブジェクトで構成されるコンマ区切りのペアとして指定します。適切なソルバーのオプションを作成します。problem を参照してください。

例: optimoptions('fmincon','PlotFcn','optimplotfval')

出力引数

すべて折りたたむ

問題構造体。intlinprog problem 構造体、linprog problem 構造体、quadprog problem 構造体、lsqlin problem 構造体、fmincon problem 構造体、または fminunc problem 構造体として返されます。

目的関数と制約のタイプ (範囲を含む線形制約)

結果として得られる問題のタイプ

線形目的関数と線形制約関数。

少なくとも 1 つの問題変数が 'integer' 型。

intlinprog

線形目的関数と線形制約関数。

'integer' 型の問題変数がない。

linprog

線形制約関数。

目的関数が線形式の二乗和と定数の和。

lsqlin

線形制約関数。

一般的な二次目的関数。

quadprog

一般的な非線形目的関数。

制約なし。

fminunc

一般的な非線形目的関数で、少なくとも 1 つの任意のタイプの制約がある。

または、少なくとも 1 つの一般的な非線形制約関数がある。

fmincon

メモ

非線形問題の場合、prob2struct は、目的関数用の関数ファイルと、非線形制約関数用の関数ファイルを作成します。サポート関数を呼び出す目的関数と制約関数の場合、prob2struct はサポート関数ファイルも作成し、FileLocation フォルダーに保存します。

線形問題および二次問題の場合、問題構造体には、目的関数の加法定数を表す追加フィールド f0 が含まれます。指定したソルバーを使用して問題構造体を解く場合、返される目的関数値に f0 の値は含まれません。関数 solve を使用してprob を解く場合、返される目的関数値には f0 値が含まれます。

probObjectiveSense'max' または 'maximize' である場合、ソルバーが最小化を行うため、problem では prob の目的関数の負の値が使用されます。最大化を行うため、ソルバーは元の目的関数の負の値を最小化します。この場合、ソルバーから報告される最適な関数値は、元の問題に対する負の値です。詳細は、目的関数の最大化を参照してください。最大化問題では lsqlin を使用できません。

ヒント

  • 非線形問題に対して同じ MATLAB® セッションで prob2struct を複数回呼び出す場合、ObjectiveFunctionName と、適切な場合は名前と値のペアの引数 ConstraintFunctionName を使用します。一意の名前を指定することによって、結果として得られる問題構造体が正しい目的関数と制約関数を参照するようになります。そうでない場合、これ以降 prob2struct を呼び出すと、生成される非線形関数ファイルによって既存のファイルが上書きされる可能性があります。

  • 無限再帰の発生を回避するには、目的関数または制約関数内で prob2struct を呼び出さないようにします。

  • 非線形問題に対して prob2struct を並列で呼び出す場合、結果として得られる目的関数ファイルと制約関数ファイルが一意の名前を持つようにします。そうすることで、ループの各パスで同じファイルへの書き込みが回避されます。

アルゴリズム

問題構造体の基本は、単一ベクトルにおけるすべての問題変数の暗黙の順序付けです。問題変数の順序は、probVariables プロパティの順序と同じです。詳細は、OptimizationProblem を参照してください。varindex を使用して順序を確認することもできます。

たとえば、問題変数が次の順序であるとします。

  • x — 3 x 2 x 4 の配列

  • y — 3 行 2 列の配列

この場合、暗黙の変数順序は、問題変数が vars = [x(:);y(:)] である場合と同じになります。

vars の合計 30 個の要素のうち、最初の 24 個の要素は x(:) に相当し、次の 6 個の要素は y(:) に相当します。下限と上限はこの変数順序に対応し、各線形制約行列には 30 の列があります。

一般的な非線形目的関数または制約関数を含む問題の場合、prob2struct は、現在のフォルダー、または FileLocation によって指定されたフォルダーに関数ファイルを作成します。返される problem 構造体はこれらの関数ファイルを参照します。

R2017b で導入