Рассол не играет хорошо с 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

Добавление цели и ограничения таким образом гарантирует, что переменные в задаче будут определены только один раз, так как вы в основном перестраиваете проблему с нуля таким образом.

Другие вопросы по тегам