使用LpSolve在R中设置线性规划优化?
我有一个优化问题,我试图基于列X的唯一值来最大化列z,但也在一个约束范围内,即X的每个唯一值加上列Y的最大值应该小于(在本例中)23 例如,我有以下示例数据:使用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
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之外的其他值。