最適化モデルのデータからの分離
拡張および再利用可能な最適化問題を得るには、問題のデータをモデル構造から分離する方法で問題を作成します。
いくつかの製品について多期間にわたるスケジュール設定問題があるとします。ベクトル 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);
期間または製品を後で変更するには、periods
と products
のデータのみを変更すれば済みます。その後、同じコードを実行して、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);
この方法では、データ サイズを変更したとしても、costPerYear
と totalCost
を作成するステートメントは変わりません。つまり、柔軟性を維持し、再利用可能にするために、データ サイズがハードコードされたステートメントを使用しないでください。以下に例を示します。
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