我正在尝试解决以下形式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()
我可能在这段代码中犯了一些错误。任何帮助或指导将不胜感激。