最適化問題

最適化問題

最適化問題の例として、特定の制約条件下での関数の最小化を考えてみましょう。

以下は、2変数の関数の最小化問題です。

この例では、scipy.optimize ライブラリを使用して最適化を行います。

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt

# 最小化する関数
def objective_function(x):
return x[0]**2 + x[1]**2 # 例として x^2 + y^2 を最小化

# 制約条件
constraints = ({'type': 'eq', 'fun': lambda x: x[0] + x[1] - 5}) # 制約条件: x + y = 5

# 初期値
initial_guess = [0, 0]

# 最適化の実行
result = minimize(objective_function, initial_guess, constraints=constraints)

# 結果表示
print("最適解:", result.x)
print("最小値:", result.fun)

# グラフの作成
x_vals = np.linspace(-2, 7, 100)
y_vals = np.linspace(-2, 7, 100)
X, Y = np.meshgrid(x_vals, y_vals)
Z = X**2 + Y**2

# 制約条件を描画
plt.plot(x_vals, 5 - x_vals, label='制約条件: x + y = 5', color='red')

# 最小値を描画
plt.scatter(result.x[0], result.x[1], color='green', marker='x', label='最小値')

# 関数の等高線を描画
contour = plt.contour(X, Y, Z, levels=15, cmap='viridis')
plt.clabel(contour, inline=True, fontsize=8)

# グラフの装飾
plt.title('2変数関数の最小化と制約条件')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)

# グラフの表示
plt.show()

このコードでは、関数$ x^2 + y^2 $を最小化する問題を考え、制約条件として$ x + y = 5 $を設定しています。

最適化結果最小化される関数のグラフが表示されます。

[実行結果]

異なる関数制約条件を試すことで、様々な最適化問題に対応できます。

ソースコード解説

以下にソースコードの説明を示します。

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

1
2
3
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
  • numpy: 数値計算のためのライブラリ。
  • scipy.optimize.minimize: 最適化問題を解くための関数。
  • matplotlib.pyplot: グラフ描画のためのライブラリ。

2. 最小化する関数の定義:

1
2
def objective_function(x):
return x[0]**2 + x[1]**2 # 例として x^2 + y^2 を最小化
  • x は2要素の配列で、x[0]x[1] が変数となります。
  • $ x[0]^2 + x[1]^2 $を最小化する関数を定義しています。

3. 制約条件の設定:

1
constraints = ({'type': 'eq', 'fun': lambda x: x[0] + x[1] - 5})  # 制約条件: x + y = 5
  • 制約条件として、$ x + y = 5 $を設定しています。

4. 初期値の設定:

1
initial_guess = [0, 0]
  • 最適化の初期値を [0, 0] に設定します。

5. 最適化の実行:

1
result = minimize(objective_function, initial_guess, constraints=constraints)
  • minimize 関数を使用して最適化を実行します。
  • objective_function を最小化し、制約条件 constraints の下で最適解を見つけます。

6. 結果の表示:

1
2
print("最適解:", result.x)
print("最小値:", result.fun)
  • 最適解と最小値を表示します。

7. グラフの作成:

1
2
3
4
x_vals = np.linspace(-2, 7, 100)
y_vals = np.linspace(-2, 7, 100)
X, Y = np.meshgrid(x_vals, y_vals)
Z = X**2 + Y**2
  • グラフ描画用の x, y 座標を生成します。
  • Z には$ X^2 + Y^2 $の関数値が格納されます。

8. 制約条件の描画:

1
plt.plot(x_vals, 5 - x_vals, label='制約条件: x + y = 5', color='red')
  • 制約条件を赤い線で描画します。

9. 最小値の描画:

1
plt.scatter(result.x[0], result.x[1], color='green', marker='x', label='最小値')
  • 最小値の点を緑の “x” マークで描画します。

10. 等高線プロットの描画:

1
2
contour = plt.contour(X, Y, Z, levels=15, cmap='viridis')
plt.clabel(contour, inline=True, fontsize=8)
  • 関数の等高線プロットを描画します。

11. グラフの装飾:

1
2
3
4
5
plt.title('2変数関数の最小化と制約条件')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
  • グラフのタイトルや軸ラベル、凡例、グリッドを設定します。

12. グラフの表示:

1
plt.show()
  • これまでの設定で作成したグラフを表示します。

このコードは、2変数の関数を最小化し、その結果をグラフに可視化しています。

特に、制約条件下での最小値を探索している点がポイントです。

結果解説

[実行結果]

この最適化問題は、関数$ ( f(x, y) = x^2 + y^2 ) $を最小化するというもので、制約条件として$ ( x + y = 5 ) $が課されています。

最適化アルゴリズムは、この関数を最小化する$ ( x ) と ( y ) $の値を見つけることを試みます。

結果は以下の通りです:

  • 最適解: [2.5, 2.5]
  • 最小値: 12.5

最適解 $ [2.5, 2.5] $は、制約条件 $ ( x + y = 5 ) $を満たす中で$ ( f(x, y) ) $を最小化する点です。

最小値 $ 12.5 $は、この最小化された関数の値です。

グラフには、等高線プロットが表示されています。


等高線は、関数の高さを示し、最小値がグリーンの “x” マークで示されています。

また、制約条件 $ ( x + y = 5 ) $を赤い線で示しています。

最適解がこの赤い線上にあり、かつ関数を最小化する点であることが確認できます。


この例は非常にシンプルですが、最適化問題の基本的な理解を提供しています。

実際の応用では、より複雑な関数や複数の制約条件がありますが、同様のアプローチが使われます。