我正在尝试使用PuLP,但它需要 50秒来添加4000个约束(包含67个变量)。解决问题只需要几分之一秒。
我们希望使用PuLP轻松测试一系列问题上的几个求解器。
它应该花多长时间服用PuLP?直接使用PyGLPK只需要一小部分时间,包括设置和求解,所以我希望不会。如何提高PuLP中此步骤的效率?
更新
我的约束矩阵非常稀疏,并且我能够通过仅包括非零系数来将该特定问题的建立时间减少到4或5秒。我仍然能够编写自己的.lp或.mps格式的文件,用cbc或glpsol子进程解决问题,并且比PuLP更有效地解析解决方案,因为我可以在几毫秒内编写输入文件PuLP需要几秒钟。我仍然不确定为什么会这样。
答案 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)
其中xs
是pulp.LpVariable
的列表,k
是浮点常量,而ys
是pulp.LpVariable
的另一个列表。
一个更快的版本是:
pulp.LpAffineExpression([(x, k) for x in xs] + [(y, 1.0) for y in ys])
我没有精确地计时两个版本。为了了解时差,在运行慢版本时,我能够在Internet上搜索为什么纸浆可能会变慢的原因,找到这个StackOverflow问题,阅读链接的讨论,并在表达式完成求值之前更新我的代码。第二个版本需要几秒钟。