Apakah ada pemecah bilangan bulat campuran non-linier di Julia?

Aug 20 2020

tolong bantu saya dalam kesalahan ini. ERROR: Solver does not support discrete variables.

misalnya pada kode berikut

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)

Bagaimana mungkin untuk memecahkan masalah tersebut? Terima kasih banyak.

Jawaban

2 PrzemyslawSzufel Aug 20 2020 at 04:10

Daftar lengkap pemecah JuMP dan kemampuannya sehubungan dengan jenis model tersedia di sini https://jump.dev/JuMP.jl/dev/installation/

Menurut daftar ini pemecah berikut mendukung pemrograman nonlinier campuran-bilangan bulat:

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

Ada juga yang perlu diperhatikan Alpine.jldari Los Alamos yang tidak disebutkan dalam dokumen JuMP.

Saya sarankan untuk mencoba memulai Juniper.jl. Karena menggunakan heuristik dan pemecah lain yang Anda buat Modeldapat terlihat seperti ini:

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