使用LpSolve在R中设置线性编程优化?

时间:2017-10-16 22:02:22

标签: r optimization linear-programming 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函数中设置此问题?

1 个答案:

答案 0 :(得分:3)

您正在尝试根据两种类型的约束最大化所选选项的z值之和:

  • 所选选项的y值之和不超过23
  • 您为每个唯一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