生産計画問題 PuLP

生産計画問題

生産計画問題の例を考えます。

3つの製品(A、B、C)を製造するために必要な原材料の量、1つの生産ラインの生産能力、および各製品の利益率が与えられています。

各製品は少なくとも1つ以上生産する必要があります。

製品の生産量を最適化して、最大の利益を得ることが目的です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from pulp import *

# 1. 問題の定義
prob = LpProblem("Production Planning Problem", LpMaximize)

# 2. 変数の定義
A = LpVariable("Product A Units", lowBound=0, cat='Integer')
B = LpVariable("Product B Units", lowBound=0, cat='Integer')
C = LpVariable("Product C Units", lowBound=0, cat='Integer')

# 3. 目的関数の定義
prob += 3000*A + 5000*B + 2000*C

# 4. 制約条件の定義
prob += 3*A + 2*B + 1.5*C <= 1500
prob += 1.5*A + 2.5*B + 3*C <= 3000
prob += A + B + C <= 1000
prob += A >= 1
prob += B >= 1
prob += C >= 1

# 5. 最適化の実行
prob.solve()

# 6. 結果の表示
print("Status:", LpStatus[prob.status])
for v in prob.variables():
print(v.name, "=", v.varValue)
print("Total Profit = ", value(prob.objective))

1. 問題の定義

LpProblem関数を使用して問題を定義しています。

LpProblem関数は、第1引数に問題名、第2引数に最小化か最大化を指定します。

ここでは、”Production Planning Problem”という名前の最大化問題を定義しています。


2. 変数の定義

LpVariable関数を使用して、問題に必要な変数を定義しています。

LpVariable関数は、第1引数に変数の名前、lowBoundに変数の下限、catに変数の種類を指定します。

ここでは、”Product A Units”、”Product B Units”、”Product C Units”という名前の整数変数を定義しています。


3. 目的関数の定義

目的関数を定義しています。

ここでは、各製品の単位あたりの利益と各製品の製造量を掛けた値を合計して、最大化するようにしています。


4. 制約条件の定義

制約条件を定義しています。ここでは、各製品の製造に必要な原料の量、製品の総製造量に関する制約を定義しています。

また、各製品を少なくとも1つ生産する必要があるため、各変数に対して下限制約も設定しています。


5. 最適化の実行

solve関数を呼び出して、問題を解きます。


6. 結果の表示

解が得られたら、status属性を使用して最適性のステータスを表示し、variables属性を使用して各変数の最適な値を表示し、objective属性を使用して最適な目的関数値(総利益)を表示します。


このコードを実行すると、以下のような結果が出力されます。

[実行結果]
Status: Optimal
Product_A_Units = 1.0
Product_B_Units = 747.0
Product_C_Units = 2.0
Total Profit =  3742000.0

これにより、各製品を少なくとも1つ生産し、最大の利益である3742000ドルを得るために、1単位の製品A、747単位の製品B、および2単位の製品Cを製造する必要があることが確認できました。