diff --git a/src/ADNLPProblems/ackley.jl b/src/ADNLPProblems/ackley.jl new file mode 100644 index 00000000..f2314fbc --- /dev/null +++ b/src/ADNLPProblems/ackley.jl @@ -0,0 +1,14 @@ +export ackley + +function ackley(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + function f(x) + n = length(x) + sum1 = sum(x[i]^2 for i = 1:n) + sum2 = sum(cos(2 * T(π) * x[i]) for i = 1:n) + return -20 * exp(-T(0.2) * sqrt(sum1 / n)) - exp(sum2 / n) + 20 + T(ℯ) + end + x0 = zeros(T, n) + lvar = fill(T(-32.768), n) + uvar = fill(T(32.768), n) + return ADNLPModels.ADNLPModel(f, x0; lvar = lvar, uvar = uvar, name = "ackley", kwargs...) +end diff --git a/src/ADNLPProblems/griewank.jl b/src/ADNLPProblems/griewank.jl new file mode 100644 index 00000000..9d6edef3 --- /dev/null +++ b/src/ADNLPProblems/griewank.jl @@ -0,0 +1,19 @@ +export griewank + +function griewank(; n::Int = default_nvar, type::Type{T} = Float64, x0::Union{Nothing,AbstractVector} = nothing, kwargs...) where {T} + function f(x) + n = length(x) + sum_term = sum(x[i]^2 for i = 1:n) / T(4000) + prod_term = prod(cos(x[i] / sqrt(T(i))) for i = 1:n) + return sum_term - prod_term + one(T) + end + if x0 === nothing + x0 = zeros(T, n) + else + length(x0) == n || throw(ArgumentError("griewank: length(x0) = $(length(x0)) must equal n = $n")) + x0 = T.(x0) + end + lvar = fill(T(-600), n) + uvar = fill(T(600), n) + return ADNLPModels.ADNLPModel(f, x0; lvar = lvar, uvar = uvar, name = "griewank", kwargs...) +end diff --git a/src/ADNLPProblems/rastrigin.jl b/src/ADNLPProblems/rastrigin.jl new file mode 100644 index 00000000..54c8a7a5 --- /dev/null +++ b/src/ADNLPProblems/rastrigin.jl @@ -0,0 +1,12 @@ +export rastrigin + +function rastrigin(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + function f(x) + n = length(x) + return 10 * n + sum(x[i]^2 - 10 * cos(2 * T(π) * x[i]) for i = 1:n) + end + x0 = zeros(T, n) + lvar = fill(T(-5.12), n) + uvar = fill(T(5.12), n) + return ADNLPModels.ADNLPModel(f, x0, lvar = lvar, uvar = uvar, name = "rastrigin"; kwargs...) +end diff --git a/src/ADNLPProblems/sphere.jl b/src/ADNLPProblems/sphere.jl new file mode 100644 index 00000000..be5cc180 --- /dev/null +++ b/src/ADNLPProblems/sphere.jl @@ -0,0 +1,11 @@ +export sphere + +function sphere(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + function f(x) + return sum(x[i]^2 for i = 1:length(x)) + end + x0 = zeros(T, n) + lvar = fill(T(-1), n) + uvar = fill(T(1), n) + return ADNLPModels.ADNLPModel(f, x0; lvar = lvar, uvar = uvar, name = "sphere", kwargs...) +end diff --git a/src/Meta/ackley.jl b/src/Meta/ackley.jl new file mode 100644 index 00000000..7708fdec --- /dev/null +++ b/src/Meta/ackley.jl @@ -0,0 +1,48 @@ +ackley_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "ackley", + :has_equalities_only => false, + :has_inequalities_only => false, + :has_bounds => true, + :has_fixed_variables => false, + :objtype => :other, + :contype => :unconstrained, + :best_known_lower_bound => 0.0, + :best_known_upper_bound => 0.0, + :is_feasible => true, + :defined_everywhere => missing, + :origin => :modelling, + :implementation => :both, + :url => "https://doi.org/10.1007/978-1-4613-1997-9", + :notes => raw""" +A non-convex multimodal function commonly used as a performance test problem for +global optimization algorithms. The function has a global minimum of 0 at the origin +and is surrounded by a nearly flat outer region that makes gradient-based methods difficult. +The search domain is [-32.768, 32.768]^n. +""", + :origin_notes => raw""" +Proposed by David Ackley in his 1987 PhD dissertation. +The n-dimensional generalization is due to Bäck and Schwefel (1993). +""", + :reference => raw""" +@book{Ackley1987, + author = {Ackley, David H.}, + title = {A Connectionist Machine for Genetic Hillclimbing}, + publisher = {Kluwer Academic Publishers}, + address = {Boston, MA}, + year = {1987}, + doi = {10.1007/978-1-4613-1997-9} +} +""", + :lib => "", +) +get_ackley_nvar(; n::Int = default_nvar, kwargs...) = n +get_ackley_ncon(; n::Int = default_nvar, kwargs...) = 0 +get_ackley_nlin(; n::Int = default_nvar, kwargs...) = 0 +get_ackley_nnln(; n::Int = default_nvar, kwargs...) = 0 +get_ackley_nequ(; n::Int = default_nvar, kwargs...) = 0 +get_ackley_nineq(; n::Int = default_nvar, kwargs...) = 0 diff --git a/src/Meta/griewank.jl b/src/Meta/griewank.jl new file mode 100644 index 00000000..2edf3272 --- /dev/null +++ b/src/Meta/griewank.jl @@ -0,0 +1,49 @@ +griewank_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "griewank", + :has_equalities_only => false, + :has_inequalities_only => false, + :has_bounds => true, + :has_fixed_variables => false, + :objtype => :other, + :contype => :unconstrained, + :best_known_lower_bound => 0.0, + :best_known_upper_bound => 0.0, + :is_feasible => true, + :defined_everywhere => missing, + :origin => :modelling, + :implementation => :both, + :url => "https://doi.org/10.1007/BF00933356", + :notes => raw""" +A multimodal function composed of a quadratic term and a cosine modulation. +The global minimum of 0 is at the origin. The search domain is [-600, 600]^n. +The function becomes easier as dimension increases due to the product term +being averaged out. +""", + :origin_notes => raw""" +Introduced by Andreas Griewank in 1981. +""", + :reference => raw""" +@article{Griewank1981, + author = {Griewank, Andreas O.}, + title = {Generalized Descent for Global Optimization}, + journal = {Journal of Optimization Theory and Applications}, + volume = {34}, + number = {1}, + pages = {11--39}, + year = {1981}, + doi = {10.1007/BF00933356} +} +""", + :lib => "", +) +get_griewank_nvar(; n::Int = default_nvar, kwargs...) = n +get_griewank_ncon(; n::Int = default_nvar, kwargs...) = 0 +get_griewank_nlin(; n::Int = default_nvar, kwargs...) = 0 +get_griewank_nnln(; n::Int = default_nvar, kwargs...) = 0 +get_griewank_nequ(; n::Int = default_nvar, kwargs...) = 0 +get_griewank_nineq(; n::Int = default_nvar, kwargs...) = 0 diff --git a/src/Meta/rastrigin.jl b/src/Meta/rastrigin.jl new file mode 100644 index 00000000..fe8c2ebf --- /dev/null +++ b/src/Meta/rastrigin.jl @@ -0,0 +1,47 @@ +rastrigin_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "rastrigin", + :has_equalities_only => false, + :has_inequalities_only => false, + :has_bounds => true, + :has_fixed_variables => false, + :objtype => :other, + :contype => :unconstrained, + :best_known_lower_bound => 0.0, + :best_known_upper_bound => 0.0, + :is_feasible => true, + :defined_everywhere => missing, + :origin => :modelling, + :implementation => :both, + :url => "", + :notes => raw""" +A non-convex multimodal function based on cosine modulation. The global minimum +of 0 is at the origin. The search domain is [-5.12, 5.12]^n. The large number +of local minima makes it a difficult test problem for global optimizers. +""", + :origin_notes => raw""" +First proposed by L.A. Rastrigin in 1974 as a 2-dimensional function. +The n-dimensional generalization is due to Rudolph (1990) and was popularized +by Hoffmeister & Bäck (1991) and Mühlenbein et al. (1991). +""", + :reference => raw""" +@book{Rastrigin1974, + author = {Rastrigin, L. A.}, + title = {Systems of Extremal Control}, + publisher = {Nauka}, + address = {Moscow}, + year = {1974} +} +""", + :lib => "", +) +get_rastrigin_nvar(; n::Int = default_nvar, kwargs...) = n +get_rastrigin_ncon(; n::Int = default_nvar, kwargs...) = 0 +get_rastrigin_nlin(; n::Int = default_nvar, kwargs...) = 0 +get_rastrigin_nnln(; n::Int = default_nvar, kwargs...) = 0 +get_rastrigin_nequ(; n::Int = default_nvar, kwargs...) = 0 +get_rastrigin_nineq(; n::Int = default_nvar, kwargs...) = 0 diff --git a/src/Meta/sphere.jl b/src/Meta/sphere.jl new file mode 100644 index 00000000..acf18b5a --- /dev/null +++ b/src/Meta/sphere.jl @@ -0,0 +1,48 @@ +sphere_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "sphere", + :has_equalities_only => false, + :has_inequalities_only => false, + :has_bounds => true, + :has_fixed_variables => false, + :objtype => :quadratic, + :contype => :unconstrained, + :best_known_lower_bound => 0.0, + :best_known_upper_bound => 0.0, + :is_feasible => true, + :defined_everywhere => missing, + :origin => :modelling, + :implementation => :both, + :url => "https://doi.org/10.1145/355934.355936", + :notes => raw""" +The simplest convex test function: sum of squares. The global minimum of 0 is +at the origin. The search domain is [-1, 1]^n in this implementation. +""", + :origin_notes => raw""" +A classic unconstrained optimization test problem, also known as the De Jong +function 1. Commonly listed as problem 1 in Moré, Garbow and Hillstrom (1981). +""", + :reference => raw""" +@article{MoreGarbowHillstrom1981, + author = {Mor{\'e}, Jorge J. and Garbow, Burton S. and Hillstrom, Kenneth E.}, + title = {Testing Unconstrained Optimization Software}, + journal = {ACM Transactions on Mathematical Software}, + year = {1981}, + volume = {7}, + number = {1}, + pages = {17--41}, + doi = {10.1145/355934.355936} +} +""", + :lib => "", +) +get_sphere_nvar(; n::Int = default_nvar, kwargs...) = n +get_sphere_ncon(; n::Int = default_nvar, kwargs...) = 0 +get_sphere_nlin(; n::Int = default_nvar, kwargs...) = 0 +get_sphere_nnln(; n::Int = default_nvar, kwargs...) = 0 +get_sphere_nequ(; n::Int = default_nvar, kwargs...) = 0 +get_sphere_nineq(; n::Int = default_nvar, kwargs...) = 0 diff --git a/src/PureJuMP/ackley.jl b/src/PureJuMP/ackley.jl new file mode 100644 index 00000000..43e99a57 --- /dev/null +++ b/src/PureJuMP/ackley.jl @@ -0,0 +1,23 @@ +export ackley + +"Ackley multimodal minimization problem" +function ackley(args...; n::Int = default_nvar, kwargs...) + n < 1 && @warn("ackley: number of variables must be ≥ 1") + n = max(1, n) + + nlp = Model() + + x0 = zeros(n) + @variable(nlp, -32.768 <= x[i = 1:n] <= 32.768, start = x0[i]) + + @objective( + nlp, + Min, + -20 * exp(-0.2 * sqrt(sum(x[i]^2 for i = 1:n) / n)) - + exp(sum(cos(2 * π * x[i]) for i = 1:n) / n) + + 20 + + exp(1) + ) + + return nlp +end diff --git a/src/PureJuMP/griewank.jl b/src/PureJuMP/griewank.jl new file mode 100644 index 00000000..347a7010 --- /dev/null +++ b/src/PureJuMP/griewank.jl @@ -0,0 +1,24 @@ +export griewank + +"Griewank multimodal minimization problem" +function griewank(args...; n::Int = default_nvar, x0::Union{Nothing,AbstractVector} = nothing, kwargs...) + n < 1 && @warn("griewank: number of variables must be ≥ 1") + n = max(1, n) + + nlp = Model() + + if x0 === nothing + x0 = zeros(n) + elseif length(x0) != n + throw(ArgumentError("griewank: length(x0) = $(length(x0)) must equal n = $n")) + end + @variable(nlp, -600 <= x[i = 1:n] <= 600, start = x0[i]) + + @objective( + nlp, + Min, + sum(x[i]^2 for i = 1:n) / 4000 - prod(cos(x[i] / sqrt(i)) for i = 1:n) + 1 + ) + + return nlp +end diff --git a/src/PureJuMP/rastrigin.jl b/src/PureJuMP/rastrigin.jl new file mode 100644 index 00000000..d4a0a1ad --- /dev/null +++ b/src/PureJuMP/rastrigin.jl @@ -0,0 +1,16 @@ +export rastrigin + +"Rastrigin multimodal minimization problem" +function rastrigin(args...; n::Int = default_nvar, kwargs...) + n < 1 && @warn("rastrigin: number of variables must be ≥ 1") + n = max(1, n) + + nlp = Model() + + x0 = [0.0 for i = 1:n] + @variable(nlp, x[i = 1:n], lower_bound = -5.12, upper_bound = 5.12, start = x0[i]) + + @objective(nlp, Min, 10 * n + sum(x[i]^2 - 10 * cos(2 * π * x[i]) for i = 1:n)) + + return nlp +end diff --git a/src/PureJuMP/sphere.jl b/src/PureJuMP/sphere.jl new file mode 100644 index 00000000..32da7f77 --- /dev/null +++ b/src/PureJuMP/sphere.jl @@ -0,0 +1,16 @@ +export sphere + +"Sphere convex minimization problem" +function sphere(args...; n::Int = default_nvar, kwargs...) + n < 1 && @warn("sphere: number of variables must be ≥ 1") + n = max(1, n) + + nlp = Model() + + x0 = zeros(n) + @variable(nlp, -1 <= x[i = 1:n] <= 1, start = x0[i]) + + @objective(nlp, Min, sum(x[i]^2 for i = 1:n)) + + return nlp +end