Как правильно использовать анонимный синтаксис конструкции для задачи оптимизации с несколькими ограничениями с помощью пакета JuMP Джулии? - PullRequest
0 голосов
/ 02 апреля 2019

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

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

enter image description here

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

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))

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

enter image description here

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

Для того, чтобы сделать этопросто я считал проблему плавающей, считая x 1 больше 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 Ответ

1 голос
/ 02 апреля 2019

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

@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)
...