【问题标题】:Extreme low performance when using a high number of integer & binary variables in Pulp在 Pulp 中使用大量整数和二进制变量时性能极低
【发布时间】:2022-01-06 14:42:18
【问题描述】:

在对 lp 产生式问题建模时,我使用了大量整数。

首先问题在合理的时间内得到解决,但是当我由于大 M 方法添加大量二进制值 (y) 时,需要数小时和数小时,并且程序似乎根本无法运行。这是因为 Pulp 对于二进制变量非常慢。

我做大 M 的原因是因为我想分离变量边界,以便得到

x(i,t) = 0 或 x(i,t) >= 10(这意味着在每个时间段 t 内不生产或至少生产 10 件产品 i):

x(i,t) - 1

x(i,t) - 9 >= -e - (1 - y(i,t) ) * M

(e是一个很小的常数,M是一个很大的常数)

除了使用上面显示的方法之外,还有其他方法吗? 我可以像 [10, inf] 那样定义 x(i,t) 的边界,但我仍然需要值 0,因为什么也不产生也是一个非常有效的重要解决方案。

提前致谢!

【问题讨论】:

    标签: python pulp


    【解决方案1】:

    我不知道你为什么要用大 M 和整数/二进制变量的小常数来公式化。

    如果x 是整数,y 是对应的二进制变量,则重新表述为:

    x <= y * M
    x >= y * 10
    

    其中Mx 的逻辑上限

    这与您的类似,但小常量 e 是不必要的,并且 M 不应过大。

    在大多数情况下,所有求解器(包括 pulp 中预打包的求解器都会因引入大量二进制或整数变量而显着变慢。

    您是否尝试过设置 mip-gap 等来说服自己它正在工作?

    【讨论】:

    • 因为那样边界会不同/不可行??如果 y=1,那么 x 小于 1 并且同时大于 10?
    • 是的,我粗手指了……修复了!
    • 啊,好吧,有道理,约束更易读,但实际问题是我必须使用一个新的二进制变量 y,这会大大降低算法的性能
    • 我也试过 fracGap=0.05 现在快了很多,谢谢!在我只用 fracgap=0.01 测试它并且没有效果之前。所以我必须在最优性与速度之间进行权衡,这对我来说是可以接受的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多