Как правильно использовать синтаксис анонимного построения для задачи оптимизации с несколькими ограничениями с использованием пакета JuMP от Julia?

#macros #julia #modeling #linear-programming #julia-jump

#макросы #джулия #моделирование #линейное программирование #julia-jump

Вопрос:

Я использую Julia 1.0 с пакетом JuMP для решения задач оптимизации. Это мои первые дни использования языка. Следовательно, мне не очень нравится синтаксис.

Следуя быстрому руководству по началу работы, я смог решить проблему, описанную ниже:

введите описание изображения здесь

Я использовал этот код, который отлично работал:

 using JuMP

using GLPK

model = Model(with_optimizer(GLPK.Optimizer))

@variable(model, 0 <= x <= 6000)

@variable(model, 0 <= y <= 4000)

@objective(model, Max, (25*x)   (30*y))

@constraint(model, con, ((1/200)*x)   ((1/140)*y) <= 40)

optimize!(model)

termination_status(model)

primal_status(model)

dual_status(model)

println(objective_value(model))

println(value(x))

println(value(y))
  

Как следствие успеха вышеупомянутой реализации, я попытался адаптировать код к новой задаче:

введите описание изображения здесь

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

Чтобы упростить задачу, я рассматривал ее как проблему с плавающей точкой, считая, что x1 больше 0 и меньше 6.

Я решил использовать целочисленный аспект проблемы в качестве будущего шага.

Это мой код:

 using JuMP

using GLPK

model = Model(with_optimizer(GLPK.Optimizer))

@variable(model, 0 <= x <= 6)

@variable(model,  y>=0 )

@objective(model, Max, (x)   (2*y))

@constraint(model, con, x   y <= 8)
@constraint(model, con, -x   y <= 2)
@constraint(model, con, x - y <= 4)


optimize!(model)

termination_status(model)

primal_status(model)

dual_status(model)

println(objective_value(model))

println(value(x))

println(value(y))
  

По какой-то причине я получаю следующее сообщение об ошибке:

 ERROR: LoadError: An object of name con is already attached to this model. If this is intended, consider using the anonymous construction syntax, e.g., x = @variable(model, [1:N], ...) where the name of the object does not appear inside the macro.
  

Я попытался изменить некоторые вещи и прочитать документацию. Тем не менее, макросы кажутся мне странной концепцией.

После нескольких попыток я решил обратиться за помощью.

Заранее спасибо.

Ответ №1:

Я думаю, что сообщение довольно ясное. Итак, попробуйте что-то вроде:

 @constraint(model, con1, x   y <= 8)
@constraint(model, con2, -x   y <= 2)
@constraint(model, con3, x - y <= 4)
  

Конечно, в реальных моделях вы должны использовать осмысленные имена.

Анонимный означает без имен. Например.:

 @constraint(model, x   y <= 8)
@constraint(model, -x   y <= 2)
@constraint(model, x - y <= 4)
  

Комментарии:

1. Теперь это работает. Спасибо за комментарий по поводу анонимности. Это более простая концепция, чем я думал.