带约束的非线性优化

时间:2016-11-22 16:24:21

标签: r optimization nlopt

考虑以下数据框:

A=data.frame(v1=c(4,2,-3,3,-1,3,6,-2), v2=c(3,3,-1,5,-3,-2,-2,-3), v3=c(5,-2,2,2,5,5,4,-4),
              v4=c(-2,-1,3,1,-1,3,2,-5), v5=c(2,-5,4,-4,3,1,1,1))

出现以下优化问题:

1

其中a_i是矩阵A的第i行。

我尝试使用包nloptr解决此问题。首先是目标函数:

 fct <- function(p) {
        return(sum((as.matrix(A)%*%p<0)*(as.matrix(A)%*%p)^2))
        }

然后约束:

 constraint <- function(p){
               return(p[1]-1)
               } 

但是我尝试过的所有求解器都需要一个渐变,例如:

sol <- nloptr(x0=c(1,1,-0.13,-0.5,1.3), eval_f=fct, eval_g_eq=constraint,
 opts=list("algorithm"="NLOPT_LD_SLSQP"))

-> A gradient for the objective function is needed by algorithm NLOPT_LD_SLSQP but was not supplied

是否可以计算此函数的梯度,还是有其他方法可以解决这个问题?

谢谢。

1 个答案:

答案 0 :(得分:0)

我怀疑你可以将其解决为标准的QP(二次规划)问题:

min sum(i, y(i)^2 )
y(i) <= sum(j, a(i,j)*p(j))
y(i) <= 0

不需要渐变。像quadprog,Cplex和Gurobi这样的QP求解器可以解决这个问题:只需插入问题。

最后一个约束只是一个简化事物的界限。