CVXPY
CVXPYは、Pythonで最適化問題を定義して解くための強力なライブラリです。
以下に、CVXPYの基本的な使い方や便利な機能をいくつか紹介します。
1. インストール
まず、CVXPYをインストールします。
2. 基本的な使い方
線形最適化問題を定義して解く基本的な例を示します。
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
| import cvxpy as cp
x = cp.Variable() y = cp.Variable()
objective = cp.Maximize(x + y)
constraints = [ x + 2*y <= 1, x - y >= 1, x >= 0, y >= 0 ]
problem = cp.Problem(objective, constraints)
problem.solve()
print("Optimal value:", problem.value) print("x:", x.value) print("y:", y.value)
|
[実行結果]
Optimal value: 1.0000000001061882
x: 1.0000000002109781
y: -1.0479004738088337e-10
3. 二次最適化
CVXPYを使って二次最適化問題を解く例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import numpy as np
x = cp.Variable(2)
Q = np.array([[2, 0.5], [0.5, 1]]) objective = cp.Minimize(0.5 * cp.quad_form(x, Q))
constraints = [x[0] + x[1] == 1, x >= 0]
problem = cp.Problem(objective, constraints)
problem.solve()
print("Optimal value:", problem.value) print("x:", x.value)
|
[実行結果]
Optimal value: 0.43750000000000006
x: [0.25 0.75]
4. 線形計画問題 (Linear Programming, LP)
線形計画問題を定義して解く例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| x = cp.Variable(3)
c = np.array([1, 2, 3]) objective = cp.Minimize(c.T @ x)
A = np.array([[1, 1, 0], [0, 1, 1]]) b = np.array([1, 1]) constraints = [A @ x <= b, x >= 0]
problem = cp.Problem(objective, constraints)
problem.solve()
print("Optimal value:", problem.value) print("x:", x.value)
|
[実行結果]
Optimal value: 1.3466953587360049e-09
x: [5.70962945e-10 4.91615839e-11 2.25803082e-10]
5. ソフトな制約条件
ペナルティ付きで制約条件を緩和する方法です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| x = cp.Variable()
penalty = cp.Variable(pos=True) constraints = [x + penalty >= 1, penalty >= 0]
objective = cp.Minimize(x + 10 * penalty)
problem = cp.Problem(objective, constraints)
problem.solve()
print("Optimal value:", problem.value) print("x:", x.value) print("penalty:", penalty.value)
|
[実行結果]
Optimal value: 1.0000000000163711
x: 1.0000000000163711
penalty: 0.0
6. パラメータの使用
パラメータを使って問題の定義を柔軟に変更する方法です。
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
| x = cp.Variable() a = cp.Parameter(nonneg=True) b = cp.Parameter(nonneg=True)
objective = cp.Minimize(a * x + b)
constraints = [x >= 0, x <= 10]
problem = cp.Problem(objective, constraints)
a.value = 2 b.value = 1 problem.solve()
print("Optimal value with a=2, b=1:", problem.value) print("x:", x.value)
a.value = 1 b.value = 3 problem.solve()
print("Optimal value with a=1, b=3:", problem.value) print("x:", x.value)
|
[実行結果]
Optimal value with a=2, b=1: 1.0000000003054508
x: 1.527254291082821e-10
Optimal value with a=1, b=3: 3.0000000003691296
x: 3.691294636403306e-10
7. ソルバーの指定
特定のソルバーを使用する方法です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| x = cp.Variable()
objective = cp.Minimize(x**2)
constraints = [x >= 1]
problem = cp.Problem(objective, constraints)
problem.solve(solver=cp.SCS)
print("Optimal value using SCS solver:", problem.value) print("x:", x.value)
|
[実行結果]
Optimal value using SCS solver: 0.9999999999272082
x: 0.9999999999636041
これらの基本的な操作を理解することで、CVXPYを使って幅広い最適化問題を効率的に解くことができます。