Python

[python]CVXOPTの例を動かしてみた

最適化ライブラリ(?)のCVXOPTで例を動かしてみた.
Solving a quadratic program — CVXOPT

解いている問題は

{\rm minimize\:\:\:} 2x_1^2 + x_2^2 + x_1 x_2 + x_1 + x_2
{\rm s.t.\:\:\:} x_1 \geq 0, x_2\geq 0, x_1+x_2 = 1


ですね.

In [1]: from cvxopt import matrix
In [2]: from cvxopt import solvers
In [3]: Q = 2 * matrix([ [2, 0.5], [0.5, 1] ])
In [4]: p = matrix( [1.0, 1.0] )
In [5]: G = matrix([ [-1.0, 0.0], [0.0, -1.0] ])
In [6]: h = matrix( [0.0, 0.0] )
In [7]: A = matrix( [1.0, 1.0], (1, 2) )
In [8]: b = matrix(1.0)
In [9]: sol = solvers.qp(Q, p, G, h, A, b)
     pcost       dcost       gap    pres   dres
 0:  1.8889e+00  7.7778e-01  1e+00  2e-16  2e+00
 1:  1.8769e+00  1.8320e+00  4e-02  1e-16  6e-02
 2:  1.8750e+00  1.8739e+00  1e-03  1e-16  5e-04
 3:  1.8750e+00  1.8750e+00  1e-05  6e-17  5e-06
 4:  1.8750e+00  1.8750e+00  1e-07  1e-16  5e-08
Optimal solution found.
In [10]: print sol['x']
[ 2.50e-01]
[ 7.50e-01]



うーん…難しいなこれは.使い方が難しい.元々のドキュメントではこうなっている.

{\rm minimize\:\:\:} \frac{1}{2}x^T Q x + p^T x
{\rm s.t.\:\:\:} Ax = b, Gx \preceq h
→ sol = solvers.qp(Q, p, G, h, A, b),解はsol[‘x’]に入っている.


つまり元の問題を二次形式に直さないとダメということか.

2x_1^2 + x_2^2 + x_1x_2 + x_1 + x_2 = \begin{pmatrix}x_1&x_2\end{pmatrix}<br /> \begin{pmatrix}2&\frac{1}{2}\\\frac{1}{2}&1\end{pmatrix}\begin{pmatrix}x_1\\x_2\end{pmatrix}


条件x_1, x_2 \geq 0を入れるにはG = \begin{pmatrix}1 & 0 \\ 0 & 1\end{pmatrix}, h = \begin{pmatrix}0\\0\end{pmatrix}, A = \begin{pmatrix}1.0\\1.0\end{pmatrix}, b =1.0とする.
これを考えると使えると….

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です