線形最適化問題
CVXPYを使用して、簡単な線形最適化問題を解いてみましょう。
ここでは、2つの変数を持つ最小化の線形関数を扱います。例として、次のような問題を解いてみます。
$$
\text{minimize} \quad 3x + 4y
$$
$$
\text{subject to} \quad x + 2y \geq 10
$$
$$
\text{subject to} \quad 3x - y \leq 12
$$
$$
\text{subject to} \quad x, y \geq 0
$$
以下がそのコードです。
1 | import cvxpy as cp |
これにより、線形最適化問題が解かれ、最適解が計算されます。
また、制約条件と最適解が含まれたグラフも描画されます。
この場合、最適解は赤い点で示されます。
ソースコード解説
このコードは、CVXPYを使用して線形最適化問題を解決し、結果をグラフで視覚化するものです。
1. 必要なライブラリのインポート
1 | import cvxpy as cp |
必要なライブラリ(CVXPY、NumPy、Matplotlib)をインポートします。
2. 変数の定義
1 | x = cp.Variable() |
最適化問題で使用する変数 x
と y
を定義しています。
3. 目的関数と制約条件の設定
1 | objective = cp.Minimize(3*x + 4*y) |
最小化したい目的関数と制約条件を設定しています。
この場合、目的関数は$ (3x + 4y) $で、制約条件は不等式制約です。
4. 最適化問題の定義
1 | problem = cp.Problem(objective, constraints) |
CVXPYの Problem
クラスを使って最適化問題を定義しています。
目的関数と制約条件を引数として渡しています。
5. 問題の解決
1 | problem.solve() |
定義した最適化問題を解いています。
CVXPYが問題を解くための適切な最適化アルゴリズムを選択し、最適な解を見つけようとします。
6. 最適な解の表示
1 | print("Optimal value:", problem.value) |
最適な目的関数の値とそれに対する最適な変数 x
と y
の値を表示しています。
7. グラフの描画
1 | x_values = np.linspace(0, 10, 100) |
制約条件をグラフにプロットし、最適な解を赤い点として表示しています。
fill_between
は制約条件の領域を色で塗りつぶし、plt.plot
は最適解を赤い点でプロットしています。
結果解説
この結果は、与えられた線形最適化問題の最適な解を示しています。
最適な目的関数の値は約20です。
最適解は、$ (x \approx 0) $および$ (y \approx 5) $です。
つまり、制約条件を満たしながら最適な解が見つかりました。
グラフは、制約条件を表しています。
青い線はそれぞれ制約条件を示し、グレーの領域はすべての制約条件を満たす領域を示しています。
赤い点は最適解を表しており、制約条件の交差点に位置しています。
つまり、目的関数を最小化するための最適な$ (x) と (y) $の値を示しています。
最適解が$ (x \approx 0) $となる理由は、制約条件 $ (3x - y \leq 12) $により、$ (x) $が増加すると$ (y) $も増加する必要があるためです。
この条件を満たしつつ、目的関数を最小化するためには$ (x) $を極小化し$ (y) $を最大化するのが最適な戦略であり、その結果、$ (x \approx 0) $となります。