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

标签 r mathematical-optimization

我是 stackoverflow 的新手,进行了很多搜索,但找不到我的问题的答案。我正在尝试使用优化包 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) 结果问题;b) 一条你无法理解的警告消息。

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

广告 b) 警告消息问题有点棘手。该消息本身意味着 cbind 尝试绑定(bind)不同长度的两列。 R 的作用是根据需要重复较短列中的值,以获得要绑定(bind)的相同长度的两列。如果较长的值不是较短的值的倍数,您会收到此警告,但如果这意味着存在一些未使用的余数,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)

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

关于Rsolnp : In cbind(temp, funv) :结果的行数不是向量长度(arg 1)的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40927876/

相关文章:

r - R中的等频和等宽分箱

r - 如何编写自定义管道友好函数?

c++ - 创建 IloObjective 的正确方法

algorithm - 如何找到总和刚好高于阈值的元素组合

r - 计算子字符串中字符串的下一次出现次数

r - 条件 data.table 与 .EACHI 合并

r - 为什么我的标签只是上下移动,而v只是左右移动?这不是很落后吗?

matlab - 找到欠定线性方程组的正解

java - 如何用Java编写数学公式

Java Cplex 降低最优性和第一个可行的解决方案