มีตัวแก้จำนวนเต็มผสมที่ไม่ใช่เชิงเส้นในจูเลียหรือไม่?

Aug 20 2020

คุณช่วยกรุณาช่วยฉันเมื่อเกิดข้อผิดพลาดนี้ ERROR: Solver does not support discrete variables.

ตัวอย่างเช่นในรหัสต่อไปนี้

using JuMP,CPUTime, Distributions, Ipopt
#parameters--------------------------------------------------------
sig=0.86;
#---------------------------------------------------------------------------
ALT=Model(solver=IpoptSolver());
# variables-----------------------------------------------------------------
f(x) = cdf(Normal(0, 1), x);
JuMP.register(ALT, :f, 1, f; autodiff = true);
@variable(ALT, h >= 0);
@variable(ALT, L >= 0);
@variable(ALT, n, Int);
#-------------------------------------------------------------------
@NLexpression(ALT,k7,1-f(L-sig*sqrt(n))+f(-L-sig*sqrt(n)));
#constraints--------------------------------------------------------
@NLconstraint(ALT, f(-L) <= 1/400);
#-------------------------------------------------------------------
@NLobjective(ALT, Min, 1/k7)
solve(ALT)

เป็นไปได้อย่างไรในการแก้ปัญหา? ขอบคุณมาก ๆ.

คำตอบ

2 PrzemyslawSzufel Aug 20 2020 at 04:10

รายชื่อตัวแก้ JuMP ทั้งหมดและความสามารถของพวกเขาเกี่ยวกับประเภทโมเดลมีอยู่ที่นี่ https://jump.dev/JuMP.jl/dev/installation/

ตามรายการนี้ตัวแก้ปัญหาต่อไปนี้สนับสนุนการเขียนโปรแกรมแบบไม่เชิงเส้นจำนวนเต็ม:

  • KNITRO.jl
  • Juniper.jl
  • SCIP.jl

นอกจากนี้ยังมีข้อสังเกตAlpine.jlจาก Los Alamos ที่ไม่ได้กล่าวถึงในเอกสาร JuMP

Juniper.jlผมขอแนะนำให้พยายามที่จะเริ่มต้นด้วย เนื่องจากใช้ฮิวริสติกส์และตัวแก้ปัญหาอื่น ๆ คุณModelอาจมีลักษณะดังนี้:

m = Model(optimizer_with_attributes(Juniper.Optimizer, "nl_solver"=>optimizer_with_attributes(Ipopt.Optimizer, "print_level" => 0), "mip_solver"=>optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0)))