ある会社が2つの製品(XとY)を2台の機械(AとB)を使って製造しています。Xの1単位を生産するには、機械Aで50分、機械Bで30分の処理時間が必要です。Yの1単位を生産するには、機械Aで24分、機械Bで33分の処理時間が必要です。
今週の始めの時点で、在庫にはX製品が30単位、Y製品が90単位あります。今週の機械Aの利用可能な処理時間は40時間、機械Bは35時間と予測されています。
今週のX製品の需要は75単位、Y製品の需要は95単位と予測されています。会社の方針は、週末時点でのXとY製品の在庫単位数の合計を最大化することです。
1: 今週、各製品をどれだけ製造するかを決定する問題を線形計画問題として定式化してください。
2: この線形計画問題をglpkを用いて解いてください。
決定変数:
最大化 Z = (x + 30 - 75) + (y + 90 - 95) = x + y - 50
制約条件:
1. 機械Aの処理時間制約: 50x + 24y ≤ 2400 (40時間 = 2400分)
2. 機械Bの処理時間制約: 30x + 33y ≤ 2100 (35時間 = 2100分)
3. X製品の需要制約: x ≥ 45 (需要75 - 在庫30 = 45)
4. Y製品の需要制約: y ≥ 5 (需要95 - 在庫90 = 5)
5. 非負制約: x ≥ 0, y ≥ 0
GLPKで解くために、以下のようなモデルファイル(例:model.mod)を作成します:
/* 決定変数 */ var x >= 45; var y >= 5; /* 目的関数 */ maximize Z: x + y - 50; /* 制約条件 */ s.t. machine_A: 50*x + 24*y <= 2400; s.t. machine_B: 30*x + 33*y <= 2100; end;
このモデルファイルを使用して、コマンドラインで以下のコマンドを実行します:
glpsol --model model.mod -o solution.txt
GLPKが問題を解いた結果は以下です。
Problem: model Rows: 3 Columns: 2 Non-zeros: 6 Status: OPTIMAL Objective: Z = 1.25 (MAXimum) No. Row name St Activity Lower bound Upper bound Marginal ------ ------------ -- ------------- ------------- ------------- ------------- 1 Z B 51.25 2 machine_A NU 2400 2400 0.0416667 3 machine_B B 1556.25 2100 No. Column name St Activity Lower bound Upper bound Marginal ------ ------------ -- ------------- ------------- ------------- ------------- 1 x NL 45 45 -1.08333 2 y B 6.25 5 Karush-Kuhn-Tucker optimality conditions: KKT.PE: max.abs.err = 4.55e-13 on row 2 max.rel.err = 9.47e-17 on row 2 High quality KKT.PB: max.abs.err = 0.00e+00 on row 0 max.rel.err = 0.00e+00 on row 0 High quality KKT.DE: max.abs.err = 0.00e+00 on column 0 max.rel.err = 0.00e+00 on column 0 High quality KKT.DB: max.abs.err = 0.00e+00 on row 0 max.rel.err = 0.00e+00 on row 0 High quality End of output
以下のような最適解が得られます:
Z = 1.25 (週末時点での余剰在庫数)
この結果から、会社は今週、X製品を45単位、Y製品を6.25単位製造するべきであることがわかります。これにより、週末時点での余剰在庫数は1.25単位となり、最大化されます。