数字问题与solve.QP,R中的二次规划函数

时间:2016-06-08 01:22:32

标签: r quadratic-programming

假设我有以下二次规划问题,其中数字非常大:

> require(quadprog)
> Q <- diag(c(34890781627, 34890781627, 34890781627, 34890781627, 34890781627))
> c <- c(133013236723, 29459621018, 31362634710, 24032348447, 23332381578)
> ( A <- t(kronecker(diag(1,5),as.matrix(c(1,-1)))) )
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1   -1    0    0    0    0    0    0    0     0
[2,]    0    0    1   -1    0    0    0    0    0     0
[3,]    0    0    0    0    1   -1    0    0    0     0
[4,]    0    0    0    0    0    0    1   -1    0     0
[5,]    0    0    0    0    0    0    0    0    1    -1
> ( e <- rep(c(0,1),5) )
 [1] 0 1 0 1 0 1 0 1 0 1

约束为Ax >= -e:我将所有变量约束在[0,1]范围内。我想因为这里涉及的数字太大,导致一些数值问题。如果我跑

> solve.QP(Q,c,A,bvec=-e)$solution

我会得到Error in solve.QP(Q, c, A, bvec = -e) : constraints are inconsistent, no solution!

当我尝试将所有内容除以大量数据以缩小这些疯狂数字时,该函数能够生成一些输出,但不能正确:

> 1E4*solve.QP(1E-8*Q,1E-4*c,A,bvec=-1E-4*e)$solution
[1] 1 1 1 1 1

我认为正确答案是

> w <- (1/diag(Q))*c
> w[w>1] <- 1
> w[w<0] <- 0
> w
[1] 1.0000000 0.8443382 0.8988803 0.6887879 0.6687263

我真的不需要QP,因为Q矩阵是对角线的,但我只想用它作为例子,并就处理与solve.QP()相关的数值问题提出一些建议。让我们假设我有一个密集的Q矩阵,我该怎么做才能得到正确的结果?

提前致谢!

1 个答案:

答案 0 :(得分:0)

对不起伙计们,我刚才意识到我在尝试缩小矩阵Q和向量c时犯了一个错误。

min x^T Q x /2 - c^T x相当于min a * (x^T Q x /2 - c^T x),其中包含任何正数a。所以我需要做的就是将Qc乘以相同的小数字,如下所示:

> solve.QP(1E-8*Q,1E-8*c,A,bvec=-e)$solution
[1] 1.0000000 0.8443382 0.8988803 0.6887879 0.6687263

这次它给出了正确的结果。以前我在考虑转换x = ay,但我的逻辑不正确。正确的方法如下:

min x^T Q x /2 - c^T x相当于min y^T (a^2*Q) y /2 - a*c^T y,其中包含任何正数a。约束也将相应地改变为Ay >= -e/a。所以你也可以做

1E-4*solve.QP(1E-8*Q,1E-4*c,A,bvec=-1E4*e)$solution
[1] 1.0000000 0.8443382 0.8988803 0.6887879 0.6687263

剩余问题

一般来说,我们何时应该考虑这个数字问题以及最佳收缩尺寸a?或者除了缩小之外还有哪些方法可以更好地解决这个问题?