如何在 lpSolver r 中实现 !=(不等于)
How to implement != (not equal) in lpSolve r
由于 lpSolve 不允许使用 != 作为约束方向,获得相同结果的替代方法是什么?
我想在约束条件下最大化 x1 + x2:x1 <= 5 和
x2 != 5
并继续使用 lpSolve R 包。
我尝试使用 > < 的组合来复制 != 的相同行为,但是我没有获得预期的结果。
f.obj<-c(1,1)
f.con<-matrix(c(1,0,0,1),nrow=2,ncol=2,byrow=TRUE)
f.dir<-c("<=","!=")
f.rhs<-c(5,5)
lp("max",f.obj,f.con,f.dir,f.rhs)$solution
由于 lpSolve 不支持 !=,我收到错误消息:
Error in lp("max",f.obj,f.con,f.dir,f.rhs): Unknown constraint direction found
编辑
我想在约束条件下最大化 x1 + x2:x1 <= 5 和
x2 < 10 且 x2 != 9。
所以解决方案是 5 和 8。
你不能这样做,即使在理论上也是如此,因为生成的约束集不是封闭的。这就像尝试在集合 x > 0 上最小化 x^2。对于该集合中的任何建议的解决方案 x0,解决方案 x0/2 更好,因此没有最优。
我只使用 x <= 5 作为你的约束,如果约束不活跃(即结果是 x < 5)那么你已经找到了解决方案;否则,没有解决办法。如果没有解决方案,您可以尝试 x <= 5 - eps 任意选择的 eps。
已添加:
如果您希望变量 x1 和 x2 是整数,那么
x < 10 and x != 9
等同于
x <= 8
请注意,lp
具有默认为 FALSE
的 all.int
参数。
添加了 2 个:
如果您只想找到多个可行的解决方案,那么如果 opt
是第一个解决方案中 objective 的值,请重新运行并添加约束(假设是最大化问题):
objective <= opt - eps
其中 eps 是任意小常数。
另请注意,如果向量 x1 和 x2 是 LP 的两个最优解,那么由于约束集必然是凸的,因此这些解的任何凸组合也是可行的,并且因为 objective 是线性的所有这些凸组合也必须是最优的,所以如果有不止一个最优解,那么就有无数个这样的最优解,所以你不能简单地列举它们。
添加了 3.
线性规划的可行集形成一个单纯形(即多胞形),如果存在最优值,则至少有一个顶点必须处于最优值。如果有多个顶点具有相同的最优值,那么连接它们的直线上的点也都是最优值。尽管在这种情况下有无限多个最优值,但只有有限数量的顶点,因此您可以使用 vertexenum 包枚举它们。然后评估每个 objective 。如果有一个顶点的 objective 值大于所有其他顶点,那么这就是最佳顶点。如果有多个,那么我们知道那些加上那些的所有凸组合是最优的。如果您的问题不是太大,这可能会奏效。
由于 lpSolve 不允许使用 != 作为约束方向,获得相同结果的替代方法是什么? 我想在约束条件下最大化 x1 + x2:x1 <= 5 和 x2 != 5 并继续使用 lpSolve R 包。
我尝试使用 > < 的组合来复制 != 的相同行为,但是我没有获得预期的结果。
f.obj<-c(1,1)
f.con<-matrix(c(1,0,0,1),nrow=2,ncol=2,byrow=TRUE)
f.dir<-c("<=","!=")
f.rhs<-c(5,5)
lp("max",f.obj,f.con,f.dir,f.rhs)$solution
由于 lpSolve 不支持 !=,我收到错误消息:
Error in lp("max",f.obj,f.con,f.dir,f.rhs): Unknown constraint direction found
编辑
我想在约束条件下最大化 x1 + x2:x1 <= 5 和 x2 < 10 且 x2 != 9。 所以解决方案是 5 和 8。
你不能这样做,即使在理论上也是如此,因为生成的约束集不是封闭的。这就像尝试在集合 x > 0 上最小化 x^2。对于该集合中的任何建议的解决方案 x0,解决方案 x0/2 更好,因此没有最优。
我只使用 x <= 5 作为你的约束,如果约束不活跃(即结果是 x < 5)那么你已经找到了解决方案;否则,没有解决办法。如果没有解决方案,您可以尝试 x <= 5 - eps 任意选择的 eps。
已添加:
如果您希望变量 x1 和 x2 是整数,那么
x < 10 and x != 9
等同于
x <= 8
请注意,lp
具有默认为 FALSE
的 all.int
参数。
添加了 2 个:
如果您只想找到多个可行的解决方案,那么如果 opt
是第一个解决方案中 objective 的值,请重新运行并添加约束(假设是最大化问题):
objective <= opt - eps
其中 eps 是任意小常数。
另请注意,如果向量 x1 和 x2 是 LP 的两个最优解,那么由于约束集必然是凸的,因此这些解的任何凸组合也是可行的,并且因为 objective 是线性的所有这些凸组合也必须是最优的,所以如果有不止一个最优解,那么就有无数个这样的最优解,所以你不能简单地列举它们。
添加了 3.
线性规划的可行集形成一个单纯形(即多胞形),如果存在最优值,则至少有一个顶点必须处于最优值。如果有多个顶点具有相同的最优值,那么连接它们的直线上的点也都是最优值。尽管在这种情况下有无限多个最优值,但只有有限数量的顶点,因此您可以使用 vertexenum 包枚举它们。然后评估每个 objective 。如果有一个顶点的 objective 值大于所有其他顶点,那么这就是最佳顶点。如果有多个,那么我们知道那些加上那些的所有凸组合是最优的。如果您的问题不是太大,这可能会奏效。