Main Content

最適化モデルのデータからの分離

拡張および再利用可能な最適化問題を得るには、問題のデータをモデル構造から分離する方法で問題を作成します。

いくつかの製品について多期間にわたるスケジュール設定問題があるとします。ベクトル periods には期間が含まれ、string ベクトル products には製品が含まれます。

periods = 1:10;
products = ["strawberry","cherry","red grape",...
    "green grape","nectarine","apricot"];

各期間で使用される製品数を表す変数を作成するには、データからサイズを取得するステートメントを使用します。以下に例を示します。

usage = optimvar('usage',length(periods),products,...
    'Type','integer','LowerBound',0);

期間または製品を後で変更するには、periodsproducts のデータのみを変更すれば済みます。その後、同じコードを実行して、usage を作成できます。

つまり、柔軟性を維持し、再利用可能にするために、データ サイズがハードコードされたステートメントを使用しないでください。以下に例を示します。

usage = optimvar('usage',10,6,... % DO NOT DO THIS
    'Type','Integer','LowerBound',0);

式にも変数と同じ考慮事項を適用できます。サイズが length(periods)length(products) 列のデータ行列 costs に製品のコストが含まれているとします。有効なデータをシミュレートするには、適切なサイズのランダムな整数行列を作成します。

rng default % For reproducibility
costs = randi(8,length(periods),length(products));

データからサイズを取得するコストの式を作成することをお勧めします。

costPerYear = sum(costs.*usage,2);
totalCost = sum(costPerYear);

この方法では、データ サイズを変更したとしても、costPerYeartotalCost を作成するステートメントは変わりません。つまり、柔軟性を維持し、再利用可能にするために、データ サイズがハードコードされたステートメントを使用しないでください。以下に例を示します。

costPerYear = optimexpr(10,1); % DO NOT DO THIS
totalcost = 0;
for yr = 1:10 % DO NOT DO THIS
    costPerYear(i) = sum(costs(i,:).*usage(i,:));
    totalcost = totalcost + costPerYear(i);
end

関連するトピック