#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. Теперь это работает. Спасибо за комментарий по поводу анонимности. Это более простая концепция, чем я думал.