pymoo 0.6.1.5.dev0__cp310-cp310-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-310-darwin.so +0 -0
- pymoo/cython/calc_perpendicular_distance.pyx +67 -0
- pymoo/cython/decomposition.cpython-310-darwin.so +0 -0
- pymoo/cython/decomposition.pyx +165 -0
- pymoo/cython/hv.cpython-310-darwin.so +0 -0
- pymoo/cython/hv.pyx +18 -0
- pymoo/cython/info.cpython-310-darwin.so +0 -0
- pymoo/cython/info.pyx +5 -0
- pymoo/cython/mnn.cpython-310-darwin.so +0 -0
- pymoo/cython/mnn.pyx +273 -0
- pymoo/cython/non_dominated_sorting.cpython-310-darwin.so +0 -0
- pymoo/cython/non_dominated_sorting.pyx +645 -0
- pymoo/cython/pruning_cd.cpython-310-darwin.so +0 -0
- pymoo/cython/pruning_cd.pyx +197 -0
- pymoo/cython/stochastic_ranking.cpython-310-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
pymoo/__init__.py
ADDED
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from pymoo.core.algorithm import Algorithm
|
|
2
|
+
from pymoo.core.individual import Individual
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class BracketSearch(Algorithm):
|
|
6
|
+
|
|
7
|
+
def __init__(self, a=None, b=None, **kwargs):
|
|
8
|
+
super().__init__(**kwargs)
|
|
9
|
+
self.a, self.b = a, b
|
|
10
|
+
|
|
11
|
+
def _setup(self, problem, a=None, b=None, **kwargs):
|
|
12
|
+
msg = "Only problems with one variable, one objective and no constraints can be solved!"
|
|
13
|
+
assert problem.n_var == 1 and not problem.has_constraints() and problem.n_obj == 1, msg
|
|
14
|
+
self.a, self.b = a, b
|
|
15
|
+
|
|
16
|
+
def _initialize_infill(self):
|
|
17
|
+
|
|
18
|
+
# the boundaries of the problem for initialization
|
|
19
|
+
xl, xu = self.problem.bounds()
|
|
20
|
+
|
|
21
|
+
# take care of the lower bound - make sure it is an individual and make sure it is evaluated
|
|
22
|
+
if self.a is None:
|
|
23
|
+
assert xl is not None, "Either provide a left bound or set the xl attribute in the problem."
|
|
24
|
+
self.a = Individual(X=xl)
|
|
25
|
+
|
|
26
|
+
if self.a.F is None:
|
|
27
|
+
self.evaluator.eval(self.problem, self.a, algorithm=self)
|
|
28
|
+
|
|
29
|
+
# take care of the upper bound - make sure it is an individual and make sure it is evaluated
|
|
30
|
+
if self.b is None:
|
|
31
|
+
assert xl is not None, "Either provide a right bound or set the xu attribute in the problem."
|
|
32
|
+
self.b = Individual(X=xu)
|
|
33
|
+
|
|
34
|
+
if self.b.F is None:
|
|
35
|
+
self.evaluator.eval(self.problem, self.b, algorithm=self)
|
|
36
|
+
|
|
37
|
+
assert self.a.X[0] <= self.b.X[0], "The left bound must be smaller than the left bound!"
|
|
38
|
+
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
from pymoo.core.algorithm import Algorithm
|
|
2
|
+
from pymoo.core.duplicate import DefaultDuplicateElimination, NoDuplicateElimination
|
|
3
|
+
from pymoo.core.initialization import Initialization
|
|
4
|
+
from pymoo.core.mating import Mating
|
|
5
|
+
from pymoo.core.population import Population
|
|
6
|
+
from pymoo.core.repair import NoRepair
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class GeneticAlgorithm(Algorithm):
|
|
10
|
+
|
|
11
|
+
def __init__(self,
|
|
12
|
+
pop_size=None,
|
|
13
|
+
sampling=None,
|
|
14
|
+
selection=None,
|
|
15
|
+
crossover=None,
|
|
16
|
+
mutation=None,
|
|
17
|
+
survival=None,
|
|
18
|
+
n_offsprings=None,
|
|
19
|
+
eliminate_duplicates=DefaultDuplicateElimination(),
|
|
20
|
+
repair=None,
|
|
21
|
+
mating=None,
|
|
22
|
+
advance_after_initial_infill=False,
|
|
23
|
+
**kwargs
|
|
24
|
+
):
|
|
25
|
+
|
|
26
|
+
super().__init__(**kwargs)
|
|
27
|
+
|
|
28
|
+
# the population size used
|
|
29
|
+
self.pop_size = pop_size
|
|
30
|
+
|
|
31
|
+
# whether the algorithm should be advanced after initialization of not
|
|
32
|
+
self.advance_after_initial_infill = advance_after_initial_infill
|
|
33
|
+
|
|
34
|
+
# the survival for the genetic algorithm
|
|
35
|
+
self.survival = survival
|
|
36
|
+
|
|
37
|
+
# number of offsprings to generate through recombination
|
|
38
|
+
self.n_offsprings = n_offsprings
|
|
39
|
+
|
|
40
|
+
# if the number of offspring is not set - equal to population size
|
|
41
|
+
if self.n_offsprings is None:
|
|
42
|
+
self.n_offsprings = pop_size
|
|
43
|
+
|
|
44
|
+
# set the duplicate detection class - a boolean value chooses the default duplicate detection
|
|
45
|
+
if isinstance(eliminate_duplicates, bool):
|
|
46
|
+
if eliminate_duplicates:
|
|
47
|
+
self.eliminate_duplicates = DefaultDuplicateElimination()
|
|
48
|
+
else:
|
|
49
|
+
self.eliminate_duplicates = NoDuplicateElimination()
|
|
50
|
+
else:
|
|
51
|
+
self.eliminate_duplicates = eliminate_duplicates
|
|
52
|
+
|
|
53
|
+
# simply set the no repair object if it is None
|
|
54
|
+
self.repair = repair if repair is not None else NoRepair()
|
|
55
|
+
|
|
56
|
+
self.initialization = Initialization(sampling,
|
|
57
|
+
repair=self.repair,
|
|
58
|
+
eliminate_duplicates=self.eliminate_duplicates)
|
|
59
|
+
|
|
60
|
+
if mating is None:
|
|
61
|
+
mating = Mating(selection,
|
|
62
|
+
crossover,
|
|
63
|
+
mutation,
|
|
64
|
+
repair=self.repair,
|
|
65
|
+
eliminate_duplicates=self.eliminate_duplicates,
|
|
66
|
+
n_max_iterations=100)
|
|
67
|
+
self.mating = mating
|
|
68
|
+
|
|
69
|
+
# other run specific data updated whenever solve is called - to share them in all algorithms
|
|
70
|
+
self.n_gen = None
|
|
71
|
+
self.pop = None
|
|
72
|
+
self.off = None
|
|
73
|
+
|
|
74
|
+
def _initialize_infill(self):
|
|
75
|
+
pop = self.initialization.do(self.problem, self.pop_size, algorithm=self)
|
|
76
|
+
return pop
|
|
77
|
+
|
|
78
|
+
def _initialize_advance(self, infills=None, **kwargs):
|
|
79
|
+
if self.advance_after_initial_infill:
|
|
80
|
+
self.pop = self.survival.do(self.problem, infills, n_survive=len(infills), algorithm=self, **kwargs)
|
|
81
|
+
|
|
82
|
+
def _infill(self):
|
|
83
|
+
|
|
84
|
+
# do the mating using the current population
|
|
85
|
+
off = self.mating.do(self.problem, self.pop, self.n_offsprings, algorithm=self)
|
|
86
|
+
|
|
87
|
+
# if the mating could not generate any new offspring (duplicate elimination might make that happen)
|
|
88
|
+
if len(off) == 0:
|
|
89
|
+
self.termination.force_termination = True
|
|
90
|
+
return
|
|
91
|
+
|
|
92
|
+
# if not the desired number of offspring could be created
|
|
93
|
+
elif len(off) < self.n_offsprings:
|
|
94
|
+
if self.verbose:
|
|
95
|
+
print("WARNING: Mating could not produce the required number of (unique) offsprings!")
|
|
96
|
+
|
|
97
|
+
return off
|
|
98
|
+
|
|
99
|
+
def _advance(self, infills=None, **kwargs):
|
|
100
|
+
|
|
101
|
+
# the current population
|
|
102
|
+
pop = self.pop
|
|
103
|
+
|
|
104
|
+
# merge the offsprings with the current population
|
|
105
|
+
if infills is not None:
|
|
106
|
+
pop = Population.merge(self.pop, infills)
|
|
107
|
+
|
|
108
|
+
# execute the survival to find the fittest solutions
|
|
109
|
+
self.pop = self.survival.do(self.problem, pop, n_survive=self.pop_size, algorithm=self, **kwargs)
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
from pymoo.core.algorithm import Algorithm
|
|
4
|
+
from pymoo.core.individual import Individual
|
|
5
|
+
from pymoo.core.meta import Meta
|
|
6
|
+
from pymoo.core.problem import Problem
|
|
7
|
+
from pymoo.operators.repair.to_bound import set_to_bounds_if_outside
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class LineSearch(Algorithm):
|
|
11
|
+
|
|
12
|
+
def __init__(self, **kwargs):
|
|
13
|
+
super().__init__(**kwargs)
|
|
14
|
+
self.point, self.direction = None, None
|
|
15
|
+
|
|
16
|
+
def setup(self, problem, point=None, direction=None, **kwargs):
|
|
17
|
+
super().setup(problem, **kwargs)
|
|
18
|
+
|
|
19
|
+
msg = "Only problems with one objective and no constraints can be solved using a line search!"
|
|
20
|
+
assert not problem.has_constraints() and problem.n_obj == 1, msg
|
|
21
|
+
|
|
22
|
+
assert point is not None, "You have to define a starting point for the algorithm"
|
|
23
|
+
self.point = point
|
|
24
|
+
|
|
25
|
+
assert direction is not None, "You have to define a direction point for the algorithm"
|
|
26
|
+
self.direction = direction
|
|
27
|
+
|
|
28
|
+
return self
|
|
29
|
+
|
|
30
|
+
def _initialize_infill(self):
|
|
31
|
+
|
|
32
|
+
# x could be a vector or an individual
|
|
33
|
+
if isinstance(self.point, np.ndarray):
|
|
34
|
+
self.point = Individual(X=self.point)
|
|
35
|
+
|
|
36
|
+
# make sure it is evaluated - if not yet also get the gradient
|
|
37
|
+
if self.point.get("F") is None:
|
|
38
|
+
self.evaluator.eval(self.problem, self.point, algorithm=self)
|
|
39
|
+
|
|
40
|
+
self.infill = self.point
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class LineSearchProblem(Meta, Problem):
|
|
44
|
+
|
|
45
|
+
def __init__(self, problem, point, direction, strict_bounds=True, xl=0.0, xu=np.inf):
|
|
46
|
+
super().__init__(problem)
|
|
47
|
+
self.n_var = 1
|
|
48
|
+
self.xl, self.xu = np.array([xl]), np.array([xu])
|
|
49
|
+
|
|
50
|
+
self.point = point
|
|
51
|
+
self.direction = direction
|
|
52
|
+
self.strict_bounds = strict_bounds
|
|
53
|
+
|
|
54
|
+
def _evaluate(self, alpha, out, *args, **kwargs):
|
|
55
|
+
out["alpha"] = alpha
|
|
56
|
+
|
|
57
|
+
x = self.point.X + alpha * self.direction
|
|
58
|
+
if self.strict_bounds:
|
|
59
|
+
x = set_to_bounds_if_outside(x, self.xl, self.xu)
|
|
60
|
+
out["__X__"] = x
|
|
61
|
+
|
|
62
|
+
super()._evaluate(x, out, *args, **kwargs)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from pymoo.algorithms.soo.nonconvex.ga import FitnessSurvival
|
|
2
|
+
from pymoo.core.algorithm import Algorithm, LoopwiseAlgorithm
|
|
3
|
+
from pymoo.core.initialization import Initialization
|
|
4
|
+
from pymoo.operators.sampling.lhs import LatinHypercubeSampling
|
|
5
|
+
from pymoo.termination.ftol import SingleObjectiveSpaceTermination
|
|
6
|
+
from pymoo.termination.robust import RobustTermination
|
|
7
|
+
from pymoo.util.display.single import SingleObjectiveOutput
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class LocalSearch(LoopwiseAlgorithm, Algorithm):
|
|
11
|
+
|
|
12
|
+
def __init__(self,
|
|
13
|
+
initial=None,
|
|
14
|
+
sampling=LatinHypercubeSampling(),
|
|
15
|
+
output=SingleObjectiveOutput(),
|
|
16
|
+
n_sample_points=20,
|
|
17
|
+
**kwargs):
|
|
18
|
+
super().__init__(output=output, **kwargs)
|
|
19
|
+
|
|
20
|
+
# the default termination if not specified otherwise
|
|
21
|
+
self.termination = RobustTermination(SingleObjectiveSpaceTermination(tol=1e-8), period=10)
|
|
22
|
+
|
|
23
|
+
# the type of initial sampling
|
|
24
|
+
initial = initial if "x0" not in kwargs else kwargs["x0"]
|
|
25
|
+
if initial is not None:
|
|
26
|
+
sampling = initial
|
|
27
|
+
|
|
28
|
+
self.initialization = Initialization(sampling)
|
|
29
|
+
|
|
30
|
+
# the number of sampling points to determine x0
|
|
31
|
+
self.n_sample_points = n_sample_points
|
|
32
|
+
|
|
33
|
+
def _initialize_infill(self):
|
|
34
|
+
return self.initialization.do(self.problem, self.n_sample_points, algorithm=self)
|
|
35
|
+
|
|
36
|
+
def _initialize_advance(self, infills=None, **kwargs):
|
|
37
|
+
self.x0 = FitnessSurvival().do(self.problem, infills, n_survive=1, algorithm=self)[0]
|
|
38
|
+
|
|
39
|
+
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
from copy import deepcopy
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
from pymoo.core.algorithm import Algorithm
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class MetaAlgorithm:
|
|
8
|
+
|
|
9
|
+
def __new__(cls, algorithm) -> Any:
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
return algorithm
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def __init__(self, algorithm) -> None:
|
|
18
|
+
super().__init__()
|
|
19
|
+
self.algorithm = algorithm
|
|
20
|
+
|
|
21
|
+
def __getattr__(self, attr):
|
|
22
|
+
print(attr)
|
|
23
|
+
if attr in self.__dict__:
|
|
24
|
+
return getattr(self, attr)
|
|
25
|
+
return getattr(self.__dict__["algorithm"], attr)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class MetaAlgorithm2(Algorithm):
|
|
29
|
+
|
|
30
|
+
def __init__(self,
|
|
31
|
+
algorithm,
|
|
32
|
+
copy=False,
|
|
33
|
+
):
|
|
34
|
+
super().__init__()
|
|
35
|
+
|
|
36
|
+
# if the algorithm object should be copied to keep the original one unmodified
|
|
37
|
+
if copy:
|
|
38
|
+
algorithm = deepcopy(algorithm)
|
|
39
|
+
|
|
40
|
+
self.algorithm = algorithm
|
|
41
|
+
|
|
42
|
+
def _copy_from_orig(self):
|
|
43
|
+
for k, v in self.algorithm.__dict__.items():
|
|
44
|
+
if k not in ["opt", "display"]:
|
|
45
|
+
self.__dict__[k] = v
|
|
46
|
+
|
|
47
|
+
def setup(self, *args, **kwargs):
|
|
48
|
+
self.algorithm.setup(*args, **kwargs)
|
|
49
|
+
self._copy_from_orig()
|
|
50
|
+
|
|
51
|
+
self.display = self.algorithm.display
|
|
52
|
+
self.algorithm.display = None
|
|
53
|
+
|
|
54
|
+
self._setup(*args, **kwargs)
|
|
55
|
+
|
|
56
|
+
return self
|
|
57
|
+
|
|
58
|
+
def _infill(self):
|
|
59
|
+
ret = self.algorithm.infill()
|
|
60
|
+
self._copy_from_orig()
|
|
61
|
+
return ret
|
|
62
|
+
|
|
63
|
+
def _initialize_infill(self):
|
|
64
|
+
return self._infill()
|
|
65
|
+
|
|
66
|
+
def _initialize_advance(self, infills=None, **kwargs):
|
|
67
|
+
self.algorithm.advance(infills=infills, **kwargs)
|
|
68
|
+
self._copy_from_orig()
|
|
69
|
+
|
|
70
|
+
def _advance(self, infills=None, **kwargs):
|
|
71
|
+
self.algorithm.advance(infills=infills, **kwargs)
|
|
72
|
+
self._copy_from_orig()
|
|
73
|
+
|
|
74
|
+
def advance(self, infills=None, **kwargs):
|
|
75
|
+
super().advance(infills, **kwargs)
|
|
76
|
+
self._copy_from_orig()
|
|
77
|
+
|
|
78
|
+
def _set_optimum(self):
|
|
79
|
+
self.opt = self.algorithm.opt
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
from copy import deepcopy
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from pymoo.core.parameters import get_params, flatten, set_params, hierarchical
|
|
6
|
+
from pymoo.core.problem import ElementwiseProblem
|
|
7
|
+
from pymoo.optimize import minimize
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def create(algorithm, params):
|
|
11
|
+
algorithm = deepcopy(algorithm)
|
|
12
|
+
set_params(algorithm, hierarchical(params))
|
|
13
|
+
return algorithm
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class HyperparameterProblem(ElementwiseProblem):
|
|
17
|
+
|
|
18
|
+
def __init__(self, algorithm, performance, func_create=create, vars=None, **kwargs):
|
|
19
|
+
|
|
20
|
+
# get the parameters from the algorithm object
|
|
21
|
+
if vars is None:
|
|
22
|
+
vars = get_params(algorithm)
|
|
23
|
+
|
|
24
|
+
if isinstance(vars, dict):
|
|
25
|
+
vars = flatten(vars)
|
|
26
|
+
|
|
27
|
+
assert len(vars) > 0, "No hyper-parameters found to optimize."
|
|
28
|
+
|
|
29
|
+
super().__init__(vars=vars, **kwargs)
|
|
30
|
+
|
|
31
|
+
self.algorithm = algorithm
|
|
32
|
+
self.performance = performance
|
|
33
|
+
self.func_create = func_create
|
|
34
|
+
|
|
35
|
+
def _evaluate(self, x, out, *args, **kwargs):
|
|
36
|
+
algorithm = self.func_create(self.algorithm, x)
|
|
37
|
+
v = self.performance(algorithm)
|
|
38
|
+
out.update(v)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class SingleObjectiveSingleRun:
|
|
42
|
+
|
|
43
|
+
def __init__(self, problem, **kwargs):
|
|
44
|
+
super().__init__()
|
|
45
|
+
self.problem = problem
|
|
46
|
+
self.kwargs = kwargs
|
|
47
|
+
|
|
48
|
+
def __call__(self, algorithm):
|
|
49
|
+
ret = minimize(self.problem, algorithm, **self.kwargs)
|
|
50
|
+
return dict(F=ret.F, G=ret.G, H=ret.H)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def stats_single_objective_mean(rets):
|
|
54
|
+
F, G, H = [], [], []
|
|
55
|
+
for ret in rets:
|
|
56
|
+
F.append(ret.F)
|
|
57
|
+
G.append(ret.G)
|
|
58
|
+
H.append(ret.H)
|
|
59
|
+
|
|
60
|
+
F, G, H = np.array(F), np.array(G), np.array(H)
|
|
61
|
+
|
|
62
|
+
return dict(F=F.mean(axis=0), G=G.mean(axis=0), H=H.mean(axis=0))
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def stats_avg_nevals(rets):
|
|
66
|
+
return dict(F=np.array([ret.algorithm.evaluator.n_eval for ret in rets]).mean())
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class MultiRun:
|
|
70
|
+
|
|
71
|
+
def __init__(self, problem, n_runs=None, seeds=None, func_stats=stats_single_objective_mean, **kwargs):
|
|
72
|
+
super().__init__()
|
|
73
|
+
self.problem = problem
|
|
74
|
+
self.kwargs = kwargs
|
|
75
|
+
|
|
76
|
+
if seeds is None:
|
|
77
|
+
if n_runs is None:
|
|
78
|
+
raise Exception("Either provide number of runs or seeds directly.")
|
|
79
|
+
|
|
80
|
+
seeds = np.random.randint(1, 1000000, size=n_runs)
|
|
81
|
+
|
|
82
|
+
self.seeds = seeds
|
|
83
|
+
self.func_stats = func_stats
|
|
84
|
+
|
|
85
|
+
def __call__(self, algorithm):
|
|
86
|
+
rets = [minimize(self.problem, algorithm, seed=seed, **self.kwargs) for seed in self.seeds]
|
|
87
|
+
out = self.func_stats(rets)
|
|
88
|
+
out["__results__"] = rets
|
|
89
|
+
return out
|
|
File without changes
|