線形計画をPythonで解いてみる

04 Mar 2018

注:同じ内容のJupyter Notebookはこちら

入門オペレーションズリサーチ の「第12章 仕事の効率を高める 線形計画」の例題をPythonで解いてみる。

参考: PuLP による線型計画問題の解き方ことはじめ - Qiita

12.1 アイス増産計画 (p.151)

  • 2種類のアイスの生産を計画
  • 材料の牛乳は全部で8000cc
  • 作業時間は延べ360分
  • 儲けを最大にする増産計画を求めたい。
  牛乳 作業時間 儲け
エスプレッソアイス 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 生産した時に、儲けが最大化される。

と思われるが、例題に解答が載っていないので、合っているかどうかが分からない(ェ

以上。