2016-11-16 12 views
0

Я пытаюсь линеаризовать ограничение на умножение, которое у меня есть в пульпе.Умножение в решении ограничений с пульпой (python)

Это выглядит примерно так:

prob += (1 - Y) * (3 - X) 

который равен:

prob += 3 - 3*Y - X + X*Y 

Где Y является бинарным переменным, В формуле всего линейный для следующей части, за исключением: Y*X. Я пытался решить эту проблему, используя формулу я нашел в другом вопросе:

Link to the picture

Link to the question

Так что я попытался с помощью 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. Есть ли способ решить эту проблему, используя первый метод подстановки, указанный в изображении формулы?

ответ

0

Основываясь на документации на своей странице PyPi, похоже, что вам может понадобиться просто вызвать значение вашего LpVariable. Это даст вам значение числа, которые затем можно использовать в вычислениях

https://pypi.python.org/pypi/PuLP

Вы можете получить значения переменных, используя значение(). например:

значение (х): 2,0

Так что ваша функция может быть в состоянии переписать в виде

prob += math.log(float(value(A))) = math.log(float(value(X))) + math.log(float(value(y))) 

Поплавок() заявления могут также быть ненужным, а так как он выглядит как LpVariables хранят свои внутренние номера как плавающие нормально

+0

Спасибо, но когда я это делаю, он говорит: аргумент «float() должен быть строкой или числом, а не« NoneType », и если я удалю объявления float(), это говорит «требуется поплавок». Я не думаю, что брать журнал LpVariable возможно. – WhatTheShrimp

+0

Вникнуть в исходный код модуля, получив значение другого вызова, извините. от их кода здесь - 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