Рассол не играет хорошо с PuLP
Я работаю в Python 2.7 и использую библиотеку PuLP для установки проблемы. Как только переменные, цель и ограничения определены, я выбираю свой объект LpProblem, чтобы отправить его Солверу в другое место. После устранения проблемы я замечаю, что все переменные дублируются:
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 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
Добавление цели и ограничения таким образом гарантирует, что переменные в задаче будут определены только один раз, так как вы в основном перестраиваете проблему с нуля таким образом.