#julia #linear-programming #glpk #julia-jump
#julia #линейное программирование #glpk #julia-jump
Вопрос:
Привет, ребята, новичок в программировании
Я пытаюсь решить проблему линейного программирования, используя Julia и GLPK, с акцентом на попытки, потому что до сих пор я получал ошибки независимо от того, что я пытаюсь. Это код:
using JuMP, GLPK
m = Model(GLPK.Optimizer)
@variable(m, x1 >= 0 )
@variable(m, x2 >= 0 )
@variable(m, x3 >= 0 )
@objective(m, Max, 200x1 200x2 700x3 )
@constraint(m, 2x1 x2 3x3 <= 22 )
@constraint(m, x1 2x2 4x3 <= 20 )
@constraint(m, x1 x2 x3 <= 10 )
optimize!(m)
println("Objective value: ", JuMP.objective_value(m))
println("x1 = ", JuMP.value(x1))
println("x2 = ", JuMP.value(x2))
println("x2 = ", JuMP.value(x3))
Из того, что я могу сказать, ошибка во второй строке, вызывающей GLPK (или, может быть, в первой, потому что она не «импортирует» GLPK)
Приведенный выше код — это точный код, который мой лектор загрузил в качестве решения проблемы, но он не будет работать на моем ПК с Windows, я подозревал, что это как-то связано с защитником Windows, поэтому попробовал без, я удалил и переустановил Julia и Atom (и пакеты), я попытался включить коднепосредственно в терминале Julia, а также выполнение всего этого на моем ноутбуке, но безрезультатно. Julia ver.: 1.5.2 и я также протестировал 1.0.5
Мне трудно понять, что делать, и я тоже ничего не смог найти в Google. Я надеюсь, что мой вопрос не слишком глуп, и я буду очень признателен за решение или информацию!
Сообщение об ошибке:
LoadError: MethodError: no method matching Model(::Type{GLPK.Optimizer})
Closest candidates are:
Model(::Any, !Matched::Any, !Matched::Any, !Matched::Any, !Matched::Any, !Matched::Any, !Matched::Any, !Matched::Any) at C:UsersPeter.juliapackagesJuMPiGamgsrcJuMP.jl:126
Model(; caching_mode, solver) at C:UsersPeter.juliapackagesJuMPiGamgsrcJuMP.jl:161
Model(!Matched::MathOptInterface.AbstractOptimizer, !Matched::Dict{MathOptInterface.ConstraintIndex,AbstractShape}, !Matched::Set{Any}, !Matched::Any, !Matched::Any, !Matched::Dict{Symbol,Any}, !Matched::Int64, !Matched::Dict{Symbol,Any}) at C:UsersPeter.juliapackagesJuMPiGamgsrcJuMP.jl:126
...
in expression starting at C:UsersPeteriCloudDriveBScIntroduktion til operationsanalyseOpgaverWeek1Ex1.jl:2
top-level scope at Week1Ex1.jl:2
include_string(::Function, ::Module, ::String, ::String) at loading.jl:1088
Pkg.status():
julia> Pkg.status()
Status `C:UsersPeter.juliaenvironmentsv1.5Project.toml`
[c52e3926] Atom v0.12.21
[60bf3e95] GLPK v0.13.0
[3c7084bd] GLPKMathProgInterface v0.5.0
[4076af6c] JuMP v0.20.0
[e5e0dc1b] Juno v0.8.3
Комментарии:
1. Можете ли вы добавить ошибку stacktrace к вашему вопросу?
2. Какую версию Julia вы используете?
3. Было бы легче прочитать трассировку стека, если вы отредактируете свой вопрос, чтобы включить трассировку стека в качестве фрагмента кода. 🙂
4. Да, я понял: P Я добавил это к вопросу сейчас
5. Ваш код работает на моем Mac. Попробуйте запустить
using Pkg; Pkg.status()
свой Julia REPL и вставить результат этого в свой вопрос.
Ответ №1:
Возможно, в этом примере используется старая версия API, которая изменилась примерно год назад.
Попробуйте (требуется не менее JuMP
0.21.0):
m = Model(optimizer_with_attributes(GLPK.Optimizer))
Существует также более короткая версия, если вы не планируете добавлять атрибуты (или переход старше 0.21.0, но не менее 0.18.0):
m = Model(with_optimizer(GLPK.Optimizer))
Тем не менее, я всегда в конечном итоге использую первый. Один общий атрибут, который я всегда использую, — это то, насколько подробные сообщения я хочу видеть, например.:
m = Model(optimizer_with_attributes(GLPK.Optimizer, "msg_lev" => GLPK.GLP_MSG_ALL))
Редактировать
Просматривая ваш пакет status
, выполните следующие действия:
using Pkg
pkg"rm GLPKMathProgInterface"
pkg"up JuMP"
это должно помочь вам разобраться с версиями пакетов. Когда вы сделаете это, первая версия моего кода будет работать (теперь у вас устаревшая версия перехода).
Кроме того, обратите внимание, что Atom
это больше не поддерживается — подумайте о переходе на VS CODE.
Комментарии:
1.
optimizer_with_attributes
был добавлен в Jump 0.21.0 (так что это последняя версия), новый API был представлен в JuMP 0.18.0, насколько я помню. Так что все зависит от того, какую версию вы используете!
Ответ №2:
Собираю мои комментарии в ответ для облегчения чтения.
Пакет glpkmathprogin Interface.jl задерживает вашу версию GLPK.jl. Выполните следующее, чтобы обновить свои пакеты:
Pkg.rm("GLPKMathProgInterface")
Pkg.update()
Кроме того, вы можете запускать эквивалентные команды в пакетном режиме. Чтобы перейти в режим пакета, введите ]
. Затем в режиме пакета выполните следующее:
(@v1.5) pkg> rm GLPKMathProgInterface
(@v1.5) pkg> update