获取函数求值时发生nloptr错误

获取函数求值时发生nloptr错误,r,nonlinear-optimization,R,Nonlinear Optimization,我在运行R中的优化程序时遇到问题。我在这里附上了代码。此代码用于具有8个决策变量(X[j])的非线性规划。我试图最大化目标函数。使用nloptr包运行整个函数时,在 Error in -(for (i in 1:nrow(ldata)) { : invalid argument to unary operator set.seed(123) a <- sample(1:6,10,replace = T) b <- sample(1:3,10,replace= T) w<-

我在运行R中的优化程序时遇到问题。我在这里附上了代码。此代码用于具有8个决策变量(X[j])的非线性规划。我试图最大化目标函数。使用nloptr包运行整个函数时,在

Error in -(for (i in 1:nrow(ldata)) { : 
  invalid argument to unary operator
set.seed(123)
a <- sample(1:6,10,replace = T)
b <- sample(1:3,10,replace= T)
w<- rnorm(10,10,2)
Z<-0.08
Y<-4
D<-2.7
cd<-matrix(0,10,11)
for(i in 1:10){
  cd[i,1]<-a[i]
  cd[i,2]<-w[i]
  cd[i,3]<-cd[i,1]*cd[i,2]
  cd[i,4]<-b[i]
  if (cd[i,4]==1){
    cd[i,5]=max(0,cd[i,3]-23)
  }
  else if (cd[i,4]==2){
    cd[i,5]=max(0,cd[i,3]-28)
  }
  else{
    cd[i,5]=max(0,cd[i,3]-32)
  }
  if (cd[i,4]==1){
    cd[i,6]=max(0,cd[i,1]-2)
  }
  else if (cd[i,4]==2) {
    cd[i,6]=max(0,cd[i,1]-2)
  }
  else {
    cd[i,6]=max(0,cd[i,1]-3)
  }
  cd[i,7]<-cd[i,5]*Y*D
  if (cd[i,6]>=1){
    cd[i,8]=runif(1,120,130)
  }
  else{
    0
  }
  if (cd[i,6]>=2){
    cd[i,9]=runif(1,cd[i,8]+1,140)
  }
  else{
    0
  }
  if (cd[i,6]>=3){
    cd[i,10]=runif(1,cd[i,9]+1,150)
  }
  else{
    0
  }
  if (cd[i,6]>=4){
    cd[i,11]=runif(1,cd[i,10]+1,160)
  }
  else{
    0
  }
};cd
A1<-sum(cd[,7]);A1
ldata<-cd[,-c(1:7)];ldata 
 obj_fn<-function(x){-
    (for(i in 1:nrow(ldata)){
      for(j in 1:4){

    #price[i,j] <- cdata[i,j] * (x[j] + x[j+4]) * Z * D
    ldata[i,j] * as.vector(x[j] + x[j+4]) * Z * D
    }
  })
}
在-(for(i in 1:nrow(ldata)){
一元运算符的参数无效
种子集(123)

a我不知道这是否有效,但试试这个:


例如,您的代码有效地从
-(…)
返回值,其中内部是
for
的返回值…但是
for
的返回值总是
NULL
。您从不从
ldata[i,j]捕获值*…
,因此…您在内部
for
循环中进行计算,然后对外部
for
NULL
值求反。
ldata
x
的维度相同吗?它们看起来像什么?您的预期输出是什么?如果可以,许多问题会更加明显t为了使问题更具可复制性,请参见,和。如果您想一想我们可以如何帮助您,您能想出一个场景,我们可以在没有实际(样本)的情况下产生您需要的结果吗数据和给定样本数据的预期输出?请至少阅读三个链接中的第一个。顺便问一下,您是否理解为什么您的函数总是返回
-NULL
(这是一个错误)?(1)拥有样本数据更好,尽管我们不知道您对该数据的输出预期是什么,我们也不太可能获得相同的样本数据,除非您包括对
set.seed
的调用,以便我们可以从熵的公共点开始。(2)我已经解释了为什么一元运算符出现错误
无效参数,还有什么问题吗?谢谢,但我认为您没有理解我关于再现性的观点。(关于
-(for…
返回
-(NULL)
)您开始编写函数的方式,(1)它不会返回数据;(2)它正在执行
10*4次,而不是
8次。问题不在于如何调用
nlpotr
,问题在于函数。鉴于你的
obj\u fn
应该返回一些数字,你认为当你的双循环完成时应该返回什么?我甚至接近了吗?很难进行验证我对输入没有更好的了解,但我想我已经解决了目标函数的问题。很抱歉,我太忙了,没有实现它。我今天会尝试一下,然后回复你。感谢你的建议和帮助,我应用了该函数,该函数正在工作。再次感谢你。我需要ltl在制定约束和约束方面提供更多帮助应用非线性优化。你有在RWE中使用nloptr的经验吗?虽然我熟悉非线性优化,但主要是gams和pyomo,而不是nloptr,对不起。不管怎样,这听起来像是一个螺旋式的问题;如果与这个问题没有紧密联系,最好问一个不同的问题(听起来有点不同)。如果答案有效,请接受。谢谢!我需要将目标函数值存储在变量中,并且需要有一个约束,即目标函数的上限。例如