给定 R 中的一组约束,如何优化多个 objectives/variables?
How to optimize over multiple objectives/variables given a set of constraints in R?
给定 2 个未知变量 x = (x1, x2)
,我想找到 x1, x2
的最小值,使得一组约束 Ax >= c
成立。这是一个玩具示例,我分别优化了 x1
和 x2
(后来我意识到这不是正确的方法!):
我用 R 编码了这个:
library(lpSolveAPI)
c_vec <- c(0, 0, -0.42, 0.42, -0.81)
A_mat_col1 <- c(16, -15, -2, 3, 0.027)
A_mat_col2 <- c(15, 13, 16, 12, 13)
my.lp <- make.lp(nrow = 5, ncol = 2)
set.constr.type(my.lp, rep(">=", 5))
set.rhs(my.lp, c_vec)
set.column(my.lp, 1, A_mat_col1)
set.column(my.lp, 2, A_mat_col2)
set.bounds(my.lp, lower = rep(-Inf, 2), upper = rep(Inf, 2))
> my.lp
Model name:
C1 C2
Minimize 0 0
R1 16 15 >= 0
R2 -15 13 >= 0
R3 -2 16 >= -0.42
R4 3 12 >= 0.42
R5 0.027 13 >= -0.81
Kind Std Std
Type Real Real
Upper Inf Inf
Lower -Inf -Inf
然后循环最小化 x1
和 x2
如下:
lower <- vector()
for(i in 1:2){
set.objfn(my.lp, make_basis(i, p = 2))
lp.control(my.lp, sense = "min")
# If return value is 0, then problem is solved successfully
if(solve(my.lp) == 0){
lower[i] <- get.objective(my.lp)
# If return value is 3, then it's unbounded and I set lower bound to -Inf
}else if(solve(my.lp) == 3){
lower[i] <- -Inf
}
}
> lower
[1] -Inf 0.02876712
所以x1
的最小值是-Inf
,x2
的最小值是0.02876712
。但是,这不满足约束集。比如第一个约束是16x1 + 15x2 >= 0
,因为x1
是-Inf
,那么结果就会是负数。所以第一个约束不满足。
所以现在我想也许我应该解决以下问题:
有没有办法在 R 中优化多个目标?
对于多个 objectives,一般来说,最好的方法是找到 set 有效点(也称为 Pareto 最优点或非支配点)。这些点使得没有其他点至少有一个 objective 值更好,而所有其他 objective 至少同样好。不幸的是,在手头的问题中没有有效点,因为对于 x1 的任何值,我们都可以通过使 x2 足够大来满足所有约束,因此给定任何 x1 和 x2,我们可以找到 x1' > x1 和 x2' > x2 也满足约束.
(顺便说一句,请注意 lpSolveAPI 假定约束 x >= 0。)
给定 2 个未知变量 x = (x1, x2)
,我想找到 x1, x2
的最小值,使得一组约束 Ax >= c
成立。这是一个玩具示例,我分别优化了 x1
和 x2
(后来我意识到这不是正确的方法!):
我用 R 编码了这个:
library(lpSolveAPI)
c_vec <- c(0, 0, -0.42, 0.42, -0.81)
A_mat_col1 <- c(16, -15, -2, 3, 0.027)
A_mat_col2 <- c(15, 13, 16, 12, 13)
my.lp <- make.lp(nrow = 5, ncol = 2)
set.constr.type(my.lp, rep(">=", 5))
set.rhs(my.lp, c_vec)
set.column(my.lp, 1, A_mat_col1)
set.column(my.lp, 2, A_mat_col2)
set.bounds(my.lp, lower = rep(-Inf, 2), upper = rep(Inf, 2))
> my.lp
Model name:
C1 C2
Minimize 0 0
R1 16 15 >= 0
R2 -15 13 >= 0
R3 -2 16 >= -0.42
R4 3 12 >= 0.42
R5 0.027 13 >= -0.81
Kind Std Std
Type Real Real
Upper Inf Inf
Lower -Inf -Inf
然后循环最小化 x1
和 x2
如下:
lower <- vector()
for(i in 1:2){
set.objfn(my.lp, make_basis(i, p = 2))
lp.control(my.lp, sense = "min")
# If return value is 0, then problem is solved successfully
if(solve(my.lp) == 0){
lower[i] <- get.objective(my.lp)
# If return value is 3, then it's unbounded and I set lower bound to -Inf
}else if(solve(my.lp) == 3){
lower[i] <- -Inf
}
}
> lower
[1] -Inf 0.02876712
所以x1
的最小值是-Inf
,x2
的最小值是0.02876712
。但是,这不满足约束集。比如第一个约束是16x1 + 15x2 >= 0
,因为x1
是-Inf
,那么结果就会是负数。所以第一个约束不满足。
所以现在我想也许我应该解决以下问题:
有没有办法在 R 中优化多个目标?
对于多个 objectives,一般来说,最好的方法是找到 set 有效点(也称为 Pareto 最优点或非支配点)。这些点使得没有其他点至少有一个 objective 值更好,而所有其他 objective 至少同样好。不幸的是,在手头的问题中没有有效点,因为对于 x1 的任何值,我们都可以通过使 x2 足够大来满足所有约束,因此给定任何 x1 和 x2,我们可以找到 x1' > x1 和 x2' > x2 也满足约束.
(顺便说一句,请注意 lpSolveAPI 假定约束 x >= 0。)