pymoo 0.6.1.6__cp312-cp312-macosx_10_13_universal2.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.
- 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 +110 -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 +91 -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/cmopso.py +239 -0
- pymoo/algorithms/moo/ctaea.py +305 -0
- pymoo/algorithms/moo/dnsga2.py +80 -0
- pymoo/algorithms/moo/kgb.py +450 -0
- pymoo/algorithms/moo/moead.py +183 -0
- pymoo/algorithms/moo/mopso_cd.py +309 -0
- pymoo/algorithms/moo/nsga2.py +113 -0
- pymoo/algorithms/moo/nsga3.py +361 -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 +196 -0
- pymoo/algorithms/moo/spea2.py +191 -0
- pymoo/algorithms/moo/unsga3.py +49 -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 +162 -0
- pymoo/algorithms/soo/nonconvex/cmaes.py +556 -0
- pymoo/algorithms/soo/nonconvex/de.py +283 -0
- pymoo/algorithms/soo/nonconvex/direct.py +148 -0
- pymoo/algorithms/soo/nonconvex/es.py +213 -0
- pymoo/algorithms/soo/nonconvex/g3pcx.py +94 -0
- pymoo/algorithms/soo/nonconvex/ga.py +95 -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/nrbo.py +191 -0
- pymoo/algorithms/soo/nonconvex/optuna.py +80 -0
- pymoo/algorithms/soo/nonconvex/pattern.py +185 -0
- pymoo/algorithms/soo/nonconvex/pso.py +337 -0
- pymoo/algorithms/soo/nonconvex/pso_ep.py +307 -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/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 +66 -0
- pymoo/constraints/as_obj.py +56 -0
- pymoo/constraints/as_penalty.py +41 -0
- pymoo/constraints/eps.py +34 -0
- pymoo/constraints/from_bounds.py +36 -0
- pymoo/core/__init__.py +0 -0
- pymoo/core/algorithm.py +408 -0
- pymoo/core/callback.py +38 -0
- pymoo/core/crossover.py +79 -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 +65 -0
- pymoo/core/initialization.py +44 -0
- pymoo/core/mating.py +39 -0
- pymoo/core/meta.py +21 -0
- pymoo/core/mixed.py +164 -0
- pymoo/core/mutation.py +44 -0
- pymoo/core/operator.py +46 -0
- pymoo/core/parameters.py +134 -0
- pymoo/core/plot.py +208 -0
- pymoo/core/population.py +180 -0
- pymoo/core/problem.py +373 -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 +45 -0
- pymoo/core/selection.py +61 -0
- pymoo/core/solution.py +10 -0
- pymoo/core/survival.py +107 -0
- pymoo/core/termination.py +70 -0
- pymoo/core/variable.py +415 -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/functions/__init__.py +135 -0
- pymoo/functions/compiled/__init__.py +0 -0
- pymoo/functions/compiled/calc_perpendicular_distance.cpp +27464 -0
- pymoo/functions/compiled/calc_perpendicular_distance.cpython-312-darwin.so +0 -0
- pymoo/functions/compiled/decomposition.cpp +28853 -0
- pymoo/functions/compiled/decomposition.cpython-312-darwin.so +0 -0
- pymoo/functions/compiled/info.cpp +7058 -0
- pymoo/functions/compiled/info.cpython-312-darwin.so +0 -0
- pymoo/functions/compiled/mnn.cpp +30095 -0
- pymoo/functions/compiled/mnn.cpython-312-darwin.so +0 -0
- pymoo/functions/compiled/non_dominated_sorting.cpp +35692 -0
- pymoo/functions/compiled/non_dominated_sorting.cpython-312-darwin.so +0 -0
- pymoo/functions/compiled/pruning_cd.cpp +29248 -0
- pymoo/functions/compiled/pruning_cd.cpython-312-darwin.so +0 -0
- pymoo/functions/compiled/stochastic_ranking.cpp +28042 -0
- pymoo/functions/compiled/stochastic_ranking.cpython-312-darwin.so +0 -0
- pymoo/functions/standard/__init__.py +1 -0
- pymoo/functions/standard/calc_perpendicular_distance.py +20 -0
- pymoo/functions/standard/decomposition.py +18 -0
- pymoo/functions/standard/hv.py +5 -0
- pymoo/functions/standard/mnn.py +78 -0
- pymoo/functions/standard/non_dominated_sorting.py +474 -0
- pymoo/functions/standard/pruning_cd.py +93 -0
- pymoo/functions/standard/stochastic_ranking.py +42 -0
- pymoo/gradient/__init__.py +24 -0
- pymoo/gradient/automatic.py +85 -0
- pymoo/gradient/grad_autograd.py +105 -0
- pymoo/gradient/grad_complex.py +35 -0
- pymoo/gradient/grad_jax.py +51 -0
- pymoo/gradient/numpy.py +22 -0
- pymoo/gradient/toolbox/__init__.py +19 -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 +59 -0
- pymoo/indicators/hv/approximate.py +105 -0
- pymoo/indicators/hv/exact.py +68 -0
- pymoo/indicators/hv/exact_2d.py +102 -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 +190 -0
- pymoo/operators/crossover/__init__.py +0 -0
- pymoo/operators/crossover/binx.py +47 -0
- pymoo/operators/crossover/dex.py +125 -0
- pymoo/operators/crossover/erx.py +164 -0
- pymoo/operators/crossover/expx.py +53 -0
- pymoo/operators/crossover/hux.py +37 -0
- pymoo/operators/crossover/nox.py +25 -0
- pymoo/operators/crossover/ox.py +88 -0
- pymoo/operators/crossover/pcx.py +84 -0
- pymoo/operators/crossover/pntx.py +49 -0
- pymoo/operators/crossover/sbx.py +137 -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 +60 -0
- pymoo/operators/mutation/inversion.py +42 -0
- pymoo/operators/mutation/nom.py +7 -0
- pymoo/operators/mutation/pm.py +96 -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 +97 -0
- pymoo/operators/repair/inverse_penalty.py +91 -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 +76 -0
- pymoo/operators/sampling/rnd.py +52 -0
- pymoo/operators/selection/__init__.py +0 -0
- pymoo/operators/selection/rnd.py +75 -0
- pymoo/operators/selection/tournament.py +78 -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 +212 -0
- pymoo/operators/survival/rank_and_crowding/metrics.py +208 -0
- pymoo/optimize.py +72 -0
- pymoo/parallelization/__init__.py +15 -0
- pymoo/parallelization/dask.py +25 -0
- pymoo/parallelization/joblib.py +28 -0
- pymoo/parallelization/ray.py +31 -0
- pymoo/parallelization/starmap.py +24 -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 +451 -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 +553 -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 +113 -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 +49 -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 +33 -0
- pymoo/util/archive.py +152 -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 +100 -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/hv.py +21 -0
- pymoo/util/matlab_engine.py +39 -0
- pymoo/util/misc.py +447 -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/find_non_dominated.py +54 -0
- pymoo/util/nds/naive_non_dominated_sort.py +36 -0
- pymoo/util/nds/non_dominated_sorting.py +94 -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/randomized_argsort.py +63 -0
- pymoo/util/ref_dirs/__init__.py +24 -0
- pymoo/util/ref_dirs/construction.py +89 -0
- pymoo/util/ref_dirs/das_dennis.py +52 -0
- pymoo/util/ref_dirs/energy.py +317 -0
- pymoo/util/ref_dirs/energy_layer.py +119 -0
- pymoo/util/ref_dirs/genetic_algorithm.py +64 -0
- pymoo/util/ref_dirs/incremental.py +69 -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 +258 -0
- pymoo/util/remote.py +55 -0
- pymoo/util/roulette.py +29 -0
- pymoo/util/running_metric.py +128 -0
- pymoo/util/sliding_window.py +25 -0
- pymoo/util/value_functions.py +720 -0
- pymoo/util/vectors.py +40 -0
- pymoo/util/vf_dominator.py +102 -0
- pymoo/vendor/__init__.py +0 -0
- pymoo/vendor/cec2018.py +398 -0
- pymoo/vendor/gta.py +617 -0
- pymoo/vendor/vendor_cmaes.py +421 -0
- pymoo/vendor/vendor_coco.py +81 -0
- pymoo/vendor/vendor_scipy.py +232 -0
- pymoo/version.py +1 -0
- pymoo/visualization/__init__.py +21 -0
- pymoo/visualization/app/__init__.py +0 -0
- pymoo/visualization/app/pso.py +61 -0
- pymoo/visualization/fitness_landscape.py +128 -0
- pymoo/visualization/heatmap.py +123 -0
- pymoo/visualization/matplotlib.py +61 -0
- pymoo/visualization/pcp.py +121 -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 +296 -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.6.dist-info/METADATA +209 -0
- pymoo-0.6.1.6.dist-info/RECORD +337 -0
- pymoo-0.6.1.6.dist-info/WHEEL +6 -0
- pymoo-0.6.1.6.dist-info/licenses/LICENSE +191 -0
- pymoo-0.6.1.6.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from pymoo.core.population import Population
|
|
6
|
+
from pymoo.core.repair import Repair
|
|
7
|
+
from pymoo.util import default_random_state
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def is_in_bounds(X, xl, xu):
|
|
11
|
+
return np.where(np.all(np.logical_and(X >= xl, X <= xu), axis=1))[0]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def is_in_bounds_by_problem(problem, X):
|
|
15
|
+
return is_in_bounds(X, problem.xl, problem.xu)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def is_out_of_bounds(X, xl, xu):
|
|
19
|
+
return np.where(np.any(np.logical_or(X < xl, X > xu), axis=1))[0]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def is_out_of_bounds_by_problem(problem, X):
|
|
23
|
+
return is_out_of_bounds(X, problem.xl, problem.xu)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def repeat_bounds(xl, xu, n):
|
|
27
|
+
XL = np.tile(xl, (n, 1))
|
|
28
|
+
XU = np.tile(xu, (n, 1))
|
|
29
|
+
return XL, XU
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def repair_clamp(Xp, xl, xu):
|
|
33
|
+
XL, XU = repeat_bounds(xl, xu, len(Xp))
|
|
34
|
+
|
|
35
|
+
I = np.where(Xp < XL)
|
|
36
|
+
Xp[I] = XL[I]
|
|
37
|
+
|
|
38
|
+
I = np.where(Xp > XU)
|
|
39
|
+
Xp[I] = XU[I]
|
|
40
|
+
|
|
41
|
+
return Xp
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def repair_periodic(Xp, xl, xu):
|
|
45
|
+
XL, XU = repeat_bounds(xl, xu, len(Xp))
|
|
46
|
+
|
|
47
|
+
S = (XU - XL)
|
|
48
|
+
|
|
49
|
+
I = np.where(Xp < XL)
|
|
50
|
+
Xp[I] = XU[I] - (XL[I] - Xp[I]) % S[I]
|
|
51
|
+
|
|
52
|
+
I = np.where(Xp > XU)
|
|
53
|
+
Xp[I] = XL[I] + (Xp[I] - XU[I]) % S[I]
|
|
54
|
+
|
|
55
|
+
return Xp
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@default_random_state
|
|
59
|
+
def repair_random_init(Xp, X, xl, xu, random_state=None):
|
|
60
|
+
XL, XU = repeat_bounds(xl, xu, len(Xp))
|
|
61
|
+
|
|
62
|
+
i, j = np.where(Xp < XL)
|
|
63
|
+
if len(i) > 0:
|
|
64
|
+
Xp[i, j] = XL[i, j] + random_state.random(len(i)) * (X[i, j] - XL[i, j])
|
|
65
|
+
|
|
66
|
+
i, j = np.where(Xp > XU)
|
|
67
|
+
if len(i) > 0:
|
|
68
|
+
Xp[i, j] = XU[i, j] - random_state.random(len(i)) * (XU[i, j] - X[i, j])
|
|
69
|
+
|
|
70
|
+
return Xp
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class BoundsRepair(Repair):
|
|
74
|
+
|
|
75
|
+
def _do(self,
|
|
76
|
+
problem,
|
|
77
|
+
pop_or_X,
|
|
78
|
+
check_out_of_bounds=True,
|
|
79
|
+
**kwargs):
|
|
80
|
+
|
|
81
|
+
is_array = not isinstance(pop_or_X, Population)
|
|
82
|
+
|
|
83
|
+
X = pop_or_X if is_array else pop_or_X.get("X")
|
|
84
|
+
|
|
85
|
+
X = self.repair_out_of_bounds(problem, X, **kwargs)
|
|
86
|
+
|
|
87
|
+
assert len(is_out_of_bounds_by_problem(problem, X)) == 0
|
|
88
|
+
|
|
89
|
+
if is_array:
|
|
90
|
+
return X
|
|
91
|
+
else:
|
|
92
|
+
pop_or_X.set("X", X)
|
|
93
|
+
return pop_or_X
|
|
94
|
+
|
|
95
|
+
@abc.abstractmethod
|
|
96
|
+
def repair_out_of_bounds(self, problem, X, **kwargs):
|
|
97
|
+
pass
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
from pymoo.operators.repair.bounds_repair import BoundsRepair
|
|
4
|
+
from pymoo.util import default_random_state
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@default_random_state
|
|
8
|
+
def inverse_penality(x, p, xl, xu, alpha=None, random_state=None):
|
|
9
|
+
assert len(p) == len(x)
|
|
10
|
+
|
|
11
|
+
normv = np.linalg.norm(p - x)
|
|
12
|
+
|
|
13
|
+
# violated boundaries
|
|
14
|
+
idl = x < xl
|
|
15
|
+
idr = xu < x
|
|
16
|
+
|
|
17
|
+
# if nothing is out of bounds just return the value
|
|
18
|
+
if not np.any(np.logical_or(idl, idr)):
|
|
19
|
+
return x
|
|
20
|
+
|
|
21
|
+
else:
|
|
22
|
+
# lower bounds of Y
|
|
23
|
+
diff = (p - x)
|
|
24
|
+
diff[diff == 0] = 1e-32
|
|
25
|
+
d = normv * np.max(np.maximum(idl * (xl - x) / diff, idr * (xu - x) / diff))
|
|
26
|
+
|
|
27
|
+
# upper bounds on Y
|
|
28
|
+
bounds = np.array([~idl * ((xl - x) / diff), ~idr * (xu - x) / diff])
|
|
29
|
+
|
|
30
|
+
D = normv * np.min(bounds[bounds > 0])
|
|
31
|
+
|
|
32
|
+
if alpha is None:
|
|
33
|
+
alpha = (normv - d) / normv
|
|
34
|
+
alpha += 1e-32
|
|
35
|
+
|
|
36
|
+
r = random_state.random()
|
|
37
|
+
Y = d * (1.0 + alpha * np.tan(r * np.arctan((D - d) / (alpha * d))))
|
|
38
|
+
|
|
39
|
+
ret = x + (p - x) * Y / normv
|
|
40
|
+
|
|
41
|
+
# for floating point error - in theory it will always be in bounds
|
|
42
|
+
ret[ret < xl] = xl[ret < xl]
|
|
43
|
+
ret[ret > xu] = xu[ret > xu]
|
|
44
|
+
|
|
45
|
+
return ret
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def inverse_penality_by_problem(problem, x, p, **kwargs):
|
|
49
|
+
return inverse_penality(x, p, problem.xl, problem.xu, **kwargs)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class InversePenaltyOutOfBoundsRepair(BoundsRepair):
|
|
53
|
+
|
|
54
|
+
def repair_out_of_bounds(self, problem, X, P=None, **kwargs):
|
|
55
|
+
if P is None:
|
|
56
|
+
raise Exception("For this out of bounds handling a parent solution in bounds needs to be provided.")
|
|
57
|
+
assert len(X) == len(P)
|
|
58
|
+
n = len(X)
|
|
59
|
+
|
|
60
|
+
for k in range(n):
|
|
61
|
+
X[k] = inverse_penality_by_problem(problem, X[k], P[k])
|
|
62
|
+
|
|
63
|
+
return X
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
if __name__ == '__main__':
|
|
67
|
+
|
|
68
|
+
# lower and upper bounds
|
|
69
|
+
xl = np.zeros(2)
|
|
70
|
+
xu = np.ones(2)
|
|
71
|
+
|
|
72
|
+
# chosen parents
|
|
73
|
+
# p = np.array([0.1, 1.0])
|
|
74
|
+
p = np.array([0.5, 0.6])
|
|
75
|
+
|
|
76
|
+
c = np.array([-0.1, 1.0])
|
|
77
|
+
|
|
78
|
+
from pymoo.visualization.matplotlib import plt
|
|
79
|
+
|
|
80
|
+
plt.scatter(p[0], p[1], color="green", label="Parent")
|
|
81
|
+
plt.scatter(c[0], c[1], color="orange", label="Offspring")
|
|
82
|
+
|
|
83
|
+
data = []
|
|
84
|
+
for j in range(200):
|
|
85
|
+
ret = inverse_penality(c, p, xl, xu, alpha=None)
|
|
86
|
+
plt.scatter(ret[0], ret[1], facecolor="none", edgecolor="red", s=10, alpha=0.6)
|
|
87
|
+
|
|
88
|
+
plt.ylim(0.0, 1.3)
|
|
89
|
+
plt.xlim(-0.2, 1)
|
|
90
|
+
plt.legend()
|
|
91
|
+
plt.show()
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
from pymoo.core.repair import Repair
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class RoundingRepair(Repair):
|
|
7
|
+
|
|
8
|
+
def __init__(self, **kwargs) -> None:
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
Returns
|
|
12
|
+
-------
|
|
13
|
+
object
|
|
14
|
+
"""
|
|
15
|
+
super().__init__(**kwargs)
|
|
16
|
+
|
|
17
|
+
def _do(self, problem, X, **kwargs):
|
|
18
|
+
return np.around(X).astype(int)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
from pymoo.operators.repair.bounds_repair import BoundsRepair
|
|
4
|
+
from pymoo.util.misc import at_least_2d_array
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def set_to_bounds_if_outside(X, xl, xu):
|
|
8
|
+
_X, only_1d = at_least_2d_array(X, return_if_reshaped=True)
|
|
9
|
+
|
|
10
|
+
if xl is not None:
|
|
11
|
+
xl = np.repeat(xl[None, :], _X.shape[0], axis=0)
|
|
12
|
+
_X[_X < xl] = xl[_X < xl]
|
|
13
|
+
|
|
14
|
+
if xu is not None:
|
|
15
|
+
xu = np.repeat(xu[None, :], _X.shape[0], axis=0)
|
|
16
|
+
_X[_X > xu] = xu[_X > xu]
|
|
17
|
+
|
|
18
|
+
if only_1d:
|
|
19
|
+
return _X[0, :]
|
|
20
|
+
else:
|
|
21
|
+
return _X
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def set_to_bounds_if_outside_by_problem(problem, X):
|
|
25
|
+
return set_to_bounds_if_outside(X, problem.xl, problem.xu)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ToBoundOutOfBoundsRepair(BoundsRepair):
|
|
29
|
+
|
|
30
|
+
def repair_out_of_bounds(self, problem, X, **kwargs):
|
|
31
|
+
return set_to_bounds_if_outside_by_problem(problem, X)
|
|
File without changes
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
from pymoo.core.sampling import Sampling
|
|
4
|
+
from pymoo.util import default_random_state
|
|
5
|
+
from pymoo.util.misc import cdist
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def criterion_maxmin(X):
|
|
9
|
+
D = cdist(X, X)
|
|
10
|
+
np.fill_diagonal(D, np.inf)
|
|
11
|
+
return np.min(D)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def criterion_corr(X):
|
|
15
|
+
M = np.corrcoef(X.T, rowvar=True)
|
|
16
|
+
return -np.sum(np.tril(M, -1) ** 2)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@default_random_state
|
|
20
|
+
def sampling_lhs(n_samples, n_var, xl=0, xu=1, smooth=True, criterion=criterion_maxmin, n_iter=50, random_state=None):
|
|
21
|
+
|
|
22
|
+
X = sampling_lhs_unit(n_samples, n_var, smooth=smooth, random_state=random_state)
|
|
23
|
+
|
|
24
|
+
# if a criterion is selected to further improve the sampling
|
|
25
|
+
if criterion is not None:
|
|
26
|
+
|
|
27
|
+
# current best score is stored here
|
|
28
|
+
score = criterion(X)
|
|
29
|
+
|
|
30
|
+
for j in range(1, n_iter):
|
|
31
|
+
|
|
32
|
+
# create new random sample and check the score again
|
|
33
|
+
_X = sampling_lhs_unit(n_samples, n_var, smooth=smooth, random_state=random_state)
|
|
34
|
+
_score = criterion(_X)
|
|
35
|
+
|
|
36
|
+
if _score > score:
|
|
37
|
+
X, score = _X, _score
|
|
38
|
+
|
|
39
|
+
return xl + X * (xu - xl)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@default_random_state
|
|
43
|
+
def sampling_lhs_unit(n_samples, n_var, smooth=True, random_state=None):
|
|
44
|
+
X = random_state.random(size=(n_samples, n_var))
|
|
45
|
+
Xp = X.argsort(axis=0) + 1
|
|
46
|
+
|
|
47
|
+
if smooth:
|
|
48
|
+
Xp = Xp - random_state.random(Xp.shape)
|
|
49
|
+
else:
|
|
50
|
+
Xp = Xp - 0.5
|
|
51
|
+
Xp /= n_samples
|
|
52
|
+
return Xp
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class LatinHypercubeSampling(Sampling):
|
|
56
|
+
|
|
57
|
+
def __init__(self,
|
|
58
|
+
smooth=True,
|
|
59
|
+
iterations=20,
|
|
60
|
+
criterion=criterion_maxmin) -> None:
|
|
61
|
+
super().__init__()
|
|
62
|
+
self.smooth = smooth
|
|
63
|
+
self.iterations = iterations
|
|
64
|
+
self.criterion = criterion
|
|
65
|
+
|
|
66
|
+
def _do(self, problem, n_samples, random_state=None, **kwargs):
|
|
67
|
+
xl, xu = problem.bounds()
|
|
68
|
+
|
|
69
|
+
X = sampling_lhs(n_samples, problem.n_var, xl=xl, xu=xu, smooth=self.smooth,
|
|
70
|
+
criterion=self.criterion, n_iter=self.iterations, random_state=random_state)
|
|
71
|
+
|
|
72
|
+
return X
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class LHS(LatinHypercubeSampling):
|
|
76
|
+
pass
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
from pymoo.core.sampling import Sampling
|
|
4
|
+
from pymoo.util import default_random_state
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@default_random_state
|
|
8
|
+
def random(problem, n_samples=1, random_state=None):
|
|
9
|
+
X = random_state.random((n_samples, problem.n_var))
|
|
10
|
+
|
|
11
|
+
if problem.has_bounds():
|
|
12
|
+
xl, xu = problem.bounds()
|
|
13
|
+
assert np.all(xu >= xl)
|
|
14
|
+
X = xl + (xu - xl) * X
|
|
15
|
+
|
|
16
|
+
return X
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class FloatRandomSampling(Sampling):
|
|
20
|
+
|
|
21
|
+
def _do(self, problem, n_samples, *args, random_state=None, **kwargs):
|
|
22
|
+
X = random_state.random((n_samples, problem.n_var))
|
|
23
|
+
|
|
24
|
+
if problem.has_bounds():
|
|
25
|
+
xl, xu = problem.bounds()
|
|
26
|
+
assert np.all(xu >= xl)
|
|
27
|
+
X = xl + (xu - xl) * X
|
|
28
|
+
|
|
29
|
+
return X
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class BinaryRandomSampling(Sampling):
|
|
33
|
+
|
|
34
|
+
def _do(self, problem, n_samples, *args, random_state=None, **kwargs):
|
|
35
|
+
val = random_state.random((n_samples, problem.n_var))
|
|
36
|
+
return (val < 0.5).astype(bool)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class IntegerRandomSampling(FloatRandomSampling):
|
|
40
|
+
|
|
41
|
+
def _do(self, problem, n_samples, *args, random_state=None, **kwargs):
|
|
42
|
+
n, (xl, xu) = problem.n_var, problem.bounds()
|
|
43
|
+
return np.column_stack([random_state.integers(xl[k], xu[k] + 1, size=n_samples) for k in range(n)])
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class PermutationRandomSampling(Sampling):
|
|
47
|
+
|
|
48
|
+
def _do(self, problem, n_samples, *args, random_state=None, **kwargs):
|
|
49
|
+
X = np.full((n_samples, problem.n_var), 0, dtype=int)
|
|
50
|
+
for i in range(n_samples):
|
|
51
|
+
X[i, :] = random_state.permutation(problem.n_var)
|
|
52
|
+
return X
|
|
File without changes
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import math
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from pymoo.core.selection import Selection
|
|
6
|
+
from pymoo.util.misc import random_permutations
|
|
7
|
+
from pymoo.util import default_random_state
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RandomSelection(Selection):
|
|
11
|
+
|
|
12
|
+
def _do(self, _, pop, n_select, n_parents, *args, random_state=None, **kwargs):
|
|
13
|
+
# number of random individuals needed
|
|
14
|
+
n_random = n_select * n_parents
|
|
15
|
+
|
|
16
|
+
# number of permutations needed
|
|
17
|
+
n_perms = math.ceil(n_random / len(pop))
|
|
18
|
+
|
|
19
|
+
# get random permutations and reshape them
|
|
20
|
+
P = random_permutations(n_perms, len(pop), random_state=random_state)[:n_random]
|
|
21
|
+
|
|
22
|
+
return np.reshape(P, (n_select, n_parents))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@default_random_state
|
|
26
|
+
def fast_fill_random(X, N, columns=None, Xp=None, n_max_attempts=10, random_state=None):
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
Parameters
|
|
30
|
+
----------
|
|
31
|
+
X : np.ndarray
|
|
32
|
+
The actually array to fill with random values.
|
|
33
|
+
N : int
|
|
34
|
+
The upper limit for the values. The values will be in range (0, ..., N)
|
|
35
|
+
columns : list
|
|
36
|
+
The columns which should be filled randomly. Other columns indicate duplicates
|
|
37
|
+
Xp : np.ndarray
|
|
38
|
+
If some other duplicates shall be avoided by default
|
|
39
|
+
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
_, n_cols = X.shape
|
|
43
|
+
|
|
44
|
+
if columns is None:
|
|
45
|
+
columns = range(n_cols)
|
|
46
|
+
|
|
47
|
+
# all columns set so far to be checked for duplicates
|
|
48
|
+
J = []
|
|
49
|
+
|
|
50
|
+
# for each of the columns which should be set to be no duplicates
|
|
51
|
+
for col in columns:
|
|
52
|
+
|
|
53
|
+
D = X[:, J]
|
|
54
|
+
if Xp is not None:
|
|
55
|
+
D = np.column_stack([D, Xp])
|
|
56
|
+
|
|
57
|
+
# all the remaining indices that need to be filled with no duplicates
|
|
58
|
+
rem = np.arange(len(X))
|
|
59
|
+
|
|
60
|
+
for _ in range(n_max_attempts):
|
|
61
|
+
|
|
62
|
+
# random_state is guaranteed to be set by decorator
|
|
63
|
+
if len(rem) > N:
|
|
64
|
+
X[rem, col] = random_state.choice(N, replace=True, size=len(rem))
|
|
65
|
+
else:
|
|
66
|
+
X[rem, col] = random_state.permutation(N)[:len(rem)]
|
|
67
|
+
|
|
68
|
+
rem = np.where((X[rem, col][:, None] == D[rem]).any(axis=1))[0]
|
|
69
|
+
|
|
70
|
+
if len(rem) == 0:
|
|
71
|
+
break
|
|
72
|
+
|
|
73
|
+
J.append(col)
|
|
74
|
+
|
|
75
|
+
return X
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import math
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from pymoo.core.selection import Selection
|
|
6
|
+
from pymoo.util.misc import random_permutations
|
|
7
|
+
from pymoo.util import default_random_state
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TournamentSelection(Selection):
|
|
11
|
+
"""
|
|
12
|
+
The Tournament selection is used to simulate a tournament between individuals. The pressure balances
|
|
13
|
+
greedy the genetic algorithm will be.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def __init__(self, func_comp=None, pressure=2, **kwargs):
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
Parameters
|
|
20
|
+
----------
|
|
21
|
+
func_comp: func
|
|
22
|
+
The function to compare two individuals. It has the shape: comp(pop, indices) and returns the winner.
|
|
23
|
+
If the function is None it is assumed the population is sorted by a criterion and only indices are compared.
|
|
24
|
+
|
|
25
|
+
pressure: int
|
|
26
|
+
The selection pressure to be applied. Default it is a binary tournament.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
super().__init__(**kwargs)
|
|
30
|
+
|
|
31
|
+
# selection pressure to be applied
|
|
32
|
+
self.pressure = pressure
|
|
33
|
+
|
|
34
|
+
self.func_comp = func_comp
|
|
35
|
+
if self.func_comp is None:
|
|
36
|
+
raise Exception("Please provide the comparing function for the tournament selection!")
|
|
37
|
+
|
|
38
|
+
def _do(self, _, pop, n_select, n_parents=1, random_state=None, **kwargs):
|
|
39
|
+
# number of random individuals needed
|
|
40
|
+
n_random = n_select * n_parents * self.pressure
|
|
41
|
+
|
|
42
|
+
# number of permutations needed
|
|
43
|
+
n_perms = math.ceil(n_random / len(pop))
|
|
44
|
+
|
|
45
|
+
# get random permutations and reshape them
|
|
46
|
+
P = random_permutations(n_perms, len(pop), random_state=random_state)[:n_random]
|
|
47
|
+
P = np.reshape(P, (n_select * n_parents, self.pressure))
|
|
48
|
+
|
|
49
|
+
# compare using tournament function
|
|
50
|
+
S = self.func_comp(pop, P, random_state=random_state, **kwargs)
|
|
51
|
+
|
|
52
|
+
return np.reshape(S, (n_select, n_parents))
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@default_random_state
|
|
56
|
+
def compare(a, a_val, b, b_val, method, return_random_if_equal=False, random_state=None):
|
|
57
|
+
if method == 'larger_is_better':
|
|
58
|
+
if a_val > b_val:
|
|
59
|
+
return a
|
|
60
|
+
elif a_val < b_val:
|
|
61
|
+
return b
|
|
62
|
+
else:
|
|
63
|
+
if return_random_if_equal:
|
|
64
|
+
return random_state.choice([a, b])
|
|
65
|
+
else:
|
|
66
|
+
return None
|
|
67
|
+
elif method == 'smaller_is_better':
|
|
68
|
+
if a_val < b_val:
|
|
69
|
+
return a
|
|
70
|
+
elif a_val > b_val:
|
|
71
|
+
return b
|
|
72
|
+
else:
|
|
73
|
+
if return_random_if_equal:
|
|
74
|
+
return random_state.choice([a, b])
|
|
75
|
+
else:
|
|
76
|
+
return None
|
|
77
|
+
else:
|
|
78
|
+
raise Exception("Unknown method.")
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from pymoo.operators.survival.rank_and_crowding.classes import RankAndCrowding, ConstrRankAndCrowding
|