LoadError: MethodError แม้ว่า (ดูเหมือน) จะใช้รหัสการทำงาน

Oct 01 2020

สวัสดีพวกมือใหม่หัดเขียนโปรแกรมที่นี่

ฉันกำลังพยายามแก้ปัญหาการเขียนโปรแกรมเชิงเส้นโดยใช้ 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 Defender ดังนั้นลองโดยไม่ได้ฉันได้ถอนการติดตั้งและติดตั้ง Julia และ Atom ใหม่ (และแพ็คเกจ) ฉันได้ลองรวมรหัสโดยตรงในเทอร์มินัล Julia ด้วย ทำสิ่งเหล่านี้ทั้งหมดบนแล็ปท็อปของฉัน แต่ไม่มีประโยชน์ Julia เวอร์ชั่น: 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:\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

Pkg.status ():

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

คำตอบ

3 PrzemyslawSzufel Oct 01 2020 at 02:11

บางทีตัวอย่างนี้อาจใช้ API เวอร์ชันเก่าที่มีการเปลี่ยนแปลงบางอย่างเช่นหนึ่งปีที่ผ่านมา

ลอง (ต้องใช้อย่างน้อยJuMP0.21.0):

m = Model(optimizer_with_attributes(GLPK.Optimizer))

นอกจากนี้ยังมีเวอร์ชันที่สั้นกว่าหากคุณไม่ได้วางแผนที่จะเพิ่มแอตทริบิวต์ (หรือมี JuMP ที่เก่ากว่า 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"

สิ่งนี้จะช่วยให้คุณแยกออกเป็นรุ่นแพ็คเกจ เมื่อคุณทำเช่นนี้รหัสเวอร์ชันแรกของฉันจะใช้งานได้ (ตอนนี้คุณมีเวอร์ชัน JuMP ที่ล้าสมัยแล้ว)

นอกจากนี้โปรดทราบว่าAtomไม่มีการบำรุงรักษาอีกต่อไป - ลองเปลี่ยนไปใช้ VS CODE

2 CameronBieganek Oct 01 2020 at 02:31

รวบรวมความคิดเห็นของฉันเป็นคำตอบเพื่อให้อ่านง่ายขึ้น

แพ็คเกจ GLPKMathProgInterface.jl กำลังระงับ GLPK.jl เวอร์ชันของคุณ เรียกใช้สิ่งต่อไปนี้เพื่ออัปเดตแพ็กเกจของคุณ:

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

หรือคุณสามารถรันคำสั่งเทียบเท่าในโหมดแพ็กเกจ ]เพื่อเข้าสู่โหมดแพคเกจพิมพ์ จากนั้นในโหมดแพ็คเกจให้เรียกใช้สิ่งต่อไปนี้:

(@v1.5) pkg> rm GLPKMathProgInterface

(@v1.5) pkg> update