8

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

我们希望使用 PuLP 轻松测试大量问题的多个求解器。

纸浆需要这么长时间吗?直接使用 PyGLPK 只需要几分之一秒,包括设置和求解,所以我希望不会。我可以做些什么来提高纸浆中这一步的效率?


更新

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

4

2 回答 2

12

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

但是你有没有看过这个:

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?

于 2015-03-16T21:54:59.017 回答
3

我有一个类似的问题,我的目标函数使用了一个包含 > 10,000 个变量的表达式。根本原因与原始海报看到的相同。与. sum_ pulp.LpVariable_ pulp.LpAffineExpression根据接受的答案中的 Google Groups 讨论,我能够使我的代码运行得更快。我知道这是一个老问题,但会为不耐烦的人提供一些抽象代码。

最初的目标是这样的:

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

其中xs是 的列表pulp.LpVariablek是浮点常数,ys是 的另一个列表pulp.LpVariable

一个更快的版本是:

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

我没有准确计时任何一个版本。为了了解时差,在运行慢版本时,我能够在互联网上搜索为什么纸浆可能会这么慢,找到这个 StackOverflow 问题,阅读链接的讨论,并在表达式完成评估之前更新我的代码. 第二个版本需要几秒钟。

于 2019-09-06T19:08:12.143 回答