在 Pulp 中使用大量整数和二进制变量时性能极低
Extreme low performance when using a high number of integer & binary variables in Pulp
在对 lp 生产问题建模时,我使用了很多整数。
首先,问题在合理的时间内得到了解决,但是由于大 M 方法,当我添加大量二进制值 (y) 时,需要花费数小时和数小时,程序似乎无法正常工作全部。这是因为 Pulp 处理二进制变量的速度很慢。
我之所以做大M是因为我想把变量边界分开,为了得到
x(i,t) = 0 或 x(i,t) >= 10(这意味着 要么什么也不生产,要么每次至少生产 10 件 产品 i期间 t):
x(i,t) - 1 <= e + M * y(i,t)
x(i,t) - 9 >= -e - (1 - y(i,t) ) * M
(e是一个很小的常数,M是一个很大的常数)
除了上面的方法,还有其他方法吗?
我可以像 [10, inf] 那样定义 x(i,t) 的边界,但我仍然需要值 0,因为什么都不产生也是一个非常有效的重要解决方案。
提前致谢!
我不确定你为什么要用大 M 和 integer/binary 变量的小常量来表述。
如果x
是整数,y
是对应的二进制变量,重新表述为:
x <= y * M
x >= y * 10
其中 M
是 x
的逻辑上限
这与您的类似,但是小常量 e
是不必要的,M 不应太大。
在大多数情况下,所有求解器(包括 pulp
中预打包的求解器都会随着引入大量二进制或整数变量而显着变慢。
您是否尝试过设置 mip-gap 等来让自己相信它有效?
在对 lp 生产问题建模时,我使用了很多整数。
首先,问题在合理的时间内得到了解决,但是由于大 M 方法,当我添加大量二进制值 (y) 时,需要花费数小时和数小时,程序似乎无法正常工作全部。这是因为 Pulp 处理二进制变量的速度很慢。
我之所以做大M是因为我想把变量边界分开,为了得到
x(i,t) = 0 或 x(i,t) >= 10(这意味着 要么什么也不生产,要么每次至少生产 10 件 产品 i期间 t):
x(i,t) - 1 <= e + M * y(i,t)
x(i,t) - 9 >= -e - (1 - y(i,t) ) * M
(e是一个很小的常数,M是一个很大的常数)
除了上面的方法,还有其他方法吗? 我可以像 [10, inf] 那样定义 x(i,t) 的边界,但我仍然需要值 0,因为什么都不产生也是一个非常有效的重要解决方案。
提前致谢!
我不确定你为什么要用大 M 和 integer/binary 变量的小常量来表述。
如果x
是整数,y
是对应的二进制变量,重新表述为:
x <= y * M
x >= y * 10
其中 M
是 x
这与您的类似,但是小常量 e
是不必要的,M 不应太大。
在大多数情况下,所有求解器(包括 pulp
中预打包的求解器都会随着引入大量二进制或整数变量而显着变慢。
您是否尝试过设置 mip-gap 等来让自己相信它有效?