c'x + f(x) いくつかのアフィン制約を受ける次の形式の非線形凸最適化問題を解こうとしています。その前に、簡単な問題を なしで解けるようにしたいと思っていましたf(x)。問題の分析的な一次導関数と二次導関数があるので、それらを使用してより迅速に結果を取得したいと考えています。問題を解決するために cvxopt を使用しようとしています。問題に対して次のコードを書きました。
maximize Sum(l*r_i*x_i,i=1:n-1)
s.t. sum(x_i, i=1:n) =1
x_i -v_i*x_n<=0 i=1,...,n-1
0<=x_i<=1
しかし、cvxopt を使用してこれに対する最適な解決策を達成することはできません。cvxopt のモデリング機能を使えば簡単に解けます。残念ながら、それを使用して分析的な一次導関数と二次導関数を提供できるかどうかはわかりません。
ここに問題のコードがあります
from cvxopt import matrix, log, div, spdiag, solvers, spmatrix
import numpy as np
def F(x=None, z = None):
m,n = A.size
if x is None: return 0,matrix(0.5,(n,1))
if (min(x) <0. or max(x)>1.): return None
f = matrix(-l*r.T*x[:-1])
Df = -l*matrix(np.append(r,0)).T
if z is None: return f,Df
H = matrix(0.0, (n,n))
return f,Df,H
dd = 6
l = 19
C = 1.2 * l
theta = 1.25
v = [4.99, 4.66, 3.84, 4.58, 2.54, 1.83]
r = matrix(np.array([max(0.8, 1 - 0.04 * i) for i in range(dd)]))
A = matrix(np.zeros([dd, dd + 1], dtype=float))
for i in range(dd):
A[i, i] = 1.0
A[i, -1] = -v[i]
b = matrix(np.zeros([dd, 1], dtype=float))
A_eq = matrix(np.ones([1, dd + 1], dtype=float))
b_eq = matrix([1.0])
solvers.cp(F,G=A,h=b, A= A_eq,b=b_eq).solve()
私はおそらくこのコードでいくつかの間違いを犯しています。ヘルプやガイダンスをいただければ幸いです。