constrOptim 初始值

constrOptim initial values

我正在尝试使用 R 中的 constrOptim() 函数来优化:

2x + 2y + 3z

受制于:

-2x + y + z <= 1

4x - y + 3z <= 3

x, y, z >= 0

我目前的情况是这样的:

ui = matrix(c(2,-1,-1,-4, 1,-3, 1, 0, 0, 0, 1, 0, 0, 0, 1),
                     nrow = 5,
                     byrow = T)

ci = c(-1, -3, 0, 0, 0)
theta = c(0, 1, 0)

constrOptim(
  theta = theta,
  f = func,
  ui = ui,
  ci = ci)

这给我的错误是“初始值不在可行域的内部”。但是,如果我 运行 以下内容作为测试:

ui = matrix(c(2,-1,-1,-4, 1,-3, 1, 0, 0, 0, 1, 0, 0, 0, 1),
                     nrow = 5,
                     byrow = T)

ci = c(-1, -3, 0, 0, 0)
theta = c(0, 1, 0)

ui %*% theta - ci

我得到 (0 4 0 1 0),这肯定是 >=0。

我的问题是,为什么我会收到一条错误消息,告诉我 ui %*% theta - ci 不是 >= 0,而它显然是?我错过了什么?

编辑:感谢 Stéphane Laurent

设法解决了这个问题

知道如何最好地在 R 中绘制可行域吗?有什么有用的包吗?

起始值必须在可行域的内部,所以你需要> 0而不是>= 0。您可以使用 theta = c(0.1, 1, 0.1)

ui = matrix(c(2,-1,-1,-4, 1,-3, 1, 0, 0, 0, 1, 0, 0, 0, 1),
            nrow = 5,
            byrow = T)
ci = c(-1, -3, 0, 0, 0)
theta = c(0.1, 1, 0.1)

all(ui %*% theta - ci > 0) # TRUE

constrOptim(
  theta = theta,
  f = function(xyz) c(crossprod(c(2,2,3), xyz)),
  grad = NULL,
  ui = ui,
  ci = ci)

顺便说一句,对我来说,解决方案似乎很明显 c(0,0,0)

错误原因已在中解释。

constrOptim 的另一种选择是使用包 pracma 中的 fmincon,即使边界上有初始值,您也可以 运行 代码而不会出现任何错误,即,theta = c(0,1,0)

ui = matrix(c(2,-1,-1,-4, 1,-3, 1, 0, 0, 0, 1, 0, 0, 0, 1),
            nrow = 5,
            byrow = T)
ci = c(-1, -3, 0, 0, 0)
theta = c(0, 1, 0)
func <- function(v) crossprod(c(2,2,3),v)

res <- pracma::fmincon(theta,
                       f = func,
                       A = -ui,
                       b = -ci)

这样

> res
$par
[1] 0 0 0

$value
     [,1]
[1,]    0

$convergence
[1] 0

$info
$info$lambda
$info$lambda$lower
     [,1]
[1,]    0
[2,]    0
[3,]    0

$info$lambda$upper
     [,1]
[1,]    0
[2,]    0
[3,]    0

$info$lambda$ineqlin
[1] 0 0 2 2 3


$info$grad
     [,1]
[1,]    2
[2,]    2
[3,]    3

$info$hessian
     [,1] [,2] [,3]
[1,]    1 0.00    0
[2,]    0 0.03    0
[3,]    0 0.00    1