From 2646d296301568c646e7228c6d9cc698f306eb00 Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Sat, 7 Sep 2024 17:16:09 +0530 Subject: [PATCH 01/20] MOO Docs updated blackboxoptim.md Added documentation for MOO in BBO --- .../src/optimization_packages/blackboxoptim.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/src/optimization_packages/blackboxoptim.md b/docs/src/optimization_packages/blackboxoptim.md index ca5b2385b..738add663 100644 --- a/docs/src/optimization_packages/blackboxoptim.md +++ b/docs/src/optimization_packages/blackboxoptim.md @@ -67,3 +67,21 @@ prob = Optimization.OptimizationProblem(f, x0, p, lb = [-1.0, -1.0], ub = [1.0, sol = solve(prob, BBO_adaptive_de_rand_1_bin_radiuslimited(), maxiters = 100000, maxtime = 1000.0) ``` + +## Multi-objective optimization +The optimizer for Multi-Objective Optimization is `BBO_borg_moea()`. Your fitness function should return a tuple of the objective values and you should indicate the fitness scheme to be (typically) Pareto fitness and specify the number of objectives. Otherwise, the use is similar, here is an example: + +```@example MOO-BBO +using OptimizationBBO, Optimization, BlackBoxOptim +using SciMLBase: MultiObjectiveOptimizationFunction +u0 = [0.25, 0.25] +opt = OptimizationBBO.BBO_borg_moea() +function multi_obj_func_2(x, p) + f1 = (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2 # Rosenbrock function + f2 = -20.0 * exp(-0.2 * sqrt(0.5 * (x[1]^2 + x[2]^2))) - exp(0.5 * (cos(2π * x[1]) + cos(2π * x[2]))) + exp(1) + 20.0 # Ackley function + return (f1, f2) +end +mof = MultiObjectiveOptimizationFunction(multi_obj_func_2) +prob = Optimization.OptimizationProblem(mof_2, u0; lb = [0.0, 0.0], ub = [2.0, 2.0]) +sol = solve(prob_2, opt, NumDimensions=2, FitnessScheme=ParetoFitnessScheme{2}(is_minimizing=true)) +``` From 79a297b11f24d287f987b280f5b8e335bb388ae6 Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Fri, 20 Sep 2024 21:52:51 +0530 Subject: [PATCH 02/20] Update evolutionary.md MOO docs update. --- .../src/optimization_packages/evolutionary.md | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/src/optimization_packages/evolutionary.md b/docs/src/optimization_packages/evolutionary.md index 9fa582c74..9ed2a2645 100644 --- a/docs/src/optimization_packages/evolutionary.md +++ b/docs/src/optimization_packages/evolutionary.md @@ -41,3 +41,23 @@ f = OptimizationFunction(rosenbrock) prob = Optimization.OptimizationProblem(f, x0, p, lb = [-1.0, -1.0], ub = [1.0, 1.0]) sol = solve(prob, Evolutionary.CMAES(μ = 40, λ = 100)) ``` + +## Multi-objective optimization +The Rosenbrock and Ackley functions can be optimized using the `Evolutionary.NSGA2()` as follows: + +```@example MOO-Evolutionary +using Optimization, OptimizationEvolutionary +function func(x, p=nothing)::Vector{Float64} + f1 = (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2 # Rosenbrock function + f2 = -20.0 * exp(-0.2 * sqrt(0.5 * (x[1]^2 + x[2]^2))) - exp(0.5 * (cos(2π * x[1]) + cos(2π * x[2]))) + exp(1) + 20.0 # Ackley function + return [f1, f2] +end +initial_guess = [1.0, 1.0] +function gradient_multi_objective(x, p=nothing) + ForwardDiff.jacobian(func, x) +end +obj_func = MultiObjectiveOptimizationFunction(func, jac=gradient_multi_objective) +algorithm = OptimizationEvolutionary.NSGA2() +problem = OptimizationProblem(obj_func, initial_guess) +result = solve(problem, algorithm) +``` From 1394ec40eaea45fb84a3972f9dde200201131bf1 Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Fri, 20 Sep 2024 21:59:09 +0530 Subject: [PATCH 03/20] Update metaheuristics.md MOO docs update. --- .../optimization_packages/metaheuristics.md | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/docs/src/optimization_packages/metaheuristics.md b/docs/src/optimization_packages/metaheuristics.md index ae1694bcc..53b6750ad 100644 --- a/docs/src/optimization_packages/metaheuristics.md +++ b/docs/src/optimization_packages/metaheuristics.md @@ -70,3 +70,54 @@ sol = solve(prob, ECA(), use_initial = true, maxiters = 100000, maxtime = 1000.0 ### With Constraint Equations While `Metaheuristics.jl` supports such constraints, `Optimization.jl` currently does not relay these constraints. + + +## Multi-objective optimization +The zdt1 functions can be optimized using the `Metaheuristics.jl` as follows: + +```@example MOO-Evolutionary +using Optimization, OptimizationEvolutionary +function zdt1(x) + f1 = x[1] + g = 1 + 9 * mean(x[2:end]) + h = 1 - sqrt(f1 / g) + f2 = g * h + # In this example, we have no constraints + gx = [0.0] # Inequality constraints (not used) + hx = [0.0] # Equality constraints (not used) + return [f1, f2], gx, hx +end +multi_obj_fun = MultiObjectiveOptimizationFunction((x, p) -> zdt1(x)) + +# Define the problem bounds +lower_bounds = [0.0, 0.0, 0.0] +upper_bounds = [1.0, 1.0, 1.0] + +# Define the initial guess +initial_guess = [0.5, 0.5, 0.5] + +# Create the optimization problem +prob = OptimizationProblem(multi_obj_fun, initial_guess; lb = lower_bounds, ub = upper_bounds) + +nobjectives = 2 +npartitions = 100 + +# reference points (Das and Dennis's method) +weights = gen_ref_dirs(nobjectives, npartitions) + +# Choose the algorithm as required. +alg1 = NSGA2() +alg2 = NSGA3() +alg3 = SPEA2() +alg4 = CCMO(NSGA2(N=100, p_m=0.001)) +alg5 = MOEAD_DE(weights, options=Options(debug=false, iterations = 250)) +alg6 = SMS_EMOA() + +# Solve the problem +sol1 = solve(prob, alg1; maxiters = 100, use_initial = true) +sol2 = solve(prob, alg2; maxiters = 100, use_initial = true) +sol3 = solve(prob, alg3; maxiters = 100, use_initial = true) +sol4 = solve(prob, alg4) +sol5 = solve(prob, alg5; maxiters = 100, use_initial = true) +sol6 = solve(prob, alg6; maxiters = 100, use_initial = true) +``` From 5af0e2bb7943373ccf827cc22475632419edfc00 Mon Sep 17 00:00:00 2001 From: Vaibhav Kumar Dixit Date: Sat, 21 Sep 2024 21:10:29 -0400 Subject: [PATCH 04/20] Update docs/src/optimization_packages/blackboxoptim.md --- docs/src/optimization_packages/blackboxoptim.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/optimization_packages/blackboxoptim.md b/docs/src/optimization_packages/blackboxoptim.md index 738add663..010bd63fe 100644 --- a/docs/src/optimization_packages/blackboxoptim.md +++ b/docs/src/optimization_packages/blackboxoptim.md @@ -69,7 +69,7 @@ sol = solve(prob, BBO_adaptive_de_rand_1_bin_radiuslimited(), maxiters = 100000, ``` ## Multi-objective optimization -The optimizer for Multi-Objective Optimization is `BBO_borg_moea()`. Your fitness function should return a tuple of the objective values and you should indicate the fitness scheme to be (typically) Pareto fitness and specify the number of objectives. Otherwise, the use is similar, here is an example: +The optimizer for Multi-Objective Optimization is `BBO_borg_moea()`. Your objective function should return a tuple of the objective values and you should indicate the fitness scheme to be (typically) Pareto fitness and specify the number of objectives. Otherwise, the use is similar, here is an example: ```@example MOO-BBO using OptimizationBBO, Optimization, BlackBoxOptim From 37aa52bbd3a9e4212cdbbf3b90faf4cdc9838489 Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Sun, 22 Sep 2024 10:22:10 +0530 Subject: [PATCH 05/20] Update Project.toml updated project.toml for the docs. --- docs/Project.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Project.toml b/docs/Project.toml index 060076341..4a95e33df 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -42,6 +42,7 @@ SymbolicAnalysis = "4297ee4d-0239-47d8-ba5d-195ecdf594fe" Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" +BlackBoxOptim = "a134a8b2-14d6-55f6-9291-3336d3ab0209" [compat] AmplNLWriter = "1" From 81f5e8a8d4d6049acdc67eb045cba0f4f8a9b285 Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Sun, 22 Sep 2024 10:23:06 +0530 Subject: [PATCH 06/20] Update Project.toml Added compat for BBO. --- docs/Project.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Project.toml b/docs/Project.toml index 4a95e33df..3559510a1 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -87,3 +87,4 @@ SymbolicAnalysis = "0.3" Symbolics = "6" Tracker = ">= 0.2" Zygote = ">= 0.5" +BlackBoxOptim = "0.6" From 238dcbe13bc2963978dd1b24d0c24d370afd3278 Mon Sep 17 00:00:00 2001 From: Vaibhav Kumar Dixit Date: Sun, 22 Sep 2024 13:28:57 -0400 Subject: [PATCH 07/20] Update docs/src/optimization_packages/blackboxoptim.md --- docs/src/optimization_packages/blackboxoptim.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/optimization_packages/blackboxoptim.md b/docs/src/optimization_packages/blackboxoptim.md index 010bd63fe..ae512ca9f 100644 --- a/docs/src/optimization_packages/blackboxoptim.md +++ b/docs/src/optimization_packages/blackboxoptim.md @@ -82,6 +82,6 @@ function multi_obj_func_2(x, p) return (f1, f2) end mof = MultiObjectiveOptimizationFunction(multi_obj_func_2) -prob = Optimization.OptimizationProblem(mof_2, u0; lb = [0.0, 0.0], ub = [2.0, 2.0]) +prob = Optimization.OptimizationProblem(mof, u0; lb = [0.0, 0.0], ub = [2.0, 2.0]) sol = solve(prob_2, opt, NumDimensions=2, FitnessScheme=ParetoFitnessScheme{2}(is_minimizing=true)) ``` From 9198cb42a40d01befb47b5fae1c3e91f78704242 Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Tue, 24 Sep 2024 02:06:07 +0530 Subject: [PATCH 08/20] Update metaheuristics.md Added required packages for MOO docs. --- docs/src/optimization_packages/metaheuristics.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/optimization_packages/metaheuristics.md b/docs/src/optimization_packages/metaheuristics.md index 53b6750ad..13fd60651 100644 --- a/docs/src/optimization_packages/metaheuristics.md +++ b/docs/src/optimization_packages/metaheuristics.md @@ -76,7 +76,7 @@ While `Metaheuristics.jl` supports such constraints, `Optimization.jl` currently The zdt1 functions can be optimized using the `Metaheuristics.jl` as follows: ```@example MOO-Evolutionary -using Optimization, OptimizationEvolutionary +using Optimization, OptimizationEvolutionary,OptimizationMetaheuristics, Metaheuristics function zdt1(x) f1 = x[1] g = 1 + 9 * mean(x[2:end]) @@ -103,7 +103,7 @@ nobjectives = 2 npartitions = 100 # reference points (Das and Dennis's method) -weights = gen_ref_dirs(nobjectives, npartitions) +weights = Metaheuristics.gen_ref_dirs(nobjectives, npartitions) # Choose the algorithm as required. alg1 = NSGA2() From be6388baa36b67d3edb5c5081023d36d37460828 Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Tue, 24 Sep 2024 02:07:13 +0530 Subject: [PATCH 09/20] Update Project.toml added required packages for MOO --- docs/Project.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/Project.toml b/docs/Project.toml index 3559510a1..c722e4e2b 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -43,6 +43,7 @@ Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" BlackBoxOptim = "a134a8b2-14d6-55f6-9291-3336d3ab0209" +Metaheuristics = "bcdb8e00-2c21-11e9-3065-2b553b22f898" [compat] AmplNLWriter = "1" @@ -88,3 +89,5 @@ Symbolics = "6" Tracker = ">= 0.2" Zygote = ">= 0.5" BlackBoxOptim = "0.6" +Metaheuristics = "3" + From 5b3a0b518ccd5f9f164f5c91cc02968120a0185a Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Tue, 24 Sep 2024 02:08:41 +0530 Subject: [PATCH 10/20] Update blackboxoptim.md Corrected function names for MOO docs. --- docs/src/optimization_packages/blackboxoptim.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/src/optimization_packages/blackboxoptim.md b/docs/src/optimization_packages/blackboxoptim.md index ae512ca9f..ce17f3b1b 100644 --- a/docs/src/optimization_packages/blackboxoptim.md +++ b/docs/src/optimization_packages/blackboxoptim.md @@ -76,12 +76,12 @@ using OptimizationBBO, Optimization, BlackBoxOptim using SciMLBase: MultiObjectiveOptimizationFunction u0 = [0.25, 0.25] opt = OptimizationBBO.BBO_borg_moea() -function multi_obj_func_2(x, p) +function multi_obj_func(x, p) f1 = (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2 # Rosenbrock function f2 = -20.0 * exp(-0.2 * sqrt(0.5 * (x[1]^2 + x[2]^2))) - exp(0.5 * (cos(2π * x[1]) + cos(2π * x[2]))) + exp(1) + 20.0 # Ackley function return (f1, f2) end -mof = MultiObjectiveOptimizationFunction(multi_obj_func_2) +mof = MultiObjectiveOptimizationFunction(multi_obj_func) prob = Optimization.OptimizationProblem(mof, u0; lb = [0.0, 0.0], ub = [2.0, 2.0]) -sol = solve(prob_2, opt, NumDimensions=2, FitnessScheme=ParetoFitnessScheme{2}(is_minimizing=true)) +sol = solve(prob, opt, NumDimensions=2, FitnessScheme=ParetoFitnessScheme{2}(is_minimizing=true)) ``` From 6a1dceb75e81cad86dedc766a7770175d7dc5caf Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Thu, 26 Sep 2024 00:13:37 +0530 Subject: [PATCH 11/20] Update evolutionary.md Removed unnecessary FowardDiff function. --- docs/src/optimization_packages/evolutionary.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/src/optimization_packages/evolutionary.md b/docs/src/optimization_packages/evolutionary.md index 9ed2a2645..03da1985a 100644 --- a/docs/src/optimization_packages/evolutionary.md +++ b/docs/src/optimization_packages/evolutionary.md @@ -53,10 +53,7 @@ function func(x, p=nothing)::Vector{Float64} return [f1, f2] end initial_guess = [1.0, 1.0] -function gradient_multi_objective(x, p=nothing) - ForwardDiff.jacobian(func, x) -end -obj_func = MultiObjectiveOptimizationFunction(func, jac=gradient_multi_objective) +obj_func = MultiObjectiveOptimizationFunction(func) algorithm = OptimizationEvolutionary.NSGA2() problem = OptimizationProblem(obj_func, initial_guess) result = solve(problem, algorithm) From c9d892fb8fba02040eb85f3749c454bb54f6c894 Mon Sep 17 00:00:00 2001 From: Vaibhav Kumar Dixit Date: Thu, 26 Sep 2024 20:17:50 -0400 Subject: [PATCH 12/20] Update docs/src/optimization_packages/metaheuristics.md --- docs/src/optimization_packages/metaheuristics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/optimization_packages/metaheuristics.md b/docs/src/optimization_packages/metaheuristics.md index 13fd60651..3a6f37fdf 100644 --- a/docs/src/optimization_packages/metaheuristics.md +++ b/docs/src/optimization_packages/metaheuristics.md @@ -75,7 +75,7 @@ While `Metaheuristics.jl` supports such constraints, `Optimization.jl` currently ## Multi-objective optimization The zdt1 functions can be optimized using the `Metaheuristics.jl` as follows: -```@example MOO-Evolutionary +```@example MOO-Metaheuristics using Optimization, OptimizationEvolutionary,OptimizationMetaheuristics, Metaheuristics function zdt1(x) f1 = x[1] From 564f53ae03a811fe4d76f99558dac66e151930fb Mon Sep 17 00:00:00 2001 From: Vaibhav Kumar Dixit Date: Fri, 25 Oct 2024 23:13:53 -0400 Subject: [PATCH 13/20] Update docs/src/optimization_packages/evolutionary.md --- docs/src/optimization_packages/evolutionary.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/optimization_packages/evolutionary.md b/docs/src/optimization_packages/evolutionary.md index 03da1985a..86cf27b71 100644 --- a/docs/src/optimization_packages/evolutionary.md +++ b/docs/src/optimization_packages/evolutionary.md @@ -46,7 +46,7 @@ sol = solve(prob, Evolutionary.CMAES(μ = 40, λ = 100)) The Rosenbrock and Ackley functions can be optimized using the `Evolutionary.NSGA2()` as follows: ```@example MOO-Evolutionary -using Optimization, OptimizationEvolutionary +using Optimization, OptimizationEvolutionary, Evolutionary function func(x, p=nothing)::Vector{Float64} f1 = (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2 # Rosenbrock function f2 = -20.0 * exp(-0.2 * sqrt(0.5 * (x[1]^2 + x[2]^2))) - exp(0.5 * (cos(2π * x[1]) + cos(2π * x[2]))) + exp(1) + 20.0 # Ackley function From b1fe7da37b16f3052c9416d86eb5047908302303 Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Sun, 10 Nov 2024 00:54:47 +0530 Subject: [PATCH 14/20] Update metaheuristics.md Added the package for the algorithms. --- docs/src/optimization_packages/metaheuristics.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/src/optimization_packages/metaheuristics.md b/docs/src/optimization_packages/metaheuristics.md index 3a6f37fdf..2a7445ad2 100644 --- a/docs/src/optimization_packages/metaheuristics.md +++ b/docs/src/optimization_packages/metaheuristics.md @@ -106,12 +106,12 @@ npartitions = 100 weights = Metaheuristics.gen_ref_dirs(nobjectives, npartitions) # Choose the algorithm as required. -alg1 = NSGA2() -alg2 = NSGA3() -alg3 = SPEA2() -alg4 = CCMO(NSGA2(N=100, p_m=0.001)) -alg5 = MOEAD_DE(weights, options=Options(debug=false, iterations = 250)) -alg6 = SMS_EMOA() +alg1 = Metaheuristics.NSGA2() +alg2 = Metaheuristics.NSGA3() +alg3 = Metaheuristics.SPEA2() +alg4 = Metaheuristics.CCMO(NSGA2(N=100, p_m=0.001)) +alg5 = Metaheuristics.MOEAD_DE(weights, options=Options(debug=false, iterations = 250)) +alg6 = Metaheuristics.SMS_EMOA() # Solve the problem sol1 = solve(prob, alg1; maxiters = 100, use_initial = true) From 89abf73bd1b0544892f19740501266f066edb6dd Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Sun, 10 Nov 2024 01:43:48 +0530 Subject: [PATCH 15/20] Update Project.toml Added evolutionary to the package. --- docs/Project.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/Project.toml b/docs/Project.toml index c722e4e2b..ad6cf088b 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -44,6 +44,7 @@ Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" BlackBoxOptim = "a134a8b2-14d6-55f6-9291-3336d3ab0209" Metaheuristics = "bcdb8e00-2c21-11e9-3065-2b553b22f898" +Evolutionary = "86b6b26d-c046-49b6-aa0b-5f0f74682bd6" [compat] AmplNLWriter = "1" @@ -90,4 +91,5 @@ Tracker = ">= 0.2" Zygote = ">= 0.5" BlackBoxOptim = "0.6" Metaheuristics = "3" +Evolutionary = "0.11" From 5aa12894f0938798d614be992a63b60908e416d9 Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Sun, 10 Nov 2024 02:04:28 +0530 Subject: [PATCH 16/20] Update metaheuristics.md updated algorithm call. --- .../optimization_packages/metaheuristics.md | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/docs/src/optimization_packages/metaheuristics.md b/docs/src/optimization_packages/metaheuristics.md index 2a7445ad2..891d4514c 100644 --- a/docs/src/optimization_packages/metaheuristics.md +++ b/docs/src/optimization_packages/metaheuristics.md @@ -105,19 +105,11 @@ npartitions = 100 # reference points (Das and Dennis's method) weights = Metaheuristics.gen_ref_dirs(nobjectives, npartitions) -# Choose the algorithm as required. -alg1 = Metaheuristics.NSGA2() -alg2 = Metaheuristics.NSGA3() -alg3 = Metaheuristics.SPEA2() -alg4 = Metaheuristics.CCMO(NSGA2(N=100, p_m=0.001)) -alg5 = Metaheuristics.MOEAD_DE(weights, options=Options(debug=false, iterations = 250)) -alg6 = Metaheuristics.SMS_EMOA() - -# Solve the problem -sol1 = solve(prob, alg1; maxiters = 100, use_initial = true) -sol2 = solve(prob, alg2; maxiters = 100, use_initial = true) -sol3 = solve(prob, alg3; maxiters = 100, use_initial = true) -sol4 = solve(prob, alg4) -sol5 = solve(prob, alg5; maxiters = 100, use_initial = true) -sol6 = solve(prob, alg6; maxiters = 100, use_initial = true) +# Choose the algorithm and solve the problem +sol1 = solve(prob, NSGA2(); maxiters = 100, use_initial = true) +sol2 = solve(prob, NSGA3(); maxiters = 100, use_initial = true) +sol3 = solve(prob, SPEA2(); maxiters = 100, use_initial = true) +sol4 = solve(prob, CCMO(NSGA2(N=100, p_m=0.001))) +sol5 = solve(prob, MOEAD_DE(weights, options=Options(debug=false, iterations = 250)); maxiters = 100, use_initial = true) +sol6 = solve(prob, SMS_EMOA(); maxiters = 100, use_initial = true) ``` From fb0181bd69074137b96ef55aeb762f833aad5039 Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Sun, 10 Nov 2024 02:06:09 +0530 Subject: [PATCH 17/20] Update blackboxoptim.md Correction of changeing tuple to vector. --- docs/src/optimization_packages/blackboxoptim.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/optimization_packages/blackboxoptim.md b/docs/src/optimization_packages/blackboxoptim.md index ce17f3b1b..85f17cf93 100644 --- a/docs/src/optimization_packages/blackboxoptim.md +++ b/docs/src/optimization_packages/blackboxoptim.md @@ -69,7 +69,7 @@ sol = solve(prob, BBO_adaptive_de_rand_1_bin_radiuslimited(), maxiters = 100000, ``` ## Multi-objective optimization -The optimizer for Multi-Objective Optimization is `BBO_borg_moea()`. Your objective function should return a tuple of the objective values and you should indicate the fitness scheme to be (typically) Pareto fitness and specify the number of objectives. Otherwise, the use is similar, here is an example: +The optimizer for Multi-Objective Optimization is `BBO_borg_moea()`. Your objective function should return a vector of the objective values and you should indicate the fitness scheme to be (typically) Pareto fitness and specify the number of objectives. Otherwise, the use is similar, here is an example: ```@example MOO-BBO using OptimizationBBO, Optimization, BlackBoxOptim From 6d4c6ba9f8cf573ac2882761bebb5527a578ceec Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Sun, 10 Nov 2024 10:09:50 +0530 Subject: [PATCH 18/20] Update metaheuristics.md corrected algorithm calls. --- docs/src/optimization_packages/metaheuristics.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/src/optimization_packages/metaheuristics.md b/docs/src/optimization_packages/metaheuristics.md index 891d4514c..f95ad505a 100644 --- a/docs/src/optimization_packages/metaheuristics.md +++ b/docs/src/optimization_packages/metaheuristics.md @@ -106,10 +106,10 @@ npartitions = 100 weights = Metaheuristics.gen_ref_dirs(nobjectives, npartitions) # Choose the algorithm and solve the problem -sol1 = solve(prob, NSGA2(); maxiters = 100, use_initial = true) -sol2 = solve(prob, NSGA3(); maxiters = 100, use_initial = true) -sol3 = solve(prob, SPEA2(); maxiters = 100, use_initial = true) -sol4 = solve(prob, CCMO(NSGA2(N=100, p_m=0.001))) -sol5 = solve(prob, MOEAD_DE(weights, options=Options(debug=false, iterations = 250)); maxiters = 100, use_initial = true) -sol6 = solve(prob, SMS_EMOA(); maxiters = 100, use_initial = true) +sol1 = solve(prob, Metaheuristics.NSGA2(); maxiters = 100, use_initial = true) +sol2 = solve(prob, Metaheuristics.NSGA3(); maxiters = 100, use_initial = true) +sol3 = solve(prob, Metaheuristics.SPEA2(); maxiters = 100, use_initial = true) +sol4 = solve(prob, Metaheuristics.CCMO(NSGA2(N=100, p_m=0.001))) +sol5 = solve(prob, Metaheuristics.MOEAD_DE(weights, options=Options(debug=false, iterations = 250)); maxiters = 100, use_initial = true) +sol6 = solve(prob, Metaheuristics.SMS_EMOA(); maxiters = 100, use_initial = true) ``` From d8fea39c687e8fac083290207f78308109030eda Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Thu, 30 Jan 2025 00:05:48 +0530 Subject: [PATCH 19/20] Update OptimizationBBO.jl Adding argument mapping for num_dimensions and fitness_scheme. --- lib/OptimizationBBO/src/OptimizationBBO.jl | 38 ++++++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/lib/OptimizationBBO/src/OptimizationBBO.jl b/lib/OptimizationBBO/src/OptimizationBBO.jl index 1b0c6e48f..9277fbcba 100644 --- a/lib/OptimizationBBO/src/OptimizationBBO.jl +++ b/lib/OptimizationBBO/src/OptimizationBBO.jl @@ -49,6 +49,8 @@ function __map_optimizer_args(prob::Optimization.OptimizationCache, opt::BBO; abstol::Union{Number, Nothing} = nothing, reltol::Union{Number, Nothing} = nothing, verbose::Bool = false, + num_dimensions::Union{Number, Nothing} = nothing, + fitness_scheme::Union{String, Nothing} = nothing, kwargs...) if !isnothing(reltol) @warn "common reltol is currently not used by $(opt)" @@ -80,6 +82,16 @@ function __map_optimizer_args(prob::Optimization.OptimizationCache, opt::BBO; mapped_args = (; mapped_args..., TraceMode = :silent) end + if isa(prob.f, MultiObjectiveOptimizationFunction) + if isnothing(num_dimensions) && isnothing(fitness_scheme) + mapped_args = (; mapped_args..., NumDimensions = 2, FitnessScheme = BlackBoxOptim.ParetoFitnessScheme{2}(is_minimizing=true)) + elseif isnothing(num_dimensions) + mapped_args = (; mapped_args..., NumDimensions = 2, FitnessScheme = fitness_scheme) + elseif isnothing(fitness_scheme) + mapped_args = (; mapped_args..., NumDimensions = num_dimensions, FitnessScheme = BlackBoxOptim.ParetoFitnessScheme{2}(is_minimizing=true)) + end + end + return mapped_args end @@ -177,13 +189,25 @@ function SciMLBase.__solve(cache::Optimization.OptimizationCache{ end end - opt_args = __map_optimizer_args(cache, cache.opt; - callback = cache.callback === Optimization.DEFAULT_CALLBACK && - cache.data === Optimization.DEFAULT_DATA ? - nothing : _cb, - cache.solver_args..., - maxiters = maxiters, - maxtime = maxtime) + if isa(cache.f, MultiObjectiveOptimizationFunction) + opt_args = __map_optimizer_args(cache, cache.opt; + callback = cache.callback === Optimization.DEFAULT_CALLBACK && + cache.data === Optimization.DEFAULT_DATA ? + nothing : _cb, + cache.solver_args..., + maxiters = maxiters, + maxtime = maxtime, + num_dimensions = isnothing(cache.num_dimensions) ? nothing : cache.num_dimensions, + fitness_scheme = isnothing(cache.fitness_scheme) ? nothing : cache.fitness_scheme) + else + opt_args = __map_optimizer_args(cache, cache.opt; + callback = cache.callback === Optimization.DEFAULT_CALLBACK && + cache.data === Optimization.DEFAULT_DATA ? + nothing : _cb, + cache.solver_args..., + maxiters = maxiters, + maxtime = maxtime) + end opt_setup = BlackBoxOptim.bbsetup(_loss; opt_args...) From 032e5b90274de11f9dffc5cd91717999eaf53b62 Mon Sep 17 00:00:00 2001 From: Paras Puneet Singh <136245940+ParasPuneetSingh@users.noreply.github.com> Date: Thu, 30 Jan 2025 00:08:17 +0530 Subject: [PATCH 20/20] Update runtests.jl syntax change for num_dimensions and fitness_scheme passing in solve(). --- lib/OptimizationBBO/test/runtests.jl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/OptimizationBBO/test/runtests.jl b/lib/OptimizationBBO/test/runtests.jl index e5215fee8..08117d6b6 100644 --- a/lib/OptimizationBBO/test/runtests.jl +++ b/lib/OptimizationBBO/test/runtests.jl @@ -68,8 +68,8 @@ using Test mof_1 = MultiObjectiveOptimizationFunction(multi_obj_func_1) prob_1 = Optimization.OptimizationProblem(mof_1, u0; lb = lb, ub = ub) - sol_1 = solve(prob_1, opt, NumDimensions = 2, - FitnessScheme = ParetoFitnessScheme{2}(is_minimizing = true)) + sol_1 = solve(prob_1, opt, num_dimensions = 2, + fitness_scheme = ParetoFitnessScheme{2}(is_minimizing = true)) @test sol_1 ≠ nothing println("Solution for Sphere and Rastrigin: ", sol_1) @@ -88,8 +88,8 @@ using Test mof_2 = MultiObjectiveOptimizationFunction(multi_obj_func_2) prob_2 = Optimization.OptimizationProblem(mof_2, u0; lb = lb, ub = ub) - sol_2 = solve(prob_2, opt, NumDimensions = 2, - FitnessScheme = ParetoFitnessScheme{2}(is_minimizing = true)) + sol_2 = solve(prob_2, opt, num_dimensions = 2, + fitness_scheme = ParetoFitnessScheme{2}(is_minimizing = true)) @test sol_2 ≠ nothing println("Solution for Rosenbrock and Ackley: ", sol_2) @@ -108,8 +108,8 @@ using Test mof_3 = MultiObjectiveOptimizationFunction(multi_obj_func_3) prob_3 = Optimization.OptimizationProblem(mof_3, u0; lb = lb, ub = ub) - sol_3 = solve(prob_3, opt, NumDimensions = 2, - FitnessScheme = ParetoFitnessScheme{2}(is_minimizing = true)) + sol_3 = solve(prob_3, opt, num_dimensions = 2, + fitness_scheme = ParetoFitnessScheme{2}(is_minimizing = true)) @test sol_3 ≠ nothing println("Solution for ZDT1: ", sol_3)