from pulp import *
m = LpProblem(sense=LpMaximize) # 数理モデル
x = LpVariable('x', lowBound=0) # 変数
y = LpVariable('y', lowBound=0) # 変数
m += 100 * x + 100 * y # 目的関数
m += x + 2 * y <= 16 # 材料Aの上限の制約条件
m += 3 * x + y <= 18 # 材料Bの上限の制約条件
m.solve() # ソルバーの実行
print(f"x={value(x)}, y={value(y)}") # 4, 6
のようになります。数理モデルをコードに起こす際は
数理モデルを定義
変数を定義
目的関数を定義
制約条件を定義
ソルバーを実行
の順でコーディングします。コードの実行結果は以下です。
Welcome to the CBC MILP Solver
Version: 2.10.3
Build Date: Dec 15 2019
solution /tmp/c1043875e60243f1aa73450426d5d62a-pulp.sol (default strategy 1)
At line 2 NAME MODEL
At line 3 ROWS
At line 7 COLUMNS
At line 14 RHS
At line 17 BOUNDS
At line 18 ENDATA
Problem MODEL has 2 rows, 2 columns and 4 elements
Coin0008I MODEL read with 0 errors
Option for timeMode changed from cpu to elapsed
Presolve 2 (0) rows, 2 (0) columns and 4 (0) elements
0 Obj -0 Dual inf 200 (2)
0 Obj -0 Dual inf 200 (2)
2 Obj 1000
Optimal - objective value 1000
Optimal objective 1000 - 2 iterations time 0.002
Option for printingOptions changed from normal to all
Total time (CPU seconds): 0.00 (Wallclock seconds): 0.01
x=4.0, y=6.0
よって製品 X を 4、製品 Y を 6 個作成すると利益が最大になることが分かりました。
線形計画問題は典型問題と呼ばれる問題の一種で、他にも様々な典型問題があります。
ご興味のある方は組合せ最適化 - 典型問題と実行方法を参照してください。