繁体   English   中英

如何在lpSolve 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),那么您已经找到了解决方案。 否则,没有解决方案。 如果没有解决方案,则可以为任意选择的eps尝试x <= 5-eps。

添加:

如果您打算变量x1和x2是整数,则

x < 10 and x != 9

相当于

x <= 8

请注意, lp具有all.int参数,默认为FALSE

添加2:

如果您只是想找到多个可行的解决方案,那么如果opt是第一个解决方案中目标的值,请重新运行以添加约束(假设最大化问题):

objective <= opt - eps

其中eps是一个任意小的常数。

还应注意,如果向量x1和x2是LP的两个最佳解,则由于约束集必定是凸的,因此这些解的任何凸组合也是可行的,并且由于目标是线性的,因此所有这些凸组合也必须是最优的,因此如果有多个以上的最优解,然后有无数个此类最优解,因此您不能简单地列举它们。

添加3。

线性程序的可行集形成单形(即多边形),并且如果存在这样的最佳值,则至少一个顶点必须处于最佳值。 如果有多个顶点具有相同的最佳值,那么连接它们的线上的点也都是最佳值。 尽管在这种情况下,最优值的数量是无限的,但顶点的数量是有限的,因此您可以使用vertexenum包枚举它们。 然后评估每个目标。 如果有一个顶点的目标值大于所有其他目标的值,那么那是最佳的。 如果有多个,那么我们知道那些加所有这些的凸组合是最优的。 如果您的问题不是太大,这可能会起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM