在limSolve包中,LSEI错误:不等式相互矛盾

时间:2012-02-01 21:16:40

标签: r mathematical-optimization

给定一个矩阵,我想找到尽可能接近某个目标向量的行的线性组合。另外,我希望行权重是非负的并且总和为1.我尝试使用limSolve包解决问题,但它报告了一个关于矛盾不等式的错误。这是我的功能:

library(limSolve)

find.weights <- function(target.vector, a.matrix) {
  # parameters to the objective function
  A <- t(a.matrix)
  B <- target.vector

  # equality constraint (weights sum to 1)
  E <- matrix(rep(1, nrow(a.matrix)), nrow = 1)
  F <- 1

  # inequality constraints (all weights nonnegative)
  G <- diag(1, nrow(a.matrix))
  H <- rep(0, nrow(a.matrix))

  lsei(A = A, B = B, E = E, F = F, G = G, H = H)
}

以下是导致问题的输入。

target.vector:

[1] 0.00 0.30 0.10 0.15 0.15 0.15 0.00 0.15 0.00

a.matrix:

[1,]  0.0000000000 1.0000000 0.000000000 0.0000000 0.00000000 0.0000000 0.000000000           0       0
[2,]  1.0000000000 0.0000000 0.000000000 0.0000000 0.00000000 0.0000000 0.000000000           0       0
[3,]  0.0000000000 0.0000000 0.000000000 0.0000000 0.00000000 0.0000000 0.000000000           1       0
[4,]  0.0000000000 0.0000000 0.000000000 0.0000000 0.00000000 1.0000000 0.000000000           0       0
[5,]  0.0000000000 0.6318000 0.044100000 0.2241000 0.01000000 0.0900000 0.000000000           0       0
[6,] -0.0069249820 0.4961489 0.030322369 0.1164405 0.03519697 0.3167728 0.012043447           0       0
[7,]  0.0410533877 0.2434423 0.007709501 0.0292961 0.06651868 0.5986681 0.013311866           0       0
[8,]  0.0000000000 0.0000000 0.240000000 0.7600000 0.00000000 0.0000000 0.000000000           0       0
[9,] -0.0001006841 0.6229848 0.051032756 0.1945897 0.01236401 0.1112761 0.007853359           0       0

当我使用这些输入调用该函数时,我收到上述错误:

> result <- find.weights(target.vector, a.matrix)
Warning message:
In lsei(A = A, B = B, E = E, F = F, G = G, H = H) :
  LSEI error: inequalities contradictory

但是,如果我限制行数或列数,该函数似乎工作正常:

> result <- find.weights(target.vector, a.matrix[1:8,]) # OK
> result <- find.weights(target.vector[1:6], a.matrix[,1:6]) # OK
> result <- find.weights(target.vector[1:7], a.matrix[,1:7]) # NOPE
Warning message:
In lsei(A = A, B = B, E = E, F = F, G = G, H = H) :
  LSEI error: inequalities contradictory

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:1)

LSEI error: inequalities contradictory

当您通过EFGH指定的线性约束定义不可行的问题时,会发生

。换句话说,当没有向量x可以同时解决所有E %*% x == FG %*% x >= H约束时。例如,考虑一个会限制两个变量x1x2的问题,x1 + x2 == -1 x_1 >= 0x2 >= 0。显然,没有x1x2值可以满足所有三个约束,并且问题是不可行的。

在您的问题中,n是要解决的变量数量,您要求的只是x_1x_2,...,x_n是非负面的,它们总和为1。一个可行的解决方案(无限多假设n > 1)是选择x_1 = 1x_2 = ... = x_n = 0。所以先验,lsei不应该抛出你提到的错误。事实上,您的代码在我的机器上运行良好,我无法重现您所看到的错误。您是否可能使用与此处发布的代码不同的代码获得错误?

答案 1 :(得分:0)

实际上lsei给出了虚假的“不平等矛盾”。这是一个测试用例:我的约束条件要求解的总和为1(等式),并且要减小(不等式)。

n <- 12
A <- diag(1, 2, n)
B <- c(1, .5)
E <- matrix(1, 1, n)
F <- 1                          # pre-set value was FALSE
G <- -diff(diag(1, n+1, n)
H <- numeric(n)
lsei(A, B, E, F, G, H)

第一次运行证明了该问题是可行的。输出:

$X
 [1] 0.75 0.25 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

$residualNorm
[1] 4.440892e-16

$solutionNorm
[1] 0.125

$IsError
[1] FALSE

$type
[1] "lsei"

但是随后我更改了A[1,1],它与约束无关:

A1 <- diag(c(1000,1),2,n)                # change one element
lsei(A=A1, B, E, F, G, H)

使用A1(病情较轻),它将失败:

$X
 [1] -2.6689062 -0.5899748  0.6479330  0.3362563  0.4279018  0.4279018
 [7]  0.4279018  0.4279018  0.4279018  0.4279018  0.4279018  0.2793792

$residualNorm
[1] 3.408485

$solutionNorm
[1] 7128401

$IsError
[1] TRUE

$type
[1] "lsei"

Warning message:
In lsei(A = A1, B = B, E = E, F = F, G = G, H = H) :
  LSEI error: inequalities contradictory

我认为这表明错误是虚假的,即,这是一个错误。