線形最適化問題 PuLP

線形最適化問題

2つの変数$x$と$y$の線形最適化問題を解決し、最適な解を見つけます。

この問題は非常に単純ですが、PuLPを使用しても解決できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pulp

# 問題の定義
problem = pulp.LpProblem("線形最適化問題", pulp.LpMaximize)

# 変数の定義
x = pulp.LpVariable("x", lowBound=0) # xは非負制約
y = pulp.LpVariable("y", lowBound=0) # yは非負制約

# 目標関数の定義
problem += 3 * x + 2 * y # 最大化する目標関数

# 制約条件の定義
problem += 2 * x + y <= 10 # 制約条件1
problem += x + 2 * y <= 8 # 制約条件2

# 最適化
problem.solve()

# 結果を表示
print("最適な解:")
print("x =", x.varValue)
print("y =", y.varValue)
print("最適な目標関数値 =", pulp.value(problem.objective))

このコードでは、2つの変数$x$と$y$を持つ線形最適化問題を解決しています。

目標関数は$3x + 2y$で、制約条件は$2x + y <= 10$および$x + 2y <= 8$です。
PuLPを使用して最適な解を見つけ、それを表示しています。

[実行結果]

1
2
3
4
最適な解:
x = 4.0
y = 2.0
最適な目標関数値 = 16.0

この問題は非常に簡単ですが、PuLPを使った線形最適化問題の基本的な構造を理解するのに役立ちます。

ソースコード解説

ソースコードの各部分を詳しく説明します:

1. import pulp:

PuLPライブラリをインポートします。
PuLPはPythonで線形および整数最適化問題をモデル化し、解決するためのツールです。

2. problem = pulp.LpProblem("線形最適化問題", pulp.LpMaximize):

pulp.LpProblem を使用して、最適化問題のインスタンスを生成します。
"線形最適化問題"は問題の名前で、pulp.LpMaximizeは最大化の目標関数を指定しています。
このインスタンスは、変数、目標関数、制約条件を含む問題を構築するために使用されます。

3. x = pulp.LpVariable("x", lowBound=0):

pulp.LpVariable を使用して変数 x を定義します。
lowBound=0はxが非負であることを制約するための設定です。

4. y = pulp.LpVariable("y", lowBound=0):

同様に、変数 y を定義します。
lowBound=0はyが非負であることを制約するための設定です。

5. problem += 3 * x + 2 * y:

problem インスタンスに目標関数を追加します。
目標関数は 3 * x + 2 * y で、最大化しようとする式です。
つまり、この問題の目標は 3 * x + 2 * y を最大化することです。

6. problem += 2 * x + y <= 10 および problem += x + 2 * y <= 8:

制約条件を追加します。
この例では2つの制約条件を定義しています。
1つ目の制約条件は 2 * x + y <= 10 で、2つ目の制約条件は x + 2 * y <= 8 です。

これらの制約条件は、xとyの値に制約を課すもので、最適な解を制約の範囲内に保ちます。

7. problem.solve():

PuLPのソルバーを呼び出して最適化問題を解きます。
ソルバーは最適な解を見つけ、変数 xy の値を設定します。

8. print("最適な解:"):

最適な解を表示するメッセージを出力します。

9. print("x =", x.varValue):

変数 x の最適な値を表示します。

10. print("y =", y.varValue):

変数 y の最適な値を表示します。

11. print("最適な目標関数値 =", pulp.value(problem.objective)):

最適な目標関数値を表示します。
この場合、目標関数値は 3 * x + 2 * y の最大値です。

このコードは、簡単な線形最適化問題を解決し、最適な解目標関数の最大値を表示します。