Как преобразовать тип переменной при использовании 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Удалить целочисленное ограничение из переменной.

Документацию по этому поводу можно найти здесь.

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