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
我正在尝试使用 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