Как преобразовать тип переменной при использовании JuMP
Я использую Julia/JuMP для реализации алгоритма. В одной части я определяю модель с непрерывными переменными и решаю линейную модель. Я делаю некоторые другие вычисления, на основе которых я добавляю пару ограничений в модель, а затем хочу решить ту же проблему, но с целочисленными переменными. Я не мог использовать convert()
функция, так как она не принимает переменные.
Я попытался определить переменную снова как целое число, но модель, похоже, не учитывала это! Я предоставляю пример кода здесь:
m = Model()
@defVar(m, 0 <= x <= 5)
@setObjective(m, Max, x)
@addConstraint(m, con, x <= 3.1)
solve(m)
println(getValue(x))
@defVar(m, 0 <= x <= 1, Bin)
solve(m)
println(getValue(x))
Не могли бы вы помочь мне сделать это преобразование?
2 ответа
Проблема в том, что второй @variable(m, 0 <= x <= 1, Bin)
фактически создает новую переменную в модели, но с тем же именем в Юлии.
Чтобы изменить переменную из непрерывной в двоичную, вы можете сделать
setcategory(x, :Bin)
изменить границы переменных и класс перед вызовом решения снова.
В более новых версиях JuMP вам нужно использовать другую функцию, чем
setcategory
. Методы, которые вы ищете:
-
set_binary
Добавьте бинарное ограничение к переменной. -
unset_binary
Удалить бинарное ограничение из переменной. -
set_integer
Добавьте целочисленное ограничение к переменной. -
unset_integer
Удалить целочисленное ограничение из переменной.
Документацию по этому поводу можно найти здесь.