1

我正在尝试解决以下形式的非线性凸优化问题,并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()

我可能在这段代码中犯了一些错误。任何帮助或指导将不胜感激。

4

0 回答 0