混合完整性约束的scipy linprog与milp的区别?

mjqavswn  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(135)

我想知道Scipy的这两个功能之间的区别:

  • linprog,当它与混合完整性约束一起使用时-即一些变量应该是整数,其他变量应该是连续的
  • milp

我确实看到它们有不同的语法,但它们似乎都基于HiGHS求解器,那么在求解算法上是否有根本的区别?我们可以期望使用一个函数或另一个函数的计算时间相同吗?

编辑:我在Scipy Github repo https://github.com/scipy/scipy/issues/18700中找到了一个很好的解释

nx7onnlm

nx7onnlm1#

阅读文档:
milp
linprog
在签名方面

  • linprog分别接受A_eqA_ub约束的一个裸矩阵。milp接受LinearConstraint对象,这些对象可以做同样的事情,但更通用,具有独立的下限和上限,并且能够在一个序列中指定多个独立的约束。(milp也可以接受裸阵列,只要它们可以直接通过构造函数解包转换为LinearConstraint)。
  • 类似地,linprog接受bounds的裸矩阵,milp接受Bounds便利对象。
  • linprog接受与milp不同的options字典键。例如,使用linprog可以设置maxiter,而使用milp则不能。
  • milp仅 Package HiGHSlinprog接受通常应该设置为highsmethod,但有其他传统方法,包括单纯形和内点。通常不应使用这些遗留方法:
    **自版本1.9.0弃用:method ='simplex' 将在SciPy 1.11.0中删除。它被 method ='highs' 代替,因为后者更快,更健壮。

对于特殊的(和不推荐的)用例,linprog支持回调,而milp不支持。关于这一点的文档在linprog中没有明确说明,但是对于未被弃用的方法(highs和家族),callback被忽略。
由于限制方便的 Package 器,您通常应该使用milp,除非您有非常好的理由。
我们可以期望使用一个函数或另一个函数的计算时间相同吗?
是的。唯一的(边际)时间差异,你可能会或可能无法检测是在问题的设置和转换时间;基本上所有的代码都在HiGHS之前。

相关问题