Rsolnp:在 cbind(temp, funv) 中:结果的行数不是向量长度的倍数 (arg 1)

Rsolnp: In cbind(temp, funv) : number of rows of result is not a multiple of vector length (arg 1)

我是 Whosebug 的新手,搜索了很多,但找不到我的问题的答案。我正在尝试使用优化包 Rsolnp 尽量减少下面的问题。尽管求解器为我提供了解决方案,但每次我 运行 代码时,我都会收到以下警告消息:

警告消息:1:在 cbind(temp, funv) 中: 结果的行数不是向量长度的倍数 (arg 1)

而且,这个解决方案和我用ipop和solve.QP得到的解决方案是完全不同的。他们的解决方案几乎相同(0.2480、0.0000、0.0121、0.7400)。 我尝试了许多不同的问题表述,但无法弄清楚我做错了什么。感谢所有的帮助和信息!

library(Rsolnp)
# Starting Values
x0 <- c(0.25,0,0.01,0.75)


fn <- function(x){
  d <- c(0.0308, 0.0269, 0.0145, 0.0130)
  d <- -d
  D <- cbind(c(0.1486, 0.0778, -0.0240, -0.0154), 
         c(0.0778, 0.1170, 0.0066, 0.0029), 
         c(-0.0240, 0.0066, 0.0444, 0.0193), 
         c(-0.0154, 0.0029, 0.0193, 0.0148))
 out <- t(d) %*% x + 0.5 * (t(x) %*% D %*% x)
 out
}


# Inequality Constraint: 0 =< x 0 =< 1
lx <- rep(0,4)
ux <- rep(1,4)



sol <- solnp(pars = x0, 
         fun = fn, 
         eqfun = sum, 
         eqB = 1, 
         ineqLB = lx, 
         ineqUB = ux)
sol$pars

欢迎来到 SO。

您在这里遇到了两个问题 a) w.r.t 结果的问题和 b) 您无法理解的警告消息。

广告一个) 这仅仅是因为拉格朗日优化通常是通过最小化负值而不是最大化正值来完成的。那就是不同之处。将 d 设置为 -d 时(我在编辑中这样做),解决方案与其他求解器生成的解决方案相同。

ad b) 警告消息问题有些棘手。该消息本身意味着 cbind 试图绑定两个不同长度的列。 R 的作用是根据需要经常重复较短列中的值,以获得要绑定的两列相等长度。如果较长的不是较短的倍数,您会收到此警告,但如果这意味着有一些未使用的剩余部分,R 会继续重复较短的值。

但是,包中似乎有错误。 当你 运行

options(warn = 2) # turns warnings to errors and breaks code
debug(solnp)
sol <- solnp(pars = x0, 
     fun = fn, 
     eqfun = sum, 
     eqB = 1, 
     ineqLB = lx, 
     ineqUB = ux)

您发现正在创建一个名为 tempdf 的对象导致了问题。然而,这个对象在 solnp 的代码中再也没有使用过。我会问作者,也许他们可以确认这是一个错误或以其他方式显示。

使您的 objective 函数 fn 的结果明确为数字:

fn <- function(x){
  d <- c(0.0308, 0.0269, 0.0145, 0.0130)
  d <- -d
  D <- cbind(c(0.1486, 0.0778, -0.0240, -0.0154), 
             c(0.0778, 0.1170, 0.0066, 0.0029), 
             c(-0.0240, 0.0066, 0.0444, 0.0193), 
             c(-0.0154, 0.0029, 0.0193, 0.0148))
  out <- t(d) %*% x + 0.5 * (t(x) %*% D %*% x)
  as.numeric(out)
}

然后我得到

Iter: 1 fn: -0.01153 Pars: 0.24798607502 0.00000002295 0.01205720515 0.73995669928 Iter: 2 fn: -0.01153 Pars: 0.247984418270 0.000000003318 0.012080555874 0.739935021900 solnp--> Completed in 2 iterations

sol$pars [1] 2.479844e-01 3.317577e-09 1.208056e-02 7.399350e-01