最適化問題
最適化問題の例として、特定の制約条件下での関数の最小化を考えてみましょう。
以下は、2変数の関数の最小化問題です。
この例では、scipy.optimize
ライブラリを使用して最適化を行います。
1 | import numpy as np |
このコードでは、関数$ x^2 + y^2 $を最小化する問題を考え、制約条件として$ x + y = 5 $を設定しています。
最適化結果や最小化される関数のグラフが表示されます。
[実行結果]
異なる関数や制約条件を試すことで、様々な最適化問題に対応できます。
ソースコード解説
以下にソースコードの説明を示します。
1. ライブラリのインポート:
1 | import numpy as np |
numpy
: 数値計算のためのライブラリ。scipy.optimize.minimize
: 最適化問題を解くための関数。matplotlib.pyplot
: グラフ描画のためのライブラリ。
2. 最小化する関数の定義:
1 | def objective_function(x): |
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 | print("最適解:", result.x) |
- 最適解と最小値を表示します。
7. グラフの作成:
1 | x_vals = np.linspace(-2, 7, 100) |
- グラフ描画用の 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 | contour = plt.contour(X, Y, Z, levels=15, cmap='viridis') |
- 関数の等高線プロットを描画します。
11. グラフの装飾:
1 | plt.title('2変数関数の最小化と制約条件') |
- グラフのタイトルや軸ラベル、凡例、グリッドを設定します。
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 ) $を赤い線で示しています。
最適解がこの赤い線上にあり、かつ関数を最小化する点であることが確認できます。
この例は非常にシンプルですが、最適化問題の基本的な理解を提供しています。
実際の応用では、より複雑な関数や複数の制約条件がありますが、同様のアプローチが使われます。