注:同じ内容のJupyter Notebookはこちら。
入門オペレーションズリサーチ の「第12章 仕事の効率を高める 線形計画」の例題をPythonで解いてみる。
参考: PuLP による線型計画問題の解き方ことはじめ - Qiita
牛乳 | 作業時間 | 儲け | |
---|---|---|---|
エスプレッソアイス | 100cc | 7分 | 250円 |
ラズベリーアイス | 150cc | 5分 | 300円 |
まず、PuLPのモジュールをインポートする。
import pulp
エスプレッソアイスの生産量を x1
、ラズベリーアイスの生産量を x2
とする。
変数の定義時に最小値最大値を設定する必要があるが、最大値はここでは便宜上 9999
と置く。(PuLPを使う場合、変数の定義の時点でそれが制約の一部を兼ねる模様)
x1 = pulp.LpVariable('x1', 0, 9999, 'Integer')
x2 = pulp.LpVariable('x2', 0, 9999, 'Integer')
この時、儲けの合計 (250 * x1 + 300 * x2)
を最大化したい。(目的)
problem = pulp.LpProblem('アイス増産計画', pulp.LpMaximize)
# 目的関数
problem += 250 * x1 + 300 * x2
次に制約条件を追加していく。
まず、牛乳の使用量の制約。牛乳は合計8000ccまでしか使えないので、各アイスにおける使用量の合計の上限を8000ccとする。
# 使用量の制約条件
problem += 100 * x1 + 150 * x2 <= 8000
次に生産時間の制約。増産に使える時間は延べ360分なので、各アイスにおける生産時間の合計の上限を360分とする。
# 生産時間の制約条件
problem += 7 * x1 + 5 * x2 <= 360
書籍で記載されている x1
および x2
が正の値 (x1, x2 >= 0)
は変数定義時に最小値として設定してあるので、割愛する。
解く。
status = problem.solve()
print(pulp.LpStatus[status])
Optimal
Optimal
が出ていれば解けている。
問題を改めて見てみる。
print(problem)
アイス増産計画:
MAXIMIZE
250*x1 + 300*x2 + 0
SUBJECT TO
_C1: 100 x1 + 150 x2 <= 8000
_C2: 7 x1 + 5 x2 <= 360
VARIABLES
0 <= x1 <= 9999 Integer
0 <= x2 <= 9999 Integer
求めた値を見てみる。
まずは x1
、エスプレッソアイスの生産量。
x1.value()
23.0
次に x2
、ラズベリーアイスの生産量。
x2.value()
38.0
つまり、制約条件のもとで、エスプレッソアイスを 23、ラズベリーアイスを 38 生産した時に、儲けが最大化される。
と思われるが、例題に解答が載っていないので、合っているかどうかが分からない(ェ
以上。