MATLABで数理計画(最適化)を行う場合、”Optimize ToolBox”必要になる。
MATLABで”EXCEL①”で記載したモデルで求解してみる。
【問題:条件】
一週間の製造計画について考えます。(土曜日から金曜日)
出荷は翌日朝から実施するため、前日に必要量を製造する。
翌週のために金曜日の貯蔵量を守る。
目的:製造量を最小化
説明変数:製造量
制約条件:
・製造量 ≦ 一日の最大製造量
・製造量 ≧ 一日の最小製造量
・貯蔵量 ≦ 貯蔵できる最大量
・貯蔵量 ≧ 翌日の出荷量
・最終貯蔵量 ≧ 翌週のための貯蔵量
貯蔵量 = 前日の貯蓄量+製造量-出荷量
まずは、説明変数を定義しますが、EXCELの時のように自動計算(貯蔵量)はしてくれないので、貯蔵量も説明変数として考えます。
①貯蔵量 Xhld
②製造量 Xgen
MatLABでは、連続した配列で定義するため上記は”Xという名前の配列”として考える。
Xhld → X[1:7]
Xgen → X[8:14]
下記はパラメータ(固定値)として考えます。
①出荷量 Output
②前週金曜日の貯蔵量 Before
③来週の金曜日の貯蔵予定量 After
④最大製造量 MaxGen
⑤最小製造量 MinGen
⑥最大貯蔵量 MaxHld
本来であれば、引数などで汎用性を持たせるのが普通だが、ここでは固定とする。
Mファイル(スプリプ)として作成します。
我流のため、良い書き方ではないかもしれません。
sample.m
% Xhld 1-7
% Xgen 8-14
%% 固定データの定義
Output = [100, 150, 0, 300, 0, 400, 200];
Before = 200;
After = 100;
MaxGen = 300;
MinGen = 0;
MAXHld = 500;
%% 上下限範囲設定
MAX(1:14,1) = zeros(14,1);
MAX(1:7,1) = MAXHld;
MAX(8:14,1) = MaxGen;
MIN(1:14,1) = zeros(14,1);
MIN(1:6,1) = 0;
MIN(7,1) = After;
MIN(8:14,1) = 0;
%% 目的関数
F=zeros(14,1);
F(8:14,1) = 1
%% 整数制約
INT=1:14;
%% 等式制約
eqA=zeros(7,14);
eqB=zeros(7,1);
% 貯蔵量制約
eqA(1,1) = -1;
eqA(1,8) = 1;
eqB(1)=Output(1) - Before;
for c=2:7
eqA(c,c) = -1;
eqA(c,7+c) = 1;
eqA(c,6+c) = 1;
eqB(c)=Output(c);
end
%% 不等式制約
A=zeros(6,14);
B=zeros(6,1);
% 翌日の出荷量制約
for c=1:6
A(c,c) = -1;
B(c) = -Output(c+1);
end
x = intlinprog(F,INT,A,B,eqA,eqB,MIN,MAX);
上側が貯蔵量、下側が製造量
EXCELの場合と最小値は同じですが、説明変数の値が異なることが分かります。