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

使用LpSolve在R中设置线性规划优化?,r,optimization,linear-programming,lpsolve,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

我有一个优化问题,我试图基于列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 
结果应该如下所示:

  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函数中设置此问题?

您正试图最大化所选选项的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
d=数据帧(x=c(1,1,1,2,2,3,3),y=c(9,7,5,5,7,5),z=c(25,20,5,20,10,5,10,5,5,3))
图书馆(lpSolve)

all.x您试图最大化所选选项的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
d=数据帧(x=c(1,1,1,2,2,3,3),y=c(9,7,5,5,7,5),z=c(25,20,5,20,10,5,10,5,5,3))
图书馆(lpSolve)

你试过什么?你已经考虑过LP和IP了吗?所以基本上我已经在excel中使用解算器完成了这项工作,并希望将其移到R中。我并没有完全理解你的LP或IP(它们的意思)。我在堆栈中找到了其他示例,这些示例演示了如何将其移动,但并没有包括如何使用拾取和约束。您(可能)无法将其作为纯线性规划进行求解,您将需要混合整数规划(lpsolve支持)。阅读您想要使用的包装器的文档,查看它所需的标准表单,并自己尝试一些内容,因为目前这一内容非常广泛。拾取的性质将被表示为二进制变量:如果拾取了x0,则x0=1。如果你需要的话,在三个x候选人中只选择一个:x0+x1+x2=1)。我不确定目前的范围有多广,我认为这是一个非常直截了当的问题。也许你可以帮助我理解它是如何广泛的?你问如何在没有显示任何自己的想法/方法的情况下制定MIP(同时指出缺少关于此优化器内部的知识)。你尝试过什么?你已经考虑过LP和IP了吗?所以基本上我已经在excel中使用解算器完成了这项工作,并希望将其移到R中。我并没有完全理解你的LP或IP(它们的意思)。我在堆栈中找到了其他示例,这些示例演示了如何将其移动,但并没有包括如何使用拾取和约束。您(可能)无法将其作为纯线性规划进行求解,您将需要混合整数规划(lpsolve支持)。阅读您想要使用的包装器的文档,查看它所需的标准表单,并自己尝试一些内容,因为目前这一内容非常广泛。拾取的性质将被表示为二进制变量:如果拾取了x0,则x0=1。如果你需要的话,在三个x候选人中只选择一个:x0+x1+x2=1)。我不确定目前的范围有多广,我认为这是一个非常直截了当的问题。也许你可以帮助我理解它是如何广泛的?你问如何在没有显示任何自己的想法/方法的情况下制定MIP(同时指出缺少关于此优化器内部的知识)。这非常有效,谢谢!我非常感谢您的帮助,因为我还在学习这个软件包,我通过使用代码和使用它来学习,这是一个提供一些指导和帮助的完美示例(与之前的其他评论者不同)。再次感谢!这可能需要一个新线程,但如果我想将all.x更改为1,1,2,3(其中有多个1,s(即非唯一)),我该如何更改函数的const.mat行?我是否需要更改lp函数的其他部分?@CooperBuckeye05现在,约束限制为每组仅一个。如果您想为一个特定值允许多个1,只需将
const.rhs
更改为非所有1。这非常有效,谢谢!我非常感谢您的帮助,因为我还在学习这个软件包,我通过使用代码和使用它来学习,这是一个提供一些指导和帮助的完美示例(与之前的其他评论者不同)。再次感谢!这可能需要一个新线程,但如果我想将all.x更改为1,1,2,3(其中有多个1,s(即非唯一)),我该如何更改函数的const.mat行?我是否需要更改lp函数的其他部分?@CooperBuckeye05现在,约束限制为每组仅一个。如果要为特定值允许多个1,只需将
const.rhs
更改为除所有1之外的其他值。