Ошибка загрузки: ошибка метода, несмотря на (казалось бы) использование рабочего кода

#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