我有这个优化问题,我试图根据列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函数中设置此问题?
答案 0 :(得分:3)
您正在尝试根据两种类型的约束最大化所选选项的z值之和:
您可以为每个选项创建二进制变量,然后使用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