pymoo 0.6.1.5.dev0__cp39-cp39-musllinux_1_2_x86_64.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-39-x86_64-linux-gnu.so +0 -0
- pymoo/cython/calc_perpendicular_distance.pyx +67 -0
- pymoo/cython/decomposition.cpython-39-x86_64-linux-gnu.so +0 -0
- pymoo/cython/decomposition.pyx +165 -0
- pymoo/cython/hv.cpython-39-x86_64-linux-gnu.so +0 -0
- pymoo/cython/hv.pyx +18 -0
- pymoo/cython/info.cpython-39-x86_64-linux-gnu.so +0 -0
- pymoo/cython/info.pyx +5 -0
- pymoo/cython/mnn.cpython-39-x86_64-linux-gnu.so +0 -0
- pymoo/cython/mnn.pyx +273 -0
- pymoo/cython/non_dominated_sorting.cpython-39-x86_64-linux-gnu.so +0 -0
- pymoo/cython/non_dominated_sorting.pyx +645 -0
- pymoo/cython/pruning_cd.cpython-39-x86_64-linux-gnu.so +0 -0
- pymoo/cython/pruning_cd.pyx +197 -0
- pymoo/cython/stochastic_ranking.cpython-39-x86_64-linux-gnu.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 +330 -0
- pymoo-0.6.1.5.dev0.dist-info/WHEEL +5 -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
- pymoo.libs/libgcc_s-2298274a.so.1 +0 -0
- pymoo.libs/libstdc++-08d5c7eb.so.6.0.33 +0 -0
pymoo/core/result.py
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
class Result:
|
|
2
|
+
"""
|
|
3
|
+
The resulting object of an optimization run.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
def __init__(self) -> None:
|
|
7
|
+
super().__init__()
|
|
8
|
+
|
|
9
|
+
self.opt = None
|
|
10
|
+
self.success = None
|
|
11
|
+
self.message = None
|
|
12
|
+
|
|
13
|
+
# ! other attributes to be set as well
|
|
14
|
+
|
|
15
|
+
# the problem that was solved
|
|
16
|
+
self.problem = None
|
|
17
|
+
|
|
18
|
+
# the archive stored during the run
|
|
19
|
+
self.archive = None
|
|
20
|
+
|
|
21
|
+
# the optimal solution for that problem
|
|
22
|
+
self.pf = None
|
|
23
|
+
|
|
24
|
+
# the algorithm that was used for optimization
|
|
25
|
+
self.algorithm = None
|
|
26
|
+
|
|
27
|
+
# the final population if it applies
|
|
28
|
+
self.pop = None
|
|
29
|
+
|
|
30
|
+
# directly the values of opt
|
|
31
|
+
self.X, self.F, self.CV, self.G, self.H = None, None, None, None, None
|
|
32
|
+
|
|
33
|
+
# all the timings that are stored of the run
|
|
34
|
+
self.start_time, self.end_time, self.exec_time = None, None, None
|
|
35
|
+
|
|
36
|
+
# the history of the optimization run is they were saved
|
|
37
|
+
self.history = []
|
|
38
|
+
|
|
39
|
+
# data stored within the algorithm
|
|
40
|
+
self.data = None
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def cv(self):
|
|
44
|
+
return self.CV[0]
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def f(self):
|
|
48
|
+
return self.F[0]
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def feas(self):
|
|
52
|
+
return self.cv <= 0
|
pymoo/core/sampling.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from abc import abstractmethod
|
|
2
|
+
|
|
3
|
+
from pymoo.core.operator import Operator
|
|
4
|
+
from pymoo.core.population import Population
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Sampling(Operator):
|
|
8
|
+
|
|
9
|
+
def __init__(self) -> None:
|
|
10
|
+
"""
|
|
11
|
+
This abstract class represents any sampling strategy that can be used to create an initial population or
|
|
12
|
+
an initial search point.
|
|
13
|
+
"""
|
|
14
|
+
super().__init__()
|
|
15
|
+
|
|
16
|
+
def do(self, problem, n_samples, **kwargs):
|
|
17
|
+
"""
|
|
18
|
+
Sample new points with problem information if necessary.
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
|
|
23
|
+
problem : :class:`~pymoo.core.problem.Problem`
|
|
24
|
+
The problem to which points should be sampled. (lower and upper bounds, discrete, binary, ...)
|
|
25
|
+
|
|
26
|
+
n_samples : int
|
|
27
|
+
Number of samples
|
|
28
|
+
|
|
29
|
+
Returns
|
|
30
|
+
-------
|
|
31
|
+
pop : Population
|
|
32
|
+
The output population after sampling
|
|
33
|
+
|
|
34
|
+
"""
|
|
35
|
+
val = self._do(problem, n_samples, **kwargs)
|
|
36
|
+
return Population.new("X", val)
|
|
37
|
+
|
|
38
|
+
@abstractmethod
|
|
39
|
+
def _do(self, problem, n_samples, **kwargs):
|
|
40
|
+
pass
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
pymoo/core/selection.py
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from abc import abstractmethod
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from pymoo.core.operator import Operator
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Selection(Operator):
|
|
9
|
+
|
|
10
|
+
def __init__(self, **kwargs) -> None:
|
|
11
|
+
"""
|
|
12
|
+
This class is used to select parents for the mating or other evolutionary operators.
|
|
13
|
+
Several strategies can be used to increase the selection pressure.
|
|
14
|
+
"""
|
|
15
|
+
super().__init__(**kwargs)
|
|
16
|
+
|
|
17
|
+
def do(self, problem, pop, n_select, n_parents, to_pop=True, **kwargs):
|
|
18
|
+
"""
|
|
19
|
+
Choose from the population new individuals to be selected.
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
problem: class
|
|
26
|
+
The problem to be solved. Provides information such as lower and upper bounds or feasibility
|
|
27
|
+
conditions for custom crossovers.
|
|
28
|
+
|
|
29
|
+
pop : :class:`~pymoo.core.population.Population`
|
|
30
|
+
The population which should be selected from. Some criteria from the design or objective space
|
|
31
|
+
might be used for the selection. Therefore, only the number of individual might be not enough.
|
|
32
|
+
|
|
33
|
+
n_select : int
|
|
34
|
+
Number of individuals to select.
|
|
35
|
+
|
|
36
|
+
n_parents : int
|
|
37
|
+
Number of parents needed to create an offspring.
|
|
38
|
+
|
|
39
|
+
to_pop : bool
|
|
40
|
+
Whether IF(!) the implementation returns only indices, it should be converted to individuals.
|
|
41
|
+
|
|
42
|
+
Returns
|
|
43
|
+
-------
|
|
44
|
+
parents : list
|
|
45
|
+
List of parents to be used in the crossover
|
|
46
|
+
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
ret = self._do(problem, pop, n_select, n_parents, **kwargs)
|
|
50
|
+
|
|
51
|
+
# if some selections return indices they are used to create the individual list
|
|
52
|
+
if to_pop and isinstance(ret, np.ndarray) and np.issubdtype(ret.dtype, np.integer):
|
|
53
|
+
ret = pop[ret]
|
|
54
|
+
|
|
55
|
+
return ret
|
|
56
|
+
|
|
57
|
+
@abstractmethod
|
|
58
|
+
def _do(self, problem, pop, n_select, n_parents, **kwargs):
|
|
59
|
+
pass
|
|
60
|
+
|
|
61
|
+
|
pymoo/core/solution.py
ADDED
pymoo/core/survival.py
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
from abc import abstractmethod
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from pymoo.core.population import Population
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# ---------------------------------------------------------------------------------------------------------
|
|
9
|
+
# Survival
|
|
10
|
+
# ---------------------------------------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Survival:
|
|
14
|
+
|
|
15
|
+
def __init__(self, filter_infeasible=True):
|
|
16
|
+
super().__init__()
|
|
17
|
+
self.filter_infeasible = filter_infeasible
|
|
18
|
+
|
|
19
|
+
def do(self,
|
|
20
|
+
problem,
|
|
21
|
+
pop,
|
|
22
|
+
*args,
|
|
23
|
+
n_survive=None,
|
|
24
|
+
return_indices=False,
|
|
25
|
+
**kwargs):
|
|
26
|
+
|
|
27
|
+
# make sure the population has at least one individual
|
|
28
|
+
if len(pop) == 0:
|
|
29
|
+
return pop
|
|
30
|
+
|
|
31
|
+
if n_survive is None:
|
|
32
|
+
n_survive = len(pop)
|
|
33
|
+
|
|
34
|
+
n_survive = min(n_survive, len(pop))
|
|
35
|
+
|
|
36
|
+
# if the split should be done beforehand
|
|
37
|
+
if self.filter_infeasible and problem.has_constraints():
|
|
38
|
+
|
|
39
|
+
# split feasible and infeasible solutions
|
|
40
|
+
feas, infeas = split_by_feasibility(pop, sort_infeas_by_cv=True)
|
|
41
|
+
|
|
42
|
+
if len(feas) == 0:
|
|
43
|
+
survivors = Population()
|
|
44
|
+
else:
|
|
45
|
+
survivors = self._do(problem, pop[feas], *args, n_survive=min(len(feas), n_survive), **kwargs)
|
|
46
|
+
|
|
47
|
+
# calculate how many individuals are still remaining to be filled up with infeasible ones
|
|
48
|
+
n_remaining = n_survive - len(survivors)
|
|
49
|
+
|
|
50
|
+
# if infeasible solutions needs to be added
|
|
51
|
+
if n_remaining > 0:
|
|
52
|
+
survivors = Population.merge(survivors, pop[infeas[:n_remaining]])
|
|
53
|
+
|
|
54
|
+
else:
|
|
55
|
+
survivors = self._do(problem, pop, *args, n_survive=n_survive, **kwargs)
|
|
56
|
+
|
|
57
|
+
if return_indices:
|
|
58
|
+
H = {}
|
|
59
|
+
for k, ind in enumerate(pop):
|
|
60
|
+
H[ind] = k
|
|
61
|
+
return [H[survivor] for survivor in survivors]
|
|
62
|
+
else:
|
|
63
|
+
return survivors
|
|
64
|
+
|
|
65
|
+
@abstractmethod
|
|
66
|
+
def _do(self, problem, pop, *args, n_survive=None, **kwargs):
|
|
67
|
+
pass
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class ToReplacement(Survival):
|
|
71
|
+
|
|
72
|
+
def __init__(self, survival):
|
|
73
|
+
super().__init__(False)
|
|
74
|
+
self.survival = survival
|
|
75
|
+
|
|
76
|
+
def _do(self, problem, pop, off, **kwargs):
|
|
77
|
+
merged = Population.merge(pop, off)
|
|
78
|
+
I = self.survival.do(problem, merged, n_survive=len(merged), return_indices=True, **kwargs)
|
|
79
|
+
merged.set("__rank__", I)
|
|
80
|
+
|
|
81
|
+
for k in range(len(pop)):
|
|
82
|
+
if off[k].get("__rank__") < pop[k].get("__rank__"):
|
|
83
|
+
pop[k] = off[k]
|
|
84
|
+
|
|
85
|
+
return pop
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def split_by_feasibility(pop, sort_infeas_by_cv=True, sort_feas_by_obj=False, return_pop=False):
|
|
89
|
+
F, CV, b = pop.get("F", "CV", "FEAS")
|
|
90
|
+
|
|
91
|
+
feasible = np.where(b)[0]
|
|
92
|
+
infeasible = np.where(~b)[0]
|
|
93
|
+
|
|
94
|
+
if sort_infeas_by_cv:
|
|
95
|
+
infeasible = infeasible[np.argsort(CV[infeasible, 0])]
|
|
96
|
+
|
|
97
|
+
if sort_feas_by_obj:
|
|
98
|
+
feasible = feasible[np.argsort(F[feasible, 0])]
|
|
99
|
+
|
|
100
|
+
if not return_pop:
|
|
101
|
+
return feasible, infeasible
|
|
102
|
+
else:
|
|
103
|
+
return feasible, infeasible, pop[feasible], pop[infeasible]
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from abc import abstractmethod
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Termination:
|
|
5
|
+
|
|
6
|
+
def __init__(self) -> None:
|
|
7
|
+
super().__init__()
|
|
8
|
+
|
|
9
|
+
# the algorithm can be forced to terminate by setting this attribute to true
|
|
10
|
+
self.force_termination = False
|
|
11
|
+
|
|
12
|
+
# the value indicating how much perc has been made
|
|
13
|
+
self.perc = 0.0
|
|
14
|
+
|
|
15
|
+
def update(self, algorithm):
|
|
16
|
+
"""
|
|
17
|
+
Provide the termination criterion a current status of the algorithm to update the perc.
|
|
18
|
+
|
|
19
|
+
Parameters
|
|
20
|
+
----------
|
|
21
|
+
algorithm : object
|
|
22
|
+
The algorithm object which is used to determine whether a run has terminated.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
if self.force_termination:
|
|
26
|
+
progress = 1.0
|
|
27
|
+
else:
|
|
28
|
+
progress = self._update(algorithm)
|
|
29
|
+
assert progress >= 0.0, "Invalid progress was set by the TerminationCriterion."
|
|
30
|
+
|
|
31
|
+
self.perc = progress
|
|
32
|
+
return self.perc
|
|
33
|
+
|
|
34
|
+
def has_terminated(self):
|
|
35
|
+
return self.perc >= 1.0
|
|
36
|
+
|
|
37
|
+
def do_continue(self):
|
|
38
|
+
return not self.has_terminated()
|
|
39
|
+
|
|
40
|
+
def terminate(self):
|
|
41
|
+
self.force_termination = True
|
|
42
|
+
|
|
43
|
+
@abstractmethod
|
|
44
|
+
def _update(self, algorithm):
|
|
45
|
+
pass
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class NoTermination(Termination):
|
|
49
|
+
|
|
50
|
+
def _update(self, algorithm):
|
|
51
|
+
return 0.0
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class MultipleCriteria(Termination):
|
|
55
|
+
|
|
56
|
+
def __init__(self, *args) -> None:
|
|
57
|
+
super().__init__()
|
|
58
|
+
self.criteria = args
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class TerminateIfAny(MultipleCriteria):
|
|
62
|
+
|
|
63
|
+
def _update(self, algorithm):
|
|
64
|
+
return max([termination.update(algorithm) for termination in self.criteria])
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class TerminateIfAll(MultipleCriteria):
|
|
68
|
+
|
|
69
|
+
def _update(self, algorithm):
|
|
70
|
+
return min([termination.update(algorithm) for termination in self.criteria])
|