添加许多约束时,PuLP非常慢

时间:2014-10-30 01:13:03

标签: python linear-programming glpk pulp

我正在尝试使用PuLP,但它需要 50秒来添加4000个约束(包含67个变量)。解决问题只需要几分之一秒。

我们希望使用PuLP轻松测试一系列问题上的几个求解器。

它应该花多长时间服用PuLP?直接使用PyGLPK只需要一小部分时间,包括设置和求解,所以我希望不会。如何提高PuLP中此步骤的效率?


更新

我的约束矩阵非常稀疏,并且我能够通过仅包括非零系数来将该特定问题的建立时间减少到4或5秒。我仍然能够编写自己的.lp或.mps格式的文件,用cbc或glpsol子进程解决问题,并且比PuLP更有效地解析解决方案,因为我可以在几毫秒内编写输入文件PuLP需要几秒钟。我仍然不确定为什么会这样。

2 个答案:

答案 0 :(得分:8)

我没有足够的代表发表评论。

但是你看过这个:

https://groups.google.com/forum/#!topic/pulp-or-discuss/p1N2fkVtYyM

问的问题是:

"The problem is solved in less than 0.5 second.
However setting it up with PULP takes more than 10 seconds. "

这似乎也是你报告的内容。解决方案是不使用+ =或sum(...)运算符,而是如链接中所解释的那样:

yeah using the += operator with pulp is really slow, as is using sum() 
instead of lpSum()

所以也许您一次将约束1添加到PuLP而不是先构建约束列表,然后最后将约束添加到PuLP中?

答案 1 :(得分:1)

我有一个类似的问题,我的目标函数使用的表达式具有> 10,000个变量。根本原因与原始海报所见相同。与pulp.LpAffineExpression相比,在sum数组上使用pulp.LpVariable确实很慢。根据接受的答案中的Google网上论坛讨论,我能够使我的代码运行得更快。我知道这是一个古老的问题,但是会为不耐烦的人提供一些抽象代码。

原始目标如下:

sum([x * k for x in xs] + ys)

其中xspulp.LpVariable的列表,k是浮点常量,而yspulp.LpVariable的另一个列表。

一个更快的版本是:

pulp.LpAffineExpression([(x, k) for x in xs] + [(y, 1.0) for y in ys])

我没有精确地计时两个版本。为了了解时差,在运行慢版本时,我能够在Internet上搜索为什么纸浆可能会变慢的原因,找到这个StackOverflow问题,阅读链接的讨论,并在表达式完成求值之前更新我的代码。第二个版本需要几秒钟。