Я пытаюсь линеаризовать ограничение на умножение, которое у меня есть в пульпе.Умножение в решении ограничений с пульпой (python)
Это выглядит примерно так:
prob += (1 - Y) * (3 - X)
который равен:
prob += 3 - 3*Y - X + X*Y
Где Y является бинарным переменным, В формуле всего линейный для следующей части, за исключением: Y*X
. Я пытался решить эту проблему, используя формулу я нашел в другом вопросе:
Так что я попытался с помощью X1*X2 = Y
, используя мой код это дает X*Y = A
. Я использовал метод подстановки журнала. Это дало мне следующий код:
prob += math.log(float(A)) = math.log(float(X)) + math.log(float(y))
и другое ограничение:
prob += 3 - 3*Y - X + A
Только это, кажется, не работает, потому что поплавок может быть только строкой или числом, а не LpVariable. Есть ли способ решить эту проблему, используя первый метод подстановки, указанный в изображении формулы?
Спасибо, но когда я это делаю, он говорит: аргумент «float() должен быть строкой или числом, а не« NoneType », и если я удалю объявления float(), это говорит «требуется поплавок». Я не думаю, что брать журнал LpVariable возможно. – WhatTheShrimp
Вникнуть в исходный код модуля, получив значение другого вызова, извините. от их кода здесь - https://github.com/coin-or/pulp/blob/master/src/pulp/pulp.py - в классе LpVariable: def value (self): return self.varValue поэтому для получения значения переменной является значение x.value(), а не значение (x), которое должно дать вам ваше значение, если для переменной присвоено значение. вам нужно будет сохранить часть float(), хотя внутри внутри этого класса не назначается значение типа float в классе LpVariable. – huma474