pymoo 0.6.1.5.dev0__cp311-cp311-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pymoo might be problematic. Click here for more details.
- pymoo/__init__.py +3 -0
- pymoo/algorithms/__init__.py +0 -0
- pymoo/algorithms/base/__init__.py +0 -0
- pymoo/algorithms/base/bracket.py +38 -0
- pymoo/algorithms/base/genetic.py +109 -0
- pymoo/algorithms/base/line.py +62 -0
- pymoo/algorithms/base/local.py +39 -0
- pymoo/algorithms/base/meta.py +79 -0
- pymoo/algorithms/hyperparameters.py +89 -0
- pymoo/algorithms/moo/__init__.py +0 -0
- pymoo/algorithms/moo/age.py +310 -0
- pymoo/algorithms/moo/age2.py +194 -0
- pymoo/algorithms/moo/ctaea.py +298 -0
- pymoo/algorithms/moo/dnsga2.py +76 -0
- pymoo/algorithms/moo/kgb.py +446 -0
- pymoo/algorithms/moo/moead.py +183 -0
- pymoo/algorithms/moo/nsga2.py +113 -0
- pymoo/algorithms/moo/nsga3.py +358 -0
- pymoo/algorithms/moo/pinsga2.py +370 -0
- pymoo/algorithms/moo/rnsga2.py +188 -0
- pymoo/algorithms/moo/rnsga3.py +246 -0
- pymoo/algorithms/moo/rvea.py +214 -0
- pymoo/algorithms/moo/sms.py +195 -0
- pymoo/algorithms/moo/spea2.py +190 -0
- pymoo/algorithms/moo/unsga3.py +47 -0
- pymoo/algorithms/soo/__init__.py +0 -0
- pymoo/algorithms/soo/convex/__init__.py +0 -0
- pymoo/algorithms/soo/nonconvex/__init__.py +0 -0
- pymoo/algorithms/soo/nonconvex/brkga.py +161 -0
- pymoo/algorithms/soo/nonconvex/cmaes.py +554 -0
- pymoo/algorithms/soo/nonconvex/de.py +279 -0
- pymoo/algorithms/soo/nonconvex/direct.py +149 -0
- pymoo/algorithms/soo/nonconvex/es.py +203 -0
- pymoo/algorithms/soo/nonconvex/g3pcx.py +94 -0
- pymoo/algorithms/soo/nonconvex/ga.py +93 -0
- pymoo/algorithms/soo/nonconvex/ga_niching.py +223 -0
- pymoo/algorithms/soo/nonconvex/isres.py +74 -0
- pymoo/algorithms/soo/nonconvex/nelder.py +251 -0
- pymoo/algorithms/soo/nonconvex/optuna.py +80 -0
- pymoo/algorithms/soo/nonconvex/pattern.py +183 -0
- pymoo/algorithms/soo/nonconvex/pso.py +399 -0
- pymoo/algorithms/soo/nonconvex/pso_ep.py +297 -0
- pymoo/algorithms/soo/nonconvex/random_search.py +25 -0
- pymoo/algorithms/soo/nonconvex/sres.py +56 -0
- pymoo/algorithms/soo/univariate/__init__.py +0 -0
- pymoo/algorithms/soo/univariate/backtracking.py +59 -0
- pymoo/algorithms/soo/univariate/exp.py +46 -0
- pymoo/algorithms/soo/univariate/golden.py +65 -0
- pymoo/algorithms/soo/univariate/quadr_interp.py +81 -0
- pymoo/algorithms/soo/univariate/wolfe.py +163 -0
- pymoo/config.py +33 -0
- pymoo/constraints/__init__.py +3 -0
- pymoo/constraints/adaptive.py +62 -0
- pymoo/constraints/as_obj.py +56 -0
- pymoo/constraints/as_penalty.py +41 -0
- pymoo/constraints/eps.py +26 -0
- pymoo/constraints/from_bounds.py +36 -0
- pymoo/core/__init__.py +0 -0
- pymoo/core/algorithm.py +394 -0
- pymoo/core/callback.py +38 -0
- pymoo/core/crossover.py +77 -0
- pymoo/core/decision_making.py +102 -0
- pymoo/core/decomposition.py +76 -0
- pymoo/core/duplicate.py +163 -0
- pymoo/core/evaluator.py +116 -0
- pymoo/core/indicator.py +34 -0
- pymoo/core/individual.py +784 -0
- pymoo/core/infill.py +64 -0
- pymoo/core/initialization.py +42 -0
- pymoo/core/mating.py +39 -0
- pymoo/core/meta.py +21 -0
- pymoo/core/mixed.py +165 -0
- pymoo/core/mutation.py +44 -0
- pymoo/core/operator.py +40 -0
- pymoo/core/parameters.py +134 -0
- pymoo/core/plot.py +210 -0
- pymoo/core/population.py +180 -0
- pymoo/core/problem.py +460 -0
- pymoo/core/recorder.py +99 -0
- pymoo/core/repair.py +23 -0
- pymoo/core/replacement.py +96 -0
- pymoo/core/result.py +52 -0
- pymoo/core/sampling.py +43 -0
- pymoo/core/selection.py +61 -0
- pymoo/core/solution.py +10 -0
- pymoo/core/survival.py +103 -0
- pymoo/core/termination.py +70 -0
- pymoo/core/variable.py +399 -0
- pymoo/cython/__init__.py +0 -0
- pymoo/cython/calc_perpendicular_distance.cpython-311-darwin.so +0 -0
- pymoo/cython/calc_perpendicular_distance.pyx +67 -0
- pymoo/cython/decomposition.cpython-311-darwin.so +0 -0
- pymoo/cython/decomposition.pyx +165 -0
- pymoo/cython/hv.cpython-311-darwin.so +0 -0
- pymoo/cython/hv.pyx +18 -0
- pymoo/cython/info.cpython-311-darwin.so +0 -0
- pymoo/cython/info.pyx +5 -0
- pymoo/cython/mnn.cpython-311-darwin.so +0 -0
- pymoo/cython/mnn.pyx +273 -0
- pymoo/cython/non_dominated_sorting.cpython-311-darwin.so +0 -0
- pymoo/cython/non_dominated_sorting.pyx +645 -0
- pymoo/cython/pruning_cd.cpython-311-darwin.so +0 -0
- pymoo/cython/pruning_cd.pyx +197 -0
- pymoo/cython/stochastic_ranking.cpython-311-darwin.so +0 -0
- pymoo/cython/stochastic_ranking.pyx +49 -0
- pymoo/cython/utils.pxd +129 -0
- pymoo/cython/vendor/__init__.py +0 -0
- pymoo/cython/vendor/hypervolume.cpp +1621 -0
- pymoo/cython/vendor/hypervolume.h +63 -0
- pymoo/decomposition/__init__.py +0 -0
- pymoo/decomposition/aasf.py +24 -0
- pymoo/decomposition/asf.py +10 -0
- pymoo/decomposition/pbi.py +13 -0
- pymoo/decomposition/perp_dist.py +13 -0
- pymoo/decomposition/tchebicheff.py +11 -0
- pymoo/decomposition/util.py +13 -0
- pymoo/decomposition/weighted_sum.py +8 -0
- pymoo/docs.py +187 -0
- pymoo/experimental/__init__.py +0 -0
- pymoo/experimental/algorithms/__init__.py +0 -0
- pymoo/experimental/algorithms/gde3.py +57 -0
- pymoo/gradient/__init__.py +21 -0
- pymoo/gradient/automatic.py +57 -0
- pymoo/gradient/grad_autograd.py +105 -0
- pymoo/gradient/grad_complex.py +35 -0
- pymoo/gradient/grad_jax.py +51 -0
- pymoo/gradient/toolbox/__init__.py +6 -0
- pymoo/indicators/__init__.py +0 -0
- pymoo/indicators/distance_indicator.py +55 -0
- pymoo/indicators/gd.py +7 -0
- pymoo/indicators/gd_plus.py +7 -0
- pymoo/indicators/hv/__init__.py +63 -0
- pymoo/indicators/hv/exact.py +71 -0
- pymoo/indicators/hv/exact_2d.py +102 -0
- pymoo/indicators/hv/monte_carlo.py +74 -0
- pymoo/indicators/igd.py +7 -0
- pymoo/indicators/igd_plus.py +7 -0
- pymoo/indicators/kktpm.py +151 -0
- pymoo/indicators/migd.py +55 -0
- pymoo/indicators/rmetric.py +203 -0
- pymoo/indicators/spacing.py +52 -0
- pymoo/mcdm/__init__.py +0 -0
- pymoo/mcdm/compromise_programming.py +19 -0
- pymoo/mcdm/high_tradeoff.py +40 -0
- pymoo/mcdm/pseudo_weights.py +32 -0
- pymoo/operators/__init__.py +0 -0
- pymoo/operators/control.py +187 -0
- pymoo/operators/crossover/__init__.py +0 -0
- pymoo/operators/crossover/binx.py +45 -0
- pymoo/operators/crossover/dex.py +122 -0
- pymoo/operators/crossover/erx.py +162 -0
- pymoo/operators/crossover/expx.py +51 -0
- pymoo/operators/crossover/hux.py +37 -0
- pymoo/operators/crossover/nox.py +13 -0
- pymoo/operators/crossover/ox.py +84 -0
- pymoo/operators/crossover/pcx.py +82 -0
- pymoo/operators/crossover/pntx.py +49 -0
- pymoo/operators/crossover/sbx.py +125 -0
- pymoo/operators/crossover/spx.py +5 -0
- pymoo/operators/crossover/ux.py +20 -0
- pymoo/operators/mutation/__init__.py +0 -0
- pymoo/operators/mutation/bitflip.py +17 -0
- pymoo/operators/mutation/gauss.py +58 -0
- pymoo/operators/mutation/inversion.py +42 -0
- pymoo/operators/mutation/nom.py +7 -0
- pymoo/operators/mutation/pm.py +94 -0
- pymoo/operators/mutation/rm.py +23 -0
- pymoo/operators/repair/__init__.py +0 -0
- pymoo/operators/repair/bounce_back.py +32 -0
- pymoo/operators/repair/bounds_repair.py +95 -0
- pymoo/operators/repair/inverse_penalty.py +89 -0
- pymoo/operators/repair/rounding.py +18 -0
- pymoo/operators/repair/to_bound.py +31 -0
- pymoo/operators/repair/vtype.py +11 -0
- pymoo/operators/sampling/__init__.py +0 -0
- pymoo/operators/sampling/lhs.py +73 -0
- pymoo/operators/sampling/rnd.py +50 -0
- pymoo/operators/selection/__init__.py +0 -0
- pymoo/operators/selection/rnd.py +72 -0
- pymoo/operators/selection/tournament.py +76 -0
- pymoo/operators/survival/__init__.py +0 -0
- pymoo/operators/survival/rank_and_crowding/__init__.py +1 -0
- pymoo/operators/survival/rank_and_crowding/classes.py +209 -0
- pymoo/operators/survival/rank_and_crowding/metrics.py +208 -0
- pymoo/optimize.py +72 -0
- pymoo/problems/__init__.py +157 -0
- pymoo/problems/dyn.py +47 -0
- pymoo/problems/dynamic/__init__.py +0 -0
- pymoo/problems/dynamic/cec2015.py +108 -0
- pymoo/problems/dynamic/df.py +452 -0
- pymoo/problems/dynamic/misc.py +167 -0
- pymoo/problems/functional.py +48 -0
- pymoo/problems/many/__init__.py +5 -0
- pymoo/problems/many/cdtlz.py +159 -0
- pymoo/problems/many/dcdtlz.py +88 -0
- pymoo/problems/many/dtlz.py +264 -0
- pymoo/problems/many/wfg.py +550 -0
- pymoo/problems/multi/__init__.py +14 -0
- pymoo/problems/multi/bnh.py +34 -0
- pymoo/problems/multi/carside.py +48 -0
- pymoo/problems/multi/clutch.py +104 -0
- pymoo/problems/multi/csi.py +55 -0
- pymoo/problems/multi/ctp.py +198 -0
- pymoo/problems/multi/dascmop.py +213 -0
- pymoo/problems/multi/kursawe.py +25 -0
- pymoo/problems/multi/modact.py +68 -0
- pymoo/problems/multi/mw.py +400 -0
- pymoo/problems/multi/omnitest.py +48 -0
- pymoo/problems/multi/osy.py +32 -0
- pymoo/problems/multi/srn.py +28 -0
- pymoo/problems/multi/sympart.py +94 -0
- pymoo/problems/multi/tnk.py +24 -0
- pymoo/problems/multi/truss2d.py +83 -0
- pymoo/problems/multi/welded_beam.py +41 -0
- pymoo/problems/multi/wrm.py +36 -0
- pymoo/problems/multi/zdt.py +151 -0
- pymoo/problems/multi_to_single.py +22 -0
- pymoo/problems/single/__init__.py +12 -0
- pymoo/problems/single/ackley.py +24 -0
- pymoo/problems/single/cantilevered_beam.py +34 -0
- pymoo/problems/single/flowshop_scheduling.py +112 -0
- pymoo/problems/single/g.py +874 -0
- pymoo/problems/single/griewank.py +18 -0
- pymoo/problems/single/himmelblau.py +15 -0
- pymoo/problems/single/knapsack.py +48 -0
- pymoo/problems/single/mopta08.py +26 -0
- pymoo/problems/single/multimodal.py +20 -0
- pymoo/problems/single/pressure_vessel.py +30 -0
- pymoo/problems/single/rastrigin.py +20 -0
- pymoo/problems/single/rosenbrock.py +22 -0
- pymoo/problems/single/schwefel.py +18 -0
- pymoo/problems/single/simple.py +13 -0
- pymoo/problems/single/sphere.py +19 -0
- pymoo/problems/single/traveling_salesman.py +79 -0
- pymoo/problems/single/zakharov.py +19 -0
- pymoo/problems/static.py +14 -0
- pymoo/problems/util.py +42 -0
- pymoo/problems/zero_to_one.py +27 -0
- pymoo/termination/__init__.py +23 -0
- pymoo/termination/collection.py +12 -0
- pymoo/termination/cv.py +48 -0
- pymoo/termination/default.py +45 -0
- pymoo/termination/delta.py +64 -0
- pymoo/termination/fmin.py +16 -0
- pymoo/termination/ftol.py +144 -0
- pymoo/termination/indicator.py +49 -0
- pymoo/termination/max_eval.py +14 -0
- pymoo/termination/max_gen.py +15 -0
- pymoo/termination/max_time.py +20 -0
- pymoo/termination/robust.py +34 -0
- pymoo/termination/xtol.py +33 -0
- pymoo/util/__init__.py +0 -0
- pymoo/util/archive.py +150 -0
- pymoo/util/cache.py +29 -0
- pymoo/util/clearing.py +82 -0
- pymoo/util/display/__init__.py +0 -0
- pymoo/util/display/column.py +52 -0
- pymoo/util/display/display.py +34 -0
- pymoo/util/display/multi.py +96 -0
- pymoo/util/display/output.py +53 -0
- pymoo/util/display/progress.py +54 -0
- pymoo/util/display/single.py +67 -0
- pymoo/util/dominator.py +67 -0
- pymoo/util/function_loader.py +129 -0
- pymoo/util/hv.py +23 -0
- pymoo/util/matlab_engine.py +39 -0
- pymoo/util/misc.py +460 -0
- pymoo/util/mnn.py +70 -0
- pymoo/util/nds/__init__.py +0 -0
- pymoo/util/nds/dominance_degree_non_dominated_sort.py +159 -0
- pymoo/util/nds/efficient_non_dominated_sort.py +152 -0
- pymoo/util/nds/fast_non_dominated_sort.py +70 -0
- pymoo/util/nds/naive_non_dominated_sort.py +36 -0
- pymoo/util/nds/non_dominated_sorting.py +67 -0
- pymoo/util/nds/tree_based_non_dominated_sort.py +133 -0
- pymoo/util/normalization.py +312 -0
- pymoo/util/optimum.py +42 -0
- pymoo/util/plotting.py +177 -0
- pymoo/util/pruning_cd.py +89 -0
- pymoo/util/randomized_argsort.py +60 -0
- pymoo/util/ref_dirs/__init__.py +24 -0
- pymoo/util/ref_dirs/construction.py +88 -0
- pymoo/util/ref_dirs/das_dennis.py +52 -0
- pymoo/util/ref_dirs/energy.py +319 -0
- pymoo/util/ref_dirs/energy_layer.py +119 -0
- pymoo/util/ref_dirs/genetic_algorithm.py +63 -0
- pymoo/util/ref_dirs/incremental.py +68 -0
- pymoo/util/ref_dirs/misc.py +128 -0
- pymoo/util/ref_dirs/optimizer.py +59 -0
- pymoo/util/ref_dirs/performance.py +162 -0
- pymoo/util/ref_dirs/reduction.py +85 -0
- pymoo/util/ref_dirs/sample_and_map.py +24 -0
- pymoo/util/reference_direction.py +260 -0
- pymoo/util/remote.py +55 -0
- pymoo/util/roulette.py +27 -0
- pymoo/util/running_metric.py +128 -0
- pymoo/util/sliding_window.py +25 -0
- pymoo/util/stochastic_ranking.py +32 -0
- pymoo/util/value_functions.py +719 -0
- pymoo/util/vectors.py +40 -0
- pymoo/util/vf_dominator.py +99 -0
- pymoo/vendor/__init__.py +0 -0
- pymoo/vendor/cec2018.py +398 -0
- pymoo/vendor/gta.py +617 -0
- pymoo/vendor/hv.py +267 -0
- pymoo/vendor/vendor_cmaes.py +412 -0
- pymoo/vendor/vendor_coco.py +81 -0
- pymoo/vendor/vendor_scipy.py +232 -0
- pymoo/version.py +1 -0
- pymoo/visualization/__init__.py +8 -0
- pymoo/visualization/fitness_landscape.py +127 -0
- pymoo/visualization/heatmap.py +123 -0
- pymoo/visualization/pcp.py +120 -0
- pymoo/visualization/petal.py +91 -0
- pymoo/visualization/radar.py +108 -0
- pymoo/visualization/radviz.py +68 -0
- pymoo/visualization/scatter.py +150 -0
- pymoo/visualization/star_coordinate.py +75 -0
- pymoo/visualization/util.py +123 -0
- pymoo/visualization/video/__init__.py +0 -0
- pymoo/visualization/video/callback_video.py +82 -0
- pymoo/visualization/video/one_var_one_obj.py +57 -0
- pymoo/visualization/video/two_var_one_obj.py +62 -0
- pymoo-0.6.1.5.dev0.dist-info/METADATA +187 -0
- pymoo-0.6.1.5.dev0.dist-info/RECORD +328 -0
- pymoo-0.6.1.5.dev0.dist-info/WHEEL +6 -0
- pymoo-0.6.1.5.dev0.dist-info/licenses/LICENSE +191 -0
- pymoo-0.6.1.5.dev0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import pymoo.gradient.toolbox as anp
|
|
3
|
+
from pymoo.core.problem import Problem
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Griewank(Problem):
|
|
7
|
+
def __init__(self, n_var=2):
|
|
8
|
+
super().__init__(n_var=n_var, n_obj=1, xl=-600, xu=600, vtype=float)
|
|
9
|
+
|
|
10
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
11
|
+
out["F"] = 1 + 1 / 4000 * anp.sum(anp.power(x, 2), axis=1) \
|
|
12
|
+
- anp.prod(anp.cos(x / anp.sqrt(anp.arange(1, x.shape[1] + 1))), axis=1)
|
|
13
|
+
|
|
14
|
+
def _calc_pareto_front(self):
|
|
15
|
+
return 0
|
|
16
|
+
|
|
17
|
+
def _calc_pareto_set(self):
|
|
18
|
+
return np.full(self.n_var, 0)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from pymoo.core.problem import Problem
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Himmelblau(Problem):
|
|
5
|
+
def __init__(self, **kwargs):
|
|
6
|
+
super().__init__(n_var=2, n_obj=1, xl=-6, xu=6, vtype=float)
|
|
7
|
+
|
|
8
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
9
|
+
out["F"] = (x[:, 0] ** 2 + x[:, 1] - 11) ** 2 + (x[:, 0] + x[:, 1] ** 2 - 7) ** 2
|
|
10
|
+
|
|
11
|
+
def _calc_pareto_front(self):
|
|
12
|
+
return 0
|
|
13
|
+
|
|
14
|
+
def _calc_pareto_set(self):
|
|
15
|
+
return [[3.0, 2.0], [-2.805118, 3.131312], [-3.779310, -3.283186], [3.584428, -1.848126]]
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import numpy as np
|
|
3
|
+
|
|
4
|
+
from pymoo.core.problem import Problem
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Knapsack(Problem):
|
|
8
|
+
def __init__(self,
|
|
9
|
+
n_items, # number of items that can be picked up
|
|
10
|
+
W, # weights for each item
|
|
11
|
+
P, # profit of each item
|
|
12
|
+
C, # maximum capacity
|
|
13
|
+
):
|
|
14
|
+
super().__init__(n_var=n_items, n_obj=1, n_ieq_constr=1, xl=0, xu=1, vtype=bool)
|
|
15
|
+
|
|
16
|
+
self.W = W
|
|
17
|
+
self.P = P
|
|
18
|
+
self.C = C
|
|
19
|
+
|
|
20
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
21
|
+
out["F"] = -np.sum(self.P * x, axis=1)
|
|
22
|
+
out["G"] = (np.sum(self.W * x, axis=1) - self.C)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class MultiObjectiveKnapsack(Knapsack):
|
|
26
|
+
def __init__(self, *args):
|
|
27
|
+
super().__init__(*args)
|
|
28
|
+
|
|
29
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
30
|
+
f1 = - np.sum(self.P * x, axis=1)
|
|
31
|
+
f2 = np.sum(x, axis=1)
|
|
32
|
+
|
|
33
|
+
out["F"] = np.column_stack([f1, f2])
|
|
34
|
+
out["G"] = (np.sum(self.W * x, axis=1) - self.C)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def create_random_knapsack_problem(n_items, seed=1, variant="single"):
|
|
38
|
+
np.random.seed(seed)
|
|
39
|
+
P = np.random.randint(1, 100, size=n_items)
|
|
40
|
+
W = np.random.randint(1, 100, size=n_items)
|
|
41
|
+
C = int(np.sum(W) / 10)
|
|
42
|
+
|
|
43
|
+
if variant == "single":
|
|
44
|
+
problem = Knapsack(n_items, W, P, C)
|
|
45
|
+
else:
|
|
46
|
+
problem = MultiObjectiveKnapsack(n_items, W, P, C)
|
|
47
|
+
|
|
48
|
+
return problem
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import subprocess
|
|
3
|
+
|
|
4
|
+
import numpy as np
|
|
5
|
+
|
|
6
|
+
from pymoo.core.problem import ElementwiseProblem
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class MOPTA08(ElementwiseProblem):
|
|
10
|
+
def __init__(self, exec):
|
|
11
|
+
super().__init__(n_var=124, n_obj=1, n_ieq_constr=68, xl=0, xu=1, vtype=float)
|
|
12
|
+
self.exec = exec
|
|
13
|
+
|
|
14
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
15
|
+
inputs = os.linesep.join([str(e) for e in x])
|
|
16
|
+
res = subprocess.run(self.exec, input=inputs, text=True, stdout=subprocess.PIPE)
|
|
17
|
+
val = np.array([float(e) for e in res.stdout.split()])
|
|
18
|
+
out["F"] = val[0]
|
|
19
|
+
out["G"] = val[1:]
|
|
20
|
+
|
|
21
|
+
def _calc_pareto_front(self, *args, **kwargs):
|
|
22
|
+
return 222.74
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import pymoo.gradient.toolbox as anp
|
|
2
|
+
|
|
3
|
+
from pymoo.core.problem import Problem
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class MultiModalSimple1(Problem):
|
|
7
|
+
def __init__(self, n_var=1):
|
|
8
|
+
super().__init__(n_var=n_var, n_obj=1, xl=0, xu=1, vtype=float)
|
|
9
|
+
|
|
10
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
11
|
+
out["F"] = 1 - anp.exp(-x ** 2) * anp.sin(2 * anp.pi * x) ** 2
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class MultiModalSimple2(Problem):
|
|
15
|
+
def __init__(self, n_var=1):
|
|
16
|
+
super().__init__(n_var=n_var, n_obj=1, xl=-1, xu=0, vtype=float)
|
|
17
|
+
|
|
18
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
19
|
+
x = - x
|
|
20
|
+
out["F"] = 1.1 - anp.exp(-2 * x) * anp.sin(5 * anp.pi * x) ** 2
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import pymoo.gradient.toolbox as anp
|
|
2
|
+
import numpy as np
|
|
3
|
+
|
|
4
|
+
from pymoo.core.problem import Problem
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class PressureVessel(Problem):
|
|
8
|
+
def __init__(self):
|
|
9
|
+
super().__init__(n_var=4, n_obj=1, n_ieq_constr=4, vtype=float)
|
|
10
|
+
self.xl = np.array([1, 1, 10.0, 10.0])
|
|
11
|
+
self.xu = np.array([99, 99, 200.0, 200.0])
|
|
12
|
+
|
|
13
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
14
|
+
|
|
15
|
+
d1, d2, r, L = x[:, 0]*0.0625, x[:, 1]*0.0625, x[:, 2], x[:, 3]
|
|
16
|
+
|
|
17
|
+
out["F"] = 0.6224*d1*r*L + 1.7781*d2*r**2 + 3.1661*d1**2*L + 19.84*d1**2*r
|
|
18
|
+
|
|
19
|
+
g1 = (-d1 + 0.0193*r)/3
|
|
20
|
+
g2 = (-d2 + 0.00954*r)/3
|
|
21
|
+
g3 = (-anp.pi * r ** 2 * L - 4 * anp.pi / 3 * r ** 3 + 1296000) / 1296000
|
|
22
|
+
g4 = (L - 240)/240
|
|
23
|
+
|
|
24
|
+
out["G"] = anp.column_stack([g1, g2, g3, g4])
|
|
25
|
+
|
|
26
|
+
def _calc_pareto_front(self):
|
|
27
|
+
return 5.8853e+03
|
|
28
|
+
|
|
29
|
+
def _calc_pareto_set(self):
|
|
30
|
+
return [13, 7, 42.0984456, 176.6366]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import pymoo.gradient.toolbox as anp
|
|
2
|
+
import numpy as np
|
|
3
|
+
|
|
4
|
+
from pymoo.core.problem import Problem
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Rastrigin(Problem):
|
|
8
|
+
def __init__(self, n_var=2, A=10.0):
|
|
9
|
+
super().__init__(n_var=n_var, n_obj=1, xl=-5, xu=5, vtype=float)
|
|
10
|
+
self.A = A
|
|
11
|
+
|
|
12
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
13
|
+
z = anp.power(x, 2) - self.A * anp.cos(2 * anp.pi * x)
|
|
14
|
+
out["F"] = self.A * self.n_var + anp.sum(z, axis=1)
|
|
15
|
+
|
|
16
|
+
def _calc_pareto_front(self):
|
|
17
|
+
return 0.0
|
|
18
|
+
|
|
19
|
+
def _calc_pareto_set(self):
|
|
20
|
+
return np.full(self.n_var, 0)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import pymoo.gradient.toolbox as anp
|
|
2
|
+
import numpy as np
|
|
3
|
+
|
|
4
|
+
from pymoo.core.problem import Problem
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Rosenbrock(Problem):
|
|
8
|
+
def __init__(self, n_var=2):
|
|
9
|
+
super().__init__(n_var=n_var, n_obj=1, n_ieq_constr=0, xl=-2.048, xu=2.048, vtype=float)
|
|
10
|
+
|
|
11
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
12
|
+
l = []
|
|
13
|
+
for i in range(x.shape[1] - 1):
|
|
14
|
+
val = 100 * (x[:, i + 1] - x[:, i] ** 2) ** 2 + (1 - x[:, i]) ** 2
|
|
15
|
+
l.append(val)
|
|
16
|
+
out["F"] = anp.sum(anp.column_stack(l), axis=1)
|
|
17
|
+
|
|
18
|
+
def _calc_pareto_front(self):
|
|
19
|
+
return 0.0
|
|
20
|
+
|
|
21
|
+
def _calc_pareto_set(self):
|
|
22
|
+
return np.full(self.n_var, 1.0)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import pymoo.gradient.toolbox as anp
|
|
2
|
+
import numpy as np
|
|
3
|
+
|
|
4
|
+
from pymoo.core.problem import Problem
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Schwefel(Problem):
|
|
8
|
+
def __init__(self, n_var=2):
|
|
9
|
+
super().__init__(n_var=n_var, n_obj=1, n_ieq_constr=0, xl=-500, xu=500, vtype=float)
|
|
10
|
+
|
|
11
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
12
|
+
out["F"] = 418.9829 * self.n_var - anp.sum(x * anp.sin(anp.sqrt(anp.abs(x))), axis=1)
|
|
13
|
+
|
|
14
|
+
def _calc_pareto_front(self):
|
|
15
|
+
return 0
|
|
16
|
+
|
|
17
|
+
def _calc_pareto_set(self):
|
|
18
|
+
return np.full(self.n_var, 420.9687)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import pymoo.gradient.toolbox as anp
|
|
2
|
+
|
|
3
|
+
from pymoo.core.problem import Problem
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class SimpleMultiModal01(Problem):
|
|
7
|
+
|
|
8
|
+
def __init__(self):
|
|
9
|
+
super().__init__(n_var=2, n_obj=1, n_ieq_constr=0, xl=0, xu=1, vtype=float)
|
|
10
|
+
|
|
11
|
+
def _evaluate(self, X, out, *args, **kwargs):
|
|
12
|
+
x, y = X[:, 0], X[:, 1]
|
|
13
|
+
out["F"] = - anp.exp(-9 * abs(x * y)) * anp.sin(3 * anp.pi * x) ** 2 * anp.sin(3 * anp.pi * y) ** 2
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import pymoo.gradient.toolbox as anp
|
|
2
|
+
import numpy as np
|
|
3
|
+
|
|
4
|
+
from pymoo.core.problem import Problem
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Sphere(Problem):
|
|
8
|
+
|
|
9
|
+
def __init__(self, n_var=10):
|
|
10
|
+
super().__init__(n_var=n_var, n_obj=1, n_ieq_constr=0, xl=-0, xu=1, vtype=float)
|
|
11
|
+
|
|
12
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
13
|
+
out["F"] = anp.sum(anp.square(x - 0.5), axis=1)
|
|
14
|
+
|
|
15
|
+
def _calc_pareto_front(self):
|
|
16
|
+
return 0.0
|
|
17
|
+
|
|
18
|
+
def _calc_pareto_set(self):
|
|
19
|
+
return np.full(self.n_var, 0.5)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import matplotlib.pyplot as plt
|
|
2
|
+
import numpy as np
|
|
3
|
+
from scipy.spatial.distance import cdist
|
|
4
|
+
|
|
5
|
+
from pymoo.core.problem import ElementwiseProblem
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class TravelingSalesman(ElementwiseProblem):
|
|
9
|
+
|
|
10
|
+
def __init__(self, cities, **kwargs):
|
|
11
|
+
"""
|
|
12
|
+
A two-dimensional traveling salesman problem (TSP)
|
|
13
|
+
|
|
14
|
+
Parameters
|
|
15
|
+
----------
|
|
16
|
+
cities : numpy.array
|
|
17
|
+
The cities with 2-dimensional coordinates provided by a matrix where city is represented by a row.
|
|
18
|
+
|
|
19
|
+
"""
|
|
20
|
+
n_cities, _ = cities.shape
|
|
21
|
+
|
|
22
|
+
self.cities = cities
|
|
23
|
+
self.D = cdist(cities, cities)
|
|
24
|
+
|
|
25
|
+
super(TravelingSalesman, self).__init__(
|
|
26
|
+
n_var=n_cities,
|
|
27
|
+
n_obj=1,
|
|
28
|
+
xl=0,
|
|
29
|
+
xu=n_cities,
|
|
30
|
+
vtype=int,
|
|
31
|
+
**kwargs
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
35
|
+
out['F'] = self.get_route_length(x)
|
|
36
|
+
|
|
37
|
+
def get_route_length(self, x):
|
|
38
|
+
n_cities = len(x)
|
|
39
|
+
dist = 0
|
|
40
|
+
for k in range(n_cities - 1):
|
|
41
|
+
i, j = x[k], x[k + 1]
|
|
42
|
+
dist += self.D[i, j]
|
|
43
|
+
|
|
44
|
+
last, first = x[-1], x[0]
|
|
45
|
+
dist += self.D[last, first] # back to the initial city
|
|
46
|
+
return dist
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def create_random_tsp_problem(n_cities, grid_width=100.0, grid_height=None, seed=None):
|
|
50
|
+
if seed is not None:
|
|
51
|
+
np.random.seed(seed)
|
|
52
|
+
grid_height = grid_height if grid_height is not None else grid_width
|
|
53
|
+
cities = np.random.random((n_cities, 2)) * [grid_width, grid_height]
|
|
54
|
+
return TravelingSalesman(cities)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def visualize(problem, x, fig=None, ax=None, show=True, label=True):
|
|
58
|
+
with plt.style.context('ggplot'):
|
|
59
|
+
|
|
60
|
+
if fig is None or ax is None:
|
|
61
|
+
fig, ax = plt.subplots()
|
|
62
|
+
|
|
63
|
+
# plot cities using scatter plot
|
|
64
|
+
ax.scatter(problem.cities[:, 0], problem.cities[:, 1], s=250)
|
|
65
|
+
if label:
|
|
66
|
+
# annotate cities
|
|
67
|
+
for i, c in enumerate(problem.cities):
|
|
68
|
+
ax.annotate(str(i), xy=c, fontsize=10, ha="center", va="center", color="white")
|
|
69
|
+
|
|
70
|
+
# plot the line on the path
|
|
71
|
+
for i in range(len(x)):
|
|
72
|
+
current = x[i]
|
|
73
|
+
next_ = x[(i + 1) % len(x)]
|
|
74
|
+
ax.plot(problem.cities[[current, next_], 0], problem.cities[[current, next_], 1], 'r--')
|
|
75
|
+
|
|
76
|
+
fig.suptitle("Route length: %.4f" % problem.get_route_length(x))
|
|
77
|
+
|
|
78
|
+
if show:
|
|
79
|
+
fig.show()
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import pymoo.gradient.toolbox as anp
|
|
2
|
+
import numpy as np
|
|
3
|
+
|
|
4
|
+
from pymoo.core.problem import Problem
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Zakharov(Problem):
|
|
8
|
+
def __init__(self, n_var=2):
|
|
9
|
+
super().__init__(n_var=n_var, n_obj=1, xl=-10, xu=10, vtype=float)
|
|
10
|
+
|
|
11
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
12
|
+
a = anp.sum(0.5 * anp.arange(1, self.n_var + 1) * x, axis=1)
|
|
13
|
+
out["F"] = anp.sum(anp.square(x), axis=1) + anp.square(a) + anp.power(a, 4)
|
|
14
|
+
|
|
15
|
+
def _calc_pareto_front(self):
|
|
16
|
+
return 0
|
|
17
|
+
|
|
18
|
+
def _calc_pareto_set(self):
|
|
19
|
+
return np.full(self.n_var, 0)
|
pymoo/problems/static.py
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from pymoo.core.meta import Meta
|
|
2
|
+
from pymoo.core.problem import Problem
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class StaticProblem(Meta, Problem):
|
|
6
|
+
|
|
7
|
+
def __init__(self, problem, **kwargs):
|
|
8
|
+
super().__init__(problem)
|
|
9
|
+
self.kwargs = kwargs
|
|
10
|
+
|
|
11
|
+
def _evaluate(self, _, out, *args, **kwargs):
|
|
12
|
+
for K, V in self.kwargs.items():
|
|
13
|
+
out[K] = V
|
|
14
|
+
|
pymoo/problems/util.py
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
import os
|
|
3
|
+
import types
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def decompose(problem, decomposition, weights, return_copy=True):
|
|
9
|
+
if return_copy:
|
|
10
|
+
problem = copy.deepcopy(problem)
|
|
11
|
+
|
|
12
|
+
problem._multi_evaluate = problem._evaluate
|
|
13
|
+
|
|
14
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
15
|
+
self._multi_evaluate(x, out, *args, **kwargs)
|
|
16
|
+
out["F"] = decomposition.do(out["F"], weights, _type="many_to_one")
|
|
17
|
+
|
|
18
|
+
problem._evaluate = types.MethodType(_evaluate, problem)
|
|
19
|
+
problem.n_obj = 1
|
|
20
|
+
|
|
21
|
+
return problem
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def load_pareto_front_from_file(fname):
|
|
25
|
+
current_dir = os.path.dirname(os.path.realpath(__file__))
|
|
26
|
+
fname = os.path.join(current_dir, "pf", "%s" % fname)
|
|
27
|
+
if os.path.isfile(fname):
|
|
28
|
+
pf = np.loadtxt(fname)
|
|
29
|
+
return pf[pf[:, 0].argsort()]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def binomial(n, k):
|
|
33
|
+
if 0 <= k <= n:
|
|
34
|
+
ntok = 1
|
|
35
|
+
ktok = 1
|
|
36
|
+
for t in range(1, min(k, n - k) + 1):
|
|
37
|
+
ntok *= n
|
|
38
|
+
ktok *= t
|
|
39
|
+
n -= 1
|
|
40
|
+
return ntok // ktok
|
|
41
|
+
else:
|
|
42
|
+
return 0
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
from pymoo.core.meta import Meta
|
|
4
|
+
from pymoo.core.problem import Problem
|
|
5
|
+
from pymoo.util.normalization import denormalize, normalize
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ZeroToOne(Meta, Problem):
|
|
9
|
+
|
|
10
|
+
def __init__(self, problem):
|
|
11
|
+
super().__init__(problem)
|
|
12
|
+
assert self.xl is not None and self.xu is not None, "Both, xl and xu, must be set to redefine the problem!"
|
|
13
|
+
self.xl, self.xu = np.zeros(self.n_var), np.ones(self.n_var)
|
|
14
|
+
|
|
15
|
+
def do(self, X, return_values_of, *args, **kwargs):
|
|
16
|
+
Xp = self.normalize(X)
|
|
17
|
+
|
|
18
|
+
out = super().do(Xp, return_values_of, *args, **kwargs)
|
|
19
|
+
out["__X__"] = X
|
|
20
|
+
|
|
21
|
+
return out
|
|
22
|
+
|
|
23
|
+
def denormalize(self, x):
|
|
24
|
+
return denormalize(x, self.__object__.xl, self.__object__.xu)
|
|
25
|
+
|
|
26
|
+
def normalize(self, x):
|
|
27
|
+
return normalize(x, self.__object__.xl, self.__object__.xu)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
def get_termination(name, *args, **kwargs):
|
|
3
|
+
from pymoo.termination.default import DefaultMultiObjectiveTermination, DefaultSingleObjectiveTermination
|
|
4
|
+
from pymoo.termination.max_eval import MaximumFunctionCallTermination
|
|
5
|
+
from pymoo.termination.max_gen import MaximumGenerationTermination
|
|
6
|
+
from pymoo.termination.max_time import TimeBasedTermination
|
|
7
|
+
from pymoo.termination.fmin import MinimumFunctionValueTermination
|
|
8
|
+
|
|
9
|
+
TERMINATION = {
|
|
10
|
+
"n_eval": MaximumFunctionCallTermination,
|
|
11
|
+
"n_evals": MaximumFunctionCallTermination,
|
|
12
|
+
"n_gen": MaximumGenerationTermination,
|
|
13
|
+
"n_iter": MaximumGenerationTermination,
|
|
14
|
+
"fmin": MinimumFunctionValueTermination,
|
|
15
|
+
"time": TimeBasedTermination,
|
|
16
|
+
"soo": DefaultSingleObjectiveTermination,
|
|
17
|
+
"moo": DefaultMultiObjectiveTermination,
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if name not in TERMINATION:
|
|
21
|
+
raise Exception("Termination not found.")
|
|
22
|
+
|
|
23
|
+
return TERMINATION[name](*args, **kwargs)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
from pymoo.core.termination import Termination
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class TerminationCollection(Termination):
|
|
6
|
+
|
|
7
|
+
def __init__(self, *args) -> None:
|
|
8
|
+
super().__init__()
|
|
9
|
+
self.terminations = args
|
|
10
|
+
|
|
11
|
+
def _update(self, algorithm):
|
|
12
|
+
return max([termination.update(algorithm) for termination in self.terminations])
|
pymoo/termination/cv.py
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from pymoo.core.termination import Termination
|
|
2
|
+
from pymoo.termination.delta import DeltaToleranceTermination
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ConstraintViolationTermination(DeltaToleranceTermination):
|
|
6
|
+
|
|
7
|
+
def __init__(self, tol=1e-6, terminate_when_feasible=True, **kwargs):
|
|
8
|
+
super().__init__(tol, **kwargs)
|
|
9
|
+
self.terminate_when_feasible = terminate_when_feasible
|
|
10
|
+
|
|
11
|
+
def _update(self, algorithm):
|
|
12
|
+
if algorithm.problem.has_constraints():
|
|
13
|
+
feasible_found = any(algorithm.opt.get("feas"))
|
|
14
|
+
|
|
15
|
+
if feasible_found:
|
|
16
|
+
if self.terminate_when_feasible:
|
|
17
|
+
return 1.0
|
|
18
|
+
else:
|
|
19
|
+
return 0.0
|
|
20
|
+
|
|
21
|
+
else:
|
|
22
|
+
return super()._update(algorithm)
|
|
23
|
+
else:
|
|
24
|
+
return 0.0
|
|
25
|
+
|
|
26
|
+
def _delta(self, prev, current):
|
|
27
|
+
return max(0.0, prev - current)
|
|
28
|
+
|
|
29
|
+
def _data(self, algorithm):
|
|
30
|
+
return algorithm.opt.get("CV").min()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class UntilFeasibleTermination(Termination):
|
|
34
|
+
|
|
35
|
+
def __init__(self) -> None:
|
|
36
|
+
super().__init__()
|
|
37
|
+
self.initial_cv = None
|
|
38
|
+
|
|
39
|
+
def _update(self, algorithm):
|
|
40
|
+
cv = algorithm.opt.get("CV").min()
|
|
41
|
+
|
|
42
|
+
if self.initial_cv is None:
|
|
43
|
+
if cv <= 0:
|
|
44
|
+
self.initial_cv = 1e-32
|
|
45
|
+
else:
|
|
46
|
+
self.initial_cv = cv
|
|
47
|
+
|
|
48
|
+
return 1 - cv / self.initial_cv
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from pymoo.core.termination import Termination
|
|
2
|
+
from pymoo.termination.cv import ConstraintViolationTermination
|
|
3
|
+
from pymoo.termination.ftol import SingleObjectiveSpaceTermination, MultiObjectiveSpaceTermination
|
|
4
|
+
from pymoo.termination.max_eval import MaximumFunctionCallTermination
|
|
5
|
+
from pymoo.termination.max_gen import MaximumGenerationTermination
|
|
6
|
+
from pymoo.termination.robust import RobustTermination
|
|
7
|
+
from pymoo.termination.xtol import DesignSpaceTermination
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class DefaultTermination(Termination):
|
|
11
|
+
|
|
12
|
+
def __init__(self, x, cv, f, n_max_gen=1000, n_max_evals=100000) -> None:
|
|
13
|
+
super().__init__()
|
|
14
|
+
self.x = x
|
|
15
|
+
self.cv = cv
|
|
16
|
+
self.f = f
|
|
17
|
+
|
|
18
|
+
self.max_gen = MaximumGenerationTermination(n_max_gen)
|
|
19
|
+
self.max_evals = MaximumFunctionCallTermination(n_max_evals)
|
|
20
|
+
|
|
21
|
+
self.criteria = [self.x, self.cv, self.f, self.max_gen, self.max_evals]
|
|
22
|
+
|
|
23
|
+
def _update(self, algorithm):
|
|
24
|
+
p = [criterion.update(algorithm) for criterion in self.criteria]
|
|
25
|
+
return max(p)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class DefaultSingleObjectiveTermination(DefaultTermination):
|
|
29
|
+
|
|
30
|
+
def __init__(self, xtol=1e-8, cvtol=1e-8, ftol=1e-6, period=30, **kwargs) -> None:
|
|
31
|
+
x = RobustTermination(DesignSpaceTermination(xtol), period=period)
|
|
32
|
+
cv = RobustTermination(ConstraintViolationTermination(cvtol, terminate_when_feasible=False), period=period)
|
|
33
|
+
f = RobustTermination(SingleObjectiveSpaceTermination(ftol, only_feas=True), period=period)
|
|
34
|
+
super().__init__(x, cv, f, **kwargs)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class DefaultMultiObjectiveTermination(DefaultTermination):
|
|
38
|
+
|
|
39
|
+
def __init__(self, xtol=0.0005, cvtol=1e-8, ftol=0.005, n_skip=5, period=50, **kwargs) -> None:
|
|
40
|
+
x = RobustTermination(DesignSpaceTermination(tol=xtol, n_skip=n_skip), period)
|
|
41
|
+
cv = RobustTermination(ConstraintViolationTermination(cvtol, terminate_when_feasible=False, n_skip=n_skip), period)
|
|
42
|
+
f = RobustTermination(MultiObjectiveSpaceTermination(ftol, only_feas=True, n_skip=n_skip), period)
|
|
43
|
+
super().__init__(x, cv, f, **kwargs)
|
|
44
|
+
|
|
45
|
+
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import math
|
|
2
|
+
from abc import abstractmethod
|
|
3
|
+
|
|
4
|
+
from pymoo.core.termination import Termination
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class DeltaToleranceTermination(Termination):
|
|
8
|
+
|
|
9
|
+
def __init__(self, tol, n_skip=0):
|
|
10
|
+
super().__init__()
|
|
11
|
+
|
|
12
|
+
# the tolerance threshold the difference (delta) to be under
|
|
13
|
+
assert tol >= 0
|
|
14
|
+
self.tol = tol
|
|
15
|
+
|
|
16
|
+
# the previous values to calculate the difference
|
|
17
|
+
self.data = None
|
|
18
|
+
|
|
19
|
+
# a counter of update calls
|
|
20
|
+
self.counter = 0
|
|
21
|
+
|
|
22
|
+
# whether some updates should be skipped
|
|
23
|
+
self.n_skip = n_skip
|
|
24
|
+
|
|
25
|
+
def _update(self, algorithm):
|
|
26
|
+
|
|
27
|
+
# the object from the previous iteration
|
|
28
|
+
prev = self.data
|
|
29
|
+
|
|
30
|
+
# and the one from the current iteration
|
|
31
|
+
current = self._data(algorithm)
|
|
32
|
+
|
|
33
|
+
# if there is no previous element to use
|
|
34
|
+
if prev is None:
|
|
35
|
+
perc = 0.0
|
|
36
|
+
|
|
37
|
+
elif self.counter > 0 and self.counter % (self.n_skip + 1) != 0:
|
|
38
|
+
perc = self.perc
|
|
39
|
+
|
|
40
|
+
else:
|
|
41
|
+
tol = self.tol
|
|
42
|
+
delta = self._delta(prev, current)
|
|
43
|
+
|
|
44
|
+
if delta <= tol:
|
|
45
|
+
return 1.0
|
|
46
|
+
else:
|
|
47
|
+
v = (delta - tol)
|
|
48
|
+
perc = 1 / (1 + v)
|
|
49
|
+
|
|
50
|
+
# remember the data from the current iteration and set it to data
|
|
51
|
+
self.data = current
|
|
52
|
+
|
|
53
|
+
# increase the function update counter
|
|
54
|
+
self.counter += 1
|
|
55
|
+
|
|
56
|
+
return perc
|
|
57
|
+
|
|
58
|
+
@abstractmethod
|
|
59
|
+
def _delta(self, prev, current):
|
|
60
|
+
pass
|
|
61
|
+
|
|
62
|
+
@abstractmethod
|
|
63
|
+
def _data(self, algorithm):
|
|
64
|
+
pass
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from pymoo.core.termination import Termination
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class MinimumFunctionValueTermination(Termination):
|
|
5
|
+
|
|
6
|
+
def __init__(self, fmin) -> None:
|
|
7
|
+
super().__init__()
|
|
8
|
+
self.fmin = fmin
|
|
9
|
+
|
|
10
|
+
def _update(self, algorithm):
|
|
11
|
+
opt = algorithm.opt
|
|
12
|
+
|
|
13
|
+
if not any(opt.get("feas")):
|
|
14
|
+
return 0.0
|
|
15
|
+
else:
|
|
16
|
+
return self.fmin / opt.get("F").min()
|