2014-04-03 63 views
3

我正在使用Python 2.7並使用PuLP庫來設置問題。一旦定義了變量,目標和約束條件,我就會將我的LpProblem對象發送給其他地方的Solver。在未酸洗我的問題,我注意到,所有的變量是重複的:泡菜不和PuLP玩好

import pulp 
import pickle 

prob = pulp.LpProblem('test problem', pulp.LpMaximize) 
x = pulp.LpVariable('x', 0, 10) 
y = pulp.LpVariable('y', 3, 6) 
prob += x + y 
prob += x <= 5 

print prob 
print pickle.loads(pickle.dumps(prob)) 

第一個print語句輸出:

>>> print prob 
test problem: 
MAXIMIZE 
1*x + 1*y + 0 
SUBJECT TO 
_C1: x <= 5 

VARIABLES 
x <= 10 Continuous 
3 <= y <= 6 Continuous 

而第二打印:

>>> print pickle.loads(pickle.dumps(prob)) 
test problem: 
MAXIMIZE 
1*x + 1*y + 0 
SUBJECT TO 
_C1: x <= 5 

VARIABLES 
x <= 10 Continuous 
x <= 10 Continuous 
3 <= y <= 6 Continuous 
3 <= y <= 6 Continuous 

由於你可以看到,目標和限制都很好,但所有的變量都是重複的。造成這種行爲的原因是什麼,以及如何防止這種情況發生?

回答

1

所以我還沒有想出究竟爲什麼發生這種情況,但我有辦法解決它爲任何人停留在同樣的情況:

def UnpicklePulpProblem(pickled_problem): 
    wrong_result = pickle.loads(pickled_problem) 
    result = pulp.LpProblem(wrong_result.name, wrong_result.sense) 
    result += wrong_result.objective 
    for i in wrong_result.constraints: result += wrong_result.constraints[i], i 
    return result 

添加這樣的目標和約束可確保變量只在問題中定義一次,因爲你基本上是用這種方式從頭開始重新構建問題。

+0

當按照這種方法時,我發現我不能再添加約束的問題?當添加更多的約束,然後保存LP問題時,我再次得到「重複名稱」錯誤。所以,我嘗試用新添加的約束重複上述過程,但由於某些原因,這不起作用。 – denvar

+0

我發佈的評論的解決方法是:加載醃製LP問題,但不添加約束。然後,你得到一組新的約束,最後你合併約束(在OrderedDict上使用更新),然後將它們添加到一個大的去。 – denvar