簡體   English   中英

添加許多約束時,PuLP非常慢

[英]PuLP very slow when adding many constraints

我正在嘗試使用PuLP,但是需要50秒才能添加4000個約束(67個變量)。 解決問題只需要幾分之一秒。

我們希望使用PuLP輕松測試一大堆問題上的幾個求解器。

它應該花這么長時間服用PuLP嗎? 直接使用PyGLPK只需要一小部分時間,包括設置和求解,所以我希望不會。 我該怎么做才能提高PuLP中這一步驟的效率?


更新

我的約束矩陣非常稀疏,並且通過僅包括非零系數,我能夠將該特定問題的建立時間減少到4或5秒。 我仍然能夠編寫自己的.lp或.mps格式的文件,用cbc或glpsol子進程解決問題,並且比PuLP更有效地解析解決方案,因為我可以在幾毫秒內編寫輸入文件PuLP需要幾秒鍾。 我仍然不確定為什么會這樣。

我沒有足夠的代表發表評論。

但是你看過這個:

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()

那么也許你是一次向PuLP添加約束1而不是先構建約束列表然后在最后將約束添加到PuLP中?

我遇到了類似的問題,我的目標函數使用了大於10,000個變量的表達式。 根本原因與原始海報看到的相同。 pulp.LpVariable陣列上使用sum pulp.LpVariablepulp.LpAffineExpression相比確實很慢pulp.LpAffineExpression 根據已接受答案中的Google網上論壇討論,我可以讓我的代碼更快。 我知道這是一個古老的問題,但會包含一些不耐煩的抽象代碼。

最初的目標看起來像:

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

其中xspulp.LpVariable列表pulp.LpVariablek是浮點常數, ys是另一個pulp.LpVariable列表pulp.LpVariable

更快的版本是:

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

我沒有精確計算任何一個版本。 為了了解時差,在運行慢速版本時,我能夠在互聯網上搜索為什么紙漿可能如此慢,找到這個StackOverflow問題,閱讀鏈接的討論,並在表達式完成評估之前更新我的代碼。 第二個版本需要幾秒鍾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM