给定 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 成立。这是一个玩具示例,我分别优化了 x1x2(后来我意识到这不是正确的方法!):

我用 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  

然后循环最小化 x1x2 如下:

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的最小值是-Infx2的最小值是0.02876712。但是,这不满足约束集。比如第一个约束是16x1 + 15x2 >= 0,因为x1-Inf,那么结果就会是负数。所以第一个约束不满足。

所以现在我想也许我应该解决以下问题:

有没有办法在 R 中优化多个目标?

对于多个 objectives,一般来说,最好的方法是找到 set 有效点(也称为 Pareto 最优点或非支配点)。这些点使得没有其他点至少有一个 objective 值更好,而所有其他 objective 至少同样好。不幸的是,在手头的问题中没有有效点,因为对于 x1 的任何值,我们都可以通过使 x2 足够大来满足所有约束,因此给定任何 x1 和 x2,我们可以找到 x1' > x1 和 x2' > x2 也满足约束.

(顺便说一句,请注意 lpSolveAPI 假定约束 x >= 0。)