2017-10-16 110 views
1

我有这样的优化问题,我试图根据列X中的唯一值来最大化列z,但也在约束条件下,每个X所选的唯一值总和最大的列Y小于(在此例如)23.使用LpSolve在R中设置线性规划优化?

例如,我有这样的样本数据:

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

你试过了什么?你有没有想过LP与IP? – sascha

+0

所以基本上我已经在excel中使用解算器完成了这个工作,并且希望将它移到R.我不太关注LP或IP(他们的意思)。我发现堆栈中的其他示例展示了如何移动这个过程,但没有包括如何使用picks约束的总和。 – CooperBuckeye05

+0

您(可能)无法将其解决为纯粹的线性程序,您将需要混合整数编程(由lpsolve支持)。阅读您要使用的包装文档,查看它需要的标准格式,并自行尝试一些内容,因为目前这种格式非常广泛。 * picking *的性质将被表示为二元变量:如果选择x0,x0 = 1。只挑选三个候选人中的一个:x0 + x1 + x2 <= 1 (and > = 1如果您需要的话)。 – sascha

回答

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 
+0

这个很好用,谢谢!在我仍然只是学习这个包的过程中,我感谢你们的帮助,我通过学习代码并玩弄它而学习,这是给出一些指导和帮助的完美例子(与其他先前的评论者相反)。再次感谢! – CooperBuckeye05

+0

这可能需要一个新线程,但如果我想将all.x更改为1,1,2,3(其中有多个1,s(即不唯一)),我该如何去做改变函数的const.mat行?我需要更改lp函数的其他部分吗? – CooperBuckeye05

+0

@ CooperBuckeye05现在约束限制在每组中只有一个。如果你想让一个特定的值超过一个,你只需要把'const.rhs'改成除1之外的东西。 – josliber