LoadError: MethodError nonostante (apparentemente) utilizzi un codice funzionante

Oct 01 2020

Ciao ragazzi programmatori principianti qui

Sto cercando di risolvere un problema di programmazione lineare usando Julia e GLPK, con enfasi sul tentativo perché finora ho ricevuto errori indipendentemente da ciò che provo. Questo è il codice:

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

Da quello che posso dire l'errore è nella seconda riga, chiamando GLPK (o forse il primo perché non "importa" GLPK) Il codice sopra è il codice esatto che il mio docente ha caricato come soluzione al problema ma non lo farà eseguito sul mio PC Windows, sospettavo avesse qualcosa a che fare con Windows Defender, quindi ho provato senza, ho disinstallato e reinstallato Julia e Atom (ei pacchetti), ho provato a includere il codice anche direttamente nel terminale Julia come fare tutto questo sul mio laptop ma senza alcun risultato. Julia ver .: 1.5.2 e ho anche testato 1.0.5

Faccio fatica a capire cosa fare e nemmeno su Google sono riuscito a trovare nulla. Spero che la mia domanda non sia troppo stupida e apprezzerò molto una soluzione o informazioni!

Messaggio di errore:

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:\Users\Peter\.julia\packages\JuMP\iGamg\src\JuMP.jl:126
  Model(; caching_mode, solver) at C:\Users\Peter\.julia\packages\JuMP\iGamg\src\JuMP.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:\Users\Peter\.julia\packages\JuMP\iGamg\src\JuMP.jl:126
  ...
in expression starting at C:\Users\Peter\iCloudDrive\BSc\Introduktion til operationsanalyse\Opgaver\Week1Ex1.jl:2
top-level scope at Week1Ex1.jl:2
include_string(::Function, ::Module, ::String, ::String) at loading.jl:1088

Stato pkg ():

julia> Pkg.status()
Status `C:\Users\Peter\.julia\environments\v1.5\Project.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

Risposte

3 PrzemyslawSzufel Oct 01 2020 at 02:11

Forse questo esempio utilizza una vecchia versione dell'API che è cambiata qualcosa come un anno fa.

Prova (richiede almeno JuMP0.21.0):

m = Model(optimizer_with_attributes(GLPK.Optimizer))

Esiste anche una versione più breve se non si prevede di aggiungere attributi (o se JuMP è precedente a 0.21.0 ma almeno 0.18.0):

m = Model(with_optimizer(GLPK.Optimizer))

Tuttavia, finisco sempre per usare il primo. Un attributo comune che utilizzo sempre è il modo in cui voglio vedere i messaggi dettagliati, ad es .:

m = Model(optimizer_with_attributes(GLPK.Optimizer,  "msg_lev" => GLPK.GLP_MSG_ALL))

modificare

Guardando il tuo pacco statusfai quanto segue:

using Pkg
pkg"rm GLPKMathProgInterface"
pkg"up JuMP"

questo dovrebbe risolverti con le versioni dei pacchetti. Quando lo fai, la prima versione del mio codice funzionerà (ora hai una versione di JuMP obsoleta).

Inoltre, nota che Atomnon viene più mantenuto - considera il passaggio a VS CODE.

2 CameronBieganek Oct 01 2020 at 02:31

Raccogliere i miei commenti in una risposta per una lettura più facile.

Il pacchetto GLPKMathProgInterface.jl sta trattenendo la tua versione di GLPK.jl. Esegui quanto segue per aggiornare i tuoi pacchetti:

Pkg.rm("GLPKMathProgInterface")
Pkg.update()

In alternativa, puoi eseguire i comandi equivalenti in modalità pacchetto. Per accedere alla modalità pacchetto, digitare ]. Quindi in modalità pacchetto, esegui quanto segue:

(@v1.5) pkg> rm GLPKMathProgInterface

(@v1.5) pkg> update