生産計画問題 PuLP

生産計画問題

PuLP は Python の線形計画問題を解くためのライブラリです。

ここで示す一例として、生産計画問題を解いてみましょう。

生産計画の最適化はビジネスの現場でよく見る問題の一つで、リソースが限られている中で利益を最大化する生産量を決定します。

問題設定:

  • 2つの製品(AとB)を生産します。
  • 製品Aと製品Bの利益はそれぞれ20ドル30ドルです。
  • 製品Aを作るのには1時間の作業が、製品Bを作るのには2時間の作業が必要です。
  • 製造機械が一週間に稼働できるのは100時間です。
  • 市場の需要は製品Aが40個、製品Bが30個までです。
  • 製品ごとの生産上限は製品Aは30個、製品Bは20個です。

この情報に基づいて、週の利益を最大化する生産計画を立ててみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pulp
import matplotlib.pyplot as plt

# 問題のインスタンスを作成します。最大化問題として定義します。
model = pulp.LpProblem("最大利益問題", pulp.LpMaximize)

# 変数を定義します。生産量は0個以上、上限まで可能です。
x1 = pulp.LpVariable('x1', lowBound=0, upBound=30, cat='Continuous')
x2 = pulp.LpVariable('x2', lowBound=0, upBound=20, cat='Continuous')

# 目的関数を定義します。利益を最大化したいので、製品ごとの利益に生産量を掛けたものの和です。
model += 20 * x1 + 30 * x2

# 制約を定義します。
model += x1 + 2 * x2 <= 100 # 機械の作業時間の制限
model += x1 <= 40 # 製品Aの市場需要
model += x2 <= 30 # 製品Bの市場需要

# 問題を解きます。
model.solve()

このコードは PuLP を使用して問題をモデル化し、解を求めます。

そして解(生産量の最適値)を出力します。

1
2
3
4
# 結果の出力
print(f"製品Aの生産量: {x1.value()}")
print(f"製品Bの生産量: {x2.value()}")
print(f"総利益: {pulp.value(model.objective)}")

[実行結果]

製品Aの生産量: 30.0
製品Bの生産量: 20.0
総利益: 1200.0

結果は、与えられた条件と制約のもとで、利益を最大化する生産量の組み合わせを表しています。

ソースコード解説

このソースコードは、線形計画法(Linear Programming)を用いて最大利益を達成する製造計画を最適化する問題を解いています。

以下はコードの章立てと説明です:

1. ライブラリのインポート

1
2
import pulp
import matplotlib.pyplot as plt

必要なライブラリ(PuLPとMatplotlib)をインポートします。

2. 問題のインスタンス作成

1
model = pulp.LpProblem("最大利益問題", pulp.LpMaximize)

PuLPを使用して最大利益を求める最適化問題のインスタンスを作成します。

3. 変数の定義

1
2
x1 = pulp.LpVariable('x1', lowBound=0, upBound=30, cat='Continuous')
x2 = pulp.LpVariable('x2', lowBound=0, upBound=20, cat='Continuous')

変数 x1x2 を定義し、それぞれが0以上30以下0以上20以下の実数であることを指定します。

4. 目的関数の定義

1
model += 20 * x1 + 30 * x2

最大化したい目的関数を定義します。

この場合、製品Aと製品Bの単位あたりの利益を最大化します。

5. 制約条件の定義

1
2
3
model += x1 + 2 * x2 <= 100  # 機械の作業時間の制限
model += x1 <= 40 # 製品Aの市場需要
model += x2 <= 30 # 製品Bの市場需要

最適化の際に考慮する制約条件を定義します。

これらは機械の作業時間、製品Aおよび製品Bの市場需要です。

6. 最適化の実行

1
model.solve()

PuLPを使用して最適化問題を解きます。

7. 結果の出力

1
2
3
print(f"製品Aの生産量: {x1.value()}")
print(f"製品Bの生産量: {x2.value()}")
print(f"総利益: {pulp.value(model.objective)}")

最適な製造計画が見つかった後、生産量総利益を表示します。