ドキュメンテーション

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

prob2struct

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

構文

problem = prob2struct(prob)

説明

problem = prob2struct(prob) は、linprogintlinprogquadprog または lsqlin による求解に適した最適化問題構造体を返します。

すべて折りたたむ

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

混合整数線形計画法の基礎: 問題ベースから基本的な 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

入力引数

すべて折りたたむ

最適化問題。OptimizationProblem オブジェクトとして指定します。

出力引数

すべて折りたたむ

問題構造体。intlinprog の構造体problemlinprog の構造体problemquadprog の構造体 problem、または lsqlin の構造体 problem として返されます。

  • 目的関数と制約関数が線形であり、1 つ以上の問題変数が 'integer' 型である場合、problemintlinprog の問題構造体になります。

  • 目的関数と制約関数が線形であり、問題変数に 'integer' 型が含まれていない場合、problemlinprog の問題構造体になります。

  • 制約が線形であり、線形式の二乗和に定数を加算した和が目的関数である場合、problemlsqlin の問題構造体になります。

  • 制約が線形であり、目的関数が一般的な二次式である場合、problemquadprog の問題構造体になります。

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

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

アルゴリズム

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

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

  • x — 3 x 2 x 4 の配列

  • y — 3 行 2 列の配列

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

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

R2017b で導入