使用 LpSolve 在 R 中设置线性规划优化?

Set up linear programming optimization in R using LpSolve?

我有这个优化问题,我试图根据 X 列的唯一值最大化 Z 列,但也在一个约束条件下,即从 X 中选择的每个唯一值加起来 Y 的列最多小于(在这个例子中)23.

例如,我有这个示例数据:

d=data.frame(x=c(1,1,1,2,2,2,3,3,3),y=c(9,7,5,9,7,5,9,7,5),z=c(25,20,5,20,10,5,10,5,3))

看起来像这样:

  X  Y  Z 
1 1  9  25     
2 1  7  20   
3 1  5  5    
4 2  9  20    
5 2  7  10     
6 2  5  5    
7 3  9  10     
8 3  7  5               
9 3  5  5

结果应该是这样的:

  X  Y  Z 
1 1  9  25  
4 2  9  20     
9 3  5  5 

如何在lpSolve::lp函数中设置这个问题?

您正在尝试最大化 selected 选项的 z 值之和,但要遵守两种类型的约束:

  • selected 选项的 y 值之和不超过 23
  • 你 select 每个唯一的 x 值恰好一个值

您可以为每个选项创建一个二进制变量,然后用 lpSolve:

求解
d=data.frame(x=c(1,1,1,2,2,2,3,3,3),y=c(9,7,5,9,7,5,9,7,5),z=c(25,20,5,20,10,5,10,5,3))
library(lpSolve)
all.x <- unique(d$x)
d[lp(direction = "max",
     objective.in = d$z,
     const.mat = rbind(outer(all.x, d$x, "=="), d$y),
     const.dir = rep(c("==", "<="), c(length(all.x), 1)),
     const.rhs = rep(c(1, 23), c(length(all.x), 1)),
     all.bin = TRUE)$solution == 1,]
#   x y  z
# 1 1 9 25
# 4 2 9 20
# 9 3 5  3