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.

Files changed (330) hide show
  1. pymoo/__init__.py +3 -0
  2. pymoo/algorithms/__init__.py +0 -0
  3. pymoo/algorithms/base/__init__.py +0 -0
  4. pymoo/algorithms/base/bracket.py +38 -0
  5. pymoo/algorithms/base/genetic.py +109 -0
  6. pymoo/algorithms/base/line.py +62 -0
  7. pymoo/algorithms/base/local.py +39 -0
  8. pymoo/algorithms/base/meta.py +79 -0
  9. pymoo/algorithms/hyperparameters.py +89 -0
  10. pymoo/algorithms/moo/__init__.py +0 -0
  11. pymoo/algorithms/moo/age.py +310 -0
  12. pymoo/algorithms/moo/age2.py +194 -0
  13. pymoo/algorithms/moo/ctaea.py +298 -0
  14. pymoo/algorithms/moo/dnsga2.py +76 -0
  15. pymoo/algorithms/moo/kgb.py +446 -0
  16. pymoo/algorithms/moo/moead.py +183 -0
  17. pymoo/algorithms/moo/nsga2.py +113 -0
  18. pymoo/algorithms/moo/nsga3.py +358 -0
  19. pymoo/algorithms/moo/pinsga2.py +370 -0
  20. pymoo/algorithms/moo/rnsga2.py +188 -0
  21. pymoo/algorithms/moo/rnsga3.py +246 -0
  22. pymoo/algorithms/moo/rvea.py +214 -0
  23. pymoo/algorithms/moo/sms.py +195 -0
  24. pymoo/algorithms/moo/spea2.py +190 -0
  25. pymoo/algorithms/moo/unsga3.py +47 -0
  26. pymoo/algorithms/soo/__init__.py +0 -0
  27. pymoo/algorithms/soo/convex/__init__.py +0 -0
  28. pymoo/algorithms/soo/nonconvex/__init__.py +0 -0
  29. pymoo/algorithms/soo/nonconvex/brkga.py +161 -0
  30. pymoo/algorithms/soo/nonconvex/cmaes.py +554 -0
  31. pymoo/algorithms/soo/nonconvex/de.py +279 -0
  32. pymoo/algorithms/soo/nonconvex/direct.py +149 -0
  33. pymoo/algorithms/soo/nonconvex/es.py +203 -0
  34. pymoo/algorithms/soo/nonconvex/g3pcx.py +94 -0
  35. pymoo/algorithms/soo/nonconvex/ga.py +93 -0
  36. pymoo/algorithms/soo/nonconvex/ga_niching.py +223 -0
  37. pymoo/algorithms/soo/nonconvex/isres.py +74 -0
  38. pymoo/algorithms/soo/nonconvex/nelder.py +251 -0
  39. pymoo/algorithms/soo/nonconvex/optuna.py +80 -0
  40. pymoo/algorithms/soo/nonconvex/pattern.py +183 -0
  41. pymoo/algorithms/soo/nonconvex/pso.py +399 -0
  42. pymoo/algorithms/soo/nonconvex/pso_ep.py +297 -0
  43. pymoo/algorithms/soo/nonconvex/random_search.py +25 -0
  44. pymoo/algorithms/soo/nonconvex/sres.py +56 -0
  45. pymoo/algorithms/soo/univariate/__init__.py +0 -0
  46. pymoo/algorithms/soo/univariate/backtracking.py +59 -0
  47. pymoo/algorithms/soo/univariate/exp.py +46 -0
  48. pymoo/algorithms/soo/univariate/golden.py +65 -0
  49. pymoo/algorithms/soo/univariate/quadr_interp.py +81 -0
  50. pymoo/algorithms/soo/univariate/wolfe.py +163 -0
  51. pymoo/config.py +33 -0
  52. pymoo/constraints/__init__.py +3 -0
  53. pymoo/constraints/adaptive.py +62 -0
  54. pymoo/constraints/as_obj.py +56 -0
  55. pymoo/constraints/as_penalty.py +41 -0
  56. pymoo/constraints/eps.py +26 -0
  57. pymoo/constraints/from_bounds.py +36 -0
  58. pymoo/core/__init__.py +0 -0
  59. pymoo/core/algorithm.py +394 -0
  60. pymoo/core/callback.py +38 -0
  61. pymoo/core/crossover.py +77 -0
  62. pymoo/core/decision_making.py +102 -0
  63. pymoo/core/decomposition.py +76 -0
  64. pymoo/core/duplicate.py +163 -0
  65. pymoo/core/evaluator.py +116 -0
  66. pymoo/core/indicator.py +34 -0
  67. pymoo/core/individual.py +784 -0
  68. pymoo/core/infill.py +64 -0
  69. pymoo/core/initialization.py +42 -0
  70. pymoo/core/mating.py +39 -0
  71. pymoo/core/meta.py +21 -0
  72. pymoo/core/mixed.py +165 -0
  73. pymoo/core/mutation.py +44 -0
  74. pymoo/core/operator.py +40 -0
  75. pymoo/core/parameters.py +134 -0
  76. pymoo/core/plot.py +210 -0
  77. pymoo/core/population.py +180 -0
  78. pymoo/core/problem.py +460 -0
  79. pymoo/core/recorder.py +99 -0
  80. pymoo/core/repair.py +23 -0
  81. pymoo/core/replacement.py +96 -0
  82. pymoo/core/result.py +52 -0
  83. pymoo/core/sampling.py +43 -0
  84. pymoo/core/selection.py +61 -0
  85. pymoo/core/solution.py +10 -0
  86. pymoo/core/survival.py +103 -0
  87. pymoo/core/termination.py +70 -0
  88. pymoo/core/variable.py +399 -0
  89. pymoo/cython/__init__.py +0 -0
  90. pymoo/cython/calc_perpendicular_distance.cpython-39-x86_64-linux-gnu.so +0 -0
  91. pymoo/cython/calc_perpendicular_distance.pyx +67 -0
  92. pymoo/cython/decomposition.cpython-39-x86_64-linux-gnu.so +0 -0
  93. pymoo/cython/decomposition.pyx +165 -0
  94. pymoo/cython/hv.cpython-39-x86_64-linux-gnu.so +0 -0
  95. pymoo/cython/hv.pyx +18 -0
  96. pymoo/cython/info.cpython-39-x86_64-linux-gnu.so +0 -0
  97. pymoo/cython/info.pyx +5 -0
  98. pymoo/cython/mnn.cpython-39-x86_64-linux-gnu.so +0 -0
  99. pymoo/cython/mnn.pyx +273 -0
  100. pymoo/cython/non_dominated_sorting.cpython-39-x86_64-linux-gnu.so +0 -0
  101. pymoo/cython/non_dominated_sorting.pyx +645 -0
  102. pymoo/cython/pruning_cd.cpython-39-x86_64-linux-gnu.so +0 -0
  103. pymoo/cython/pruning_cd.pyx +197 -0
  104. pymoo/cython/stochastic_ranking.cpython-39-x86_64-linux-gnu.so +0 -0
  105. pymoo/cython/stochastic_ranking.pyx +49 -0
  106. pymoo/cython/utils.pxd +129 -0
  107. pymoo/cython/vendor/__init__.py +0 -0
  108. pymoo/cython/vendor/hypervolume.cpp +1621 -0
  109. pymoo/cython/vendor/hypervolume.h +63 -0
  110. pymoo/decomposition/__init__.py +0 -0
  111. pymoo/decomposition/aasf.py +24 -0
  112. pymoo/decomposition/asf.py +10 -0
  113. pymoo/decomposition/pbi.py +13 -0
  114. pymoo/decomposition/perp_dist.py +13 -0
  115. pymoo/decomposition/tchebicheff.py +11 -0
  116. pymoo/decomposition/util.py +13 -0
  117. pymoo/decomposition/weighted_sum.py +8 -0
  118. pymoo/docs.py +187 -0
  119. pymoo/experimental/__init__.py +0 -0
  120. pymoo/experimental/algorithms/__init__.py +0 -0
  121. pymoo/experimental/algorithms/gde3.py +57 -0
  122. pymoo/gradient/__init__.py +21 -0
  123. pymoo/gradient/automatic.py +57 -0
  124. pymoo/gradient/grad_autograd.py +105 -0
  125. pymoo/gradient/grad_complex.py +35 -0
  126. pymoo/gradient/grad_jax.py +51 -0
  127. pymoo/gradient/toolbox/__init__.py +6 -0
  128. pymoo/indicators/__init__.py +0 -0
  129. pymoo/indicators/distance_indicator.py +55 -0
  130. pymoo/indicators/gd.py +7 -0
  131. pymoo/indicators/gd_plus.py +7 -0
  132. pymoo/indicators/hv/__init__.py +63 -0
  133. pymoo/indicators/hv/exact.py +71 -0
  134. pymoo/indicators/hv/exact_2d.py +102 -0
  135. pymoo/indicators/hv/monte_carlo.py +74 -0
  136. pymoo/indicators/igd.py +7 -0
  137. pymoo/indicators/igd_plus.py +7 -0
  138. pymoo/indicators/kktpm.py +151 -0
  139. pymoo/indicators/migd.py +55 -0
  140. pymoo/indicators/rmetric.py +203 -0
  141. pymoo/indicators/spacing.py +52 -0
  142. pymoo/mcdm/__init__.py +0 -0
  143. pymoo/mcdm/compromise_programming.py +19 -0
  144. pymoo/mcdm/high_tradeoff.py +40 -0
  145. pymoo/mcdm/pseudo_weights.py +32 -0
  146. pymoo/operators/__init__.py +0 -0
  147. pymoo/operators/control.py +187 -0
  148. pymoo/operators/crossover/__init__.py +0 -0
  149. pymoo/operators/crossover/binx.py +45 -0
  150. pymoo/operators/crossover/dex.py +122 -0
  151. pymoo/operators/crossover/erx.py +162 -0
  152. pymoo/operators/crossover/expx.py +51 -0
  153. pymoo/operators/crossover/hux.py +37 -0
  154. pymoo/operators/crossover/nox.py +13 -0
  155. pymoo/operators/crossover/ox.py +84 -0
  156. pymoo/operators/crossover/pcx.py +82 -0
  157. pymoo/operators/crossover/pntx.py +49 -0
  158. pymoo/operators/crossover/sbx.py +125 -0
  159. pymoo/operators/crossover/spx.py +5 -0
  160. pymoo/operators/crossover/ux.py +20 -0
  161. pymoo/operators/mutation/__init__.py +0 -0
  162. pymoo/operators/mutation/bitflip.py +17 -0
  163. pymoo/operators/mutation/gauss.py +58 -0
  164. pymoo/operators/mutation/inversion.py +42 -0
  165. pymoo/operators/mutation/nom.py +7 -0
  166. pymoo/operators/mutation/pm.py +94 -0
  167. pymoo/operators/mutation/rm.py +23 -0
  168. pymoo/operators/repair/__init__.py +0 -0
  169. pymoo/operators/repair/bounce_back.py +32 -0
  170. pymoo/operators/repair/bounds_repair.py +95 -0
  171. pymoo/operators/repair/inverse_penalty.py +89 -0
  172. pymoo/operators/repair/rounding.py +18 -0
  173. pymoo/operators/repair/to_bound.py +31 -0
  174. pymoo/operators/repair/vtype.py +11 -0
  175. pymoo/operators/sampling/__init__.py +0 -0
  176. pymoo/operators/sampling/lhs.py +73 -0
  177. pymoo/operators/sampling/rnd.py +50 -0
  178. pymoo/operators/selection/__init__.py +0 -0
  179. pymoo/operators/selection/rnd.py +72 -0
  180. pymoo/operators/selection/tournament.py +76 -0
  181. pymoo/operators/survival/__init__.py +0 -0
  182. pymoo/operators/survival/rank_and_crowding/__init__.py +1 -0
  183. pymoo/operators/survival/rank_and_crowding/classes.py +209 -0
  184. pymoo/operators/survival/rank_and_crowding/metrics.py +208 -0
  185. pymoo/optimize.py +72 -0
  186. pymoo/problems/__init__.py +157 -0
  187. pymoo/problems/dyn.py +47 -0
  188. pymoo/problems/dynamic/__init__.py +0 -0
  189. pymoo/problems/dynamic/cec2015.py +108 -0
  190. pymoo/problems/dynamic/df.py +452 -0
  191. pymoo/problems/dynamic/misc.py +167 -0
  192. pymoo/problems/functional.py +48 -0
  193. pymoo/problems/many/__init__.py +5 -0
  194. pymoo/problems/many/cdtlz.py +159 -0
  195. pymoo/problems/many/dcdtlz.py +88 -0
  196. pymoo/problems/many/dtlz.py +264 -0
  197. pymoo/problems/many/wfg.py +550 -0
  198. pymoo/problems/multi/__init__.py +14 -0
  199. pymoo/problems/multi/bnh.py +34 -0
  200. pymoo/problems/multi/carside.py +48 -0
  201. pymoo/problems/multi/clutch.py +104 -0
  202. pymoo/problems/multi/csi.py +55 -0
  203. pymoo/problems/multi/ctp.py +198 -0
  204. pymoo/problems/multi/dascmop.py +213 -0
  205. pymoo/problems/multi/kursawe.py +25 -0
  206. pymoo/problems/multi/modact.py +68 -0
  207. pymoo/problems/multi/mw.py +400 -0
  208. pymoo/problems/multi/omnitest.py +48 -0
  209. pymoo/problems/multi/osy.py +32 -0
  210. pymoo/problems/multi/srn.py +28 -0
  211. pymoo/problems/multi/sympart.py +94 -0
  212. pymoo/problems/multi/tnk.py +24 -0
  213. pymoo/problems/multi/truss2d.py +83 -0
  214. pymoo/problems/multi/welded_beam.py +41 -0
  215. pymoo/problems/multi/wrm.py +36 -0
  216. pymoo/problems/multi/zdt.py +151 -0
  217. pymoo/problems/multi_to_single.py +22 -0
  218. pymoo/problems/single/__init__.py +12 -0
  219. pymoo/problems/single/ackley.py +24 -0
  220. pymoo/problems/single/cantilevered_beam.py +34 -0
  221. pymoo/problems/single/flowshop_scheduling.py +112 -0
  222. pymoo/problems/single/g.py +874 -0
  223. pymoo/problems/single/griewank.py +18 -0
  224. pymoo/problems/single/himmelblau.py +15 -0
  225. pymoo/problems/single/knapsack.py +48 -0
  226. pymoo/problems/single/mopta08.py +26 -0
  227. pymoo/problems/single/multimodal.py +20 -0
  228. pymoo/problems/single/pressure_vessel.py +30 -0
  229. pymoo/problems/single/rastrigin.py +20 -0
  230. pymoo/problems/single/rosenbrock.py +22 -0
  231. pymoo/problems/single/schwefel.py +18 -0
  232. pymoo/problems/single/simple.py +13 -0
  233. pymoo/problems/single/sphere.py +19 -0
  234. pymoo/problems/single/traveling_salesman.py +79 -0
  235. pymoo/problems/single/zakharov.py +19 -0
  236. pymoo/problems/static.py +14 -0
  237. pymoo/problems/util.py +42 -0
  238. pymoo/problems/zero_to_one.py +27 -0
  239. pymoo/termination/__init__.py +23 -0
  240. pymoo/termination/collection.py +12 -0
  241. pymoo/termination/cv.py +48 -0
  242. pymoo/termination/default.py +45 -0
  243. pymoo/termination/delta.py +64 -0
  244. pymoo/termination/fmin.py +16 -0
  245. pymoo/termination/ftol.py +144 -0
  246. pymoo/termination/indicator.py +49 -0
  247. pymoo/termination/max_eval.py +14 -0
  248. pymoo/termination/max_gen.py +15 -0
  249. pymoo/termination/max_time.py +20 -0
  250. pymoo/termination/robust.py +34 -0
  251. pymoo/termination/xtol.py +33 -0
  252. pymoo/util/__init__.py +0 -0
  253. pymoo/util/archive.py +150 -0
  254. pymoo/util/cache.py +29 -0
  255. pymoo/util/clearing.py +82 -0
  256. pymoo/util/display/__init__.py +0 -0
  257. pymoo/util/display/column.py +52 -0
  258. pymoo/util/display/display.py +34 -0
  259. pymoo/util/display/multi.py +96 -0
  260. pymoo/util/display/output.py +53 -0
  261. pymoo/util/display/progress.py +54 -0
  262. pymoo/util/display/single.py +67 -0
  263. pymoo/util/dominator.py +67 -0
  264. pymoo/util/function_loader.py +129 -0
  265. pymoo/util/hv.py +23 -0
  266. pymoo/util/matlab_engine.py +39 -0
  267. pymoo/util/misc.py +460 -0
  268. pymoo/util/mnn.py +70 -0
  269. pymoo/util/nds/__init__.py +0 -0
  270. pymoo/util/nds/dominance_degree_non_dominated_sort.py +159 -0
  271. pymoo/util/nds/efficient_non_dominated_sort.py +152 -0
  272. pymoo/util/nds/fast_non_dominated_sort.py +70 -0
  273. pymoo/util/nds/naive_non_dominated_sort.py +36 -0
  274. pymoo/util/nds/non_dominated_sorting.py +67 -0
  275. pymoo/util/nds/tree_based_non_dominated_sort.py +133 -0
  276. pymoo/util/normalization.py +312 -0
  277. pymoo/util/optimum.py +42 -0
  278. pymoo/util/plotting.py +177 -0
  279. pymoo/util/pruning_cd.py +89 -0
  280. pymoo/util/randomized_argsort.py +60 -0
  281. pymoo/util/ref_dirs/__init__.py +24 -0
  282. pymoo/util/ref_dirs/construction.py +88 -0
  283. pymoo/util/ref_dirs/das_dennis.py +52 -0
  284. pymoo/util/ref_dirs/energy.py +319 -0
  285. pymoo/util/ref_dirs/energy_layer.py +119 -0
  286. pymoo/util/ref_dirs/genetic_algorithm.py +63 -0
  287. pymoo/util/ref_dirs/incremental.py +68 -0
  288. pymoo/util/ref_dirs/misc.py +128 -0
  289. pymoo/util/ref_dirs/optimizer.py +59 -0
  290. pymoo/util/ref_dirs/performance.py +162 -0
  291. pymoo/util/ref_dirs/reduction.py +85 -0
  292. pymoo/util/ref_dirs/sample_and_map.py +24 -0
  293. pymoo/util/reference_direction.py +260 -0
  294. pymoo/util/remote.py +55 -0
  295. pymoo/util/roulette.py +27 -0
  296. pymoo/util/running_metric.py +128 -0
  297. pymoo/util/sliding_window.py +25 -0
  298. pymoo/util/stochastic_ranking.py +32 -0
  299. pymoo/util/value_functions.py +719 -0
  300. pymoo/util/vectors.py +40 -0
  301. pymoo/util/vf_dominator.py +99 -0
  302. pymoo/vendor/__init__.py +0 -0
  303. pymoo/vendor/cec2018.py +398 -0
  304. pymoo/vendor/gta.py +617 -0
  305. pymoo/vendor/hv.py +267 -0
  306. pymoo/vendor/vendor_cmaes.py +412 -0
  307. pymoo/vendor/vendor_coco.py +81 -0
  308. pymoo/vendor/vendor_scipy.py +232 -0
  309. pymoo/version.py +1 -0
  310. pymoo/visualization/__init__.py +8 -0
  311. pymoo/visualization/fitness_landscape.py +127 -0
  312. pymoo/visualization/heatmap.py +123 -0
  313. pymoo/visualization/pcp.py +120 -0
  314. pymoo/visualization/petal.py +91 -0
  315. pymoo/visualization/radar.py +108 -0
  316. pymoo/visualization/radviz.py +68 -0
  317. pymoo/visualization/scatter.py +150 -0
  318. pymoo/visualization/star_coordinate.py +75 -0
  319. pymoo/visualization/util.py +123 -0
  320. pymoo/visualization/video/__init__.py +0 -0
  321. pymoo/visualization/video/callback_video.py +82 -0
  322. pymoo/visualization/video/one_var_one_obj.py +57 -0
  323. pymoo/visualization/video/two_var_one_obj.py +62 -0
  324. pymoo-0.6.1.5.dev0.dist-info/METADATA +187 -0
  325. pymoo-0.6.1.5.dev0.dist-info/RECORD +330 -0
  326. pymoo-0.6.1.5.dev0.dist-info/WHEEL +5 -0
  327. pymoo-0.6.1.5.dev0.dist-info/licenses/LICENSE +191 -0
  328. pymoo-0.6.1.5.dev0.dist-info/top_level.txt +1 -0
  329. pymoo.libs/libgcc_s-2298274a.so.1 +0 -0
  330. pymoo.libs/libstdc++-08d5c7eb.so.6.0.33 +0 -0
@@ -0,0 +1,94 @@
1
+ import numpy as np
2
+
3
+ from pymoo.algorithms.soo.nonconvex.ga import FitnessSurvival
4
+ from pymoo.core.algorithm import LoopwiseAlgorithm
5
+ from pymoo.core.initialization import Initialization
6
+ from pymoo.core.population import Population
7
+ from pymoo.core.repair import NoRepair
8
+ from pymoo.core.replacement import is_better
9
+ from pymoo.core.variable import Real, Integer, get
10
+ from pymoo.docs import parse_doc_string
11
+ from pymoo.operators.crossover.pcx import PCX
12
+ from pymoo.operators.mutation.pm import PM
13
+ from pymoo.operators.sampling.rnd import FloatRandomSampling
14
+ from pymoo.operators.selection.rnd import fast_fill_random
15
+ from pymoo.util.display.single import SingleObjectiveOutput
16
+
17
+
18
+ # =========================================================================================================
19
+ # Implementation
20
+ # =========================================================================================================
21
+
22
+
23
+ class G3PCX(LoopwiseAlgorithm):
24
+
25
+ def __init__(self,
26
+ pop_size=100,
27
+ sampling=FloatRandomSampling(),
28
+ n_offsprings=2,
29
+ n_parents=3,
30
+ family_size=2,
31
+ repair=NoRepair(),
32
+ output=SingleObjectiveOutput(),
33
+ **kwargs):
34
+
35
+ super().__init__(output=output, **kwargs)
36
+
37
+ self.pop_size = Integer(pop_size, bounds=(20, 200))
38
+ self.repair = repair
39
+
40
+ self.initialization = Initialization(sampling, repair=self.repair, eliminate_duplicates=False)
41
+
42
+ self.n_offsprings = Integer(n_offsprings, bounds=(1, 10))
43
+ self.n_parents = Integer(n_parents, bounds=(3, 10))
44
+ self.family_size = Integer(family_size, bounds=(1, 10))
45
+
46
+ self.crossover = PCX()
47
+ self.crossover.prob = 1.0
48
+
49
+ self.mutation = PM()
50
+ self.mutation.prob = Real(0.25, bounds=(0.0, 1.0))
51
+
52
+ def _initialize_infill(self):
53
+ return self.initialization.do(self.problem, get(self.pop_size), algorithm=self)
54
+
55
+ def _initialize_advance(self, infills=None, **kwargs):
56
+ self.pop = FitnessSurvival().do(self.problem, infills, n_survive=len(infills), algorithm=self, **kwargs)
57
+
58
+ def _next(self, **kwargs):
59
+ pop_size, n_offsprings, n_parents = get(self.pop_size, self.n_offsprings, self.n_parents)
60
+
61
+ # how many loops shall be iterated until one iteration has ended
62
+ loops_per_iter = pop_size // n_offsprings
63
+
64
+ for _ in range(loops_per_iter):
65
+
66
+ S = np.zeros((n_offsprings, n_parents), dtype=int)
67
+ S[:, 0] = 0
68
+ fast_fill_random(S, len(self.pop), columns=range(1, n_parents))
69
+
70
+ off = self.crossover(self.problem, self.pop, parents=S, algorithm=self)
71
+
72
+ off = self.mutation(self.problem, off, algorithm=self)
73
+
74
+ self.repair(self.problem, off, algorithm=self)
75
+
76
+ off = yield off
77
+
78
+ pop, family_size = self.pop, get(self.family_size)
79
+
80
+ rnd = np.random.choice(np.arange(len(pop)), size=family_size, replace=False)
81
+ family = Population.merge(pop[rnd], off)
82
+ pop[rnd] = FitnessSurvival().do(self.problem, family, n_survive=family_size)
83
+
84
+ for i in rnd:
85
+ if is_better(pop[i], pop[0]):
86
+ tmp = pop[0]
87
+ pop[0] = pop[i]
88
+ pop[i] = tmp
89
+
90
+ def _set_optimum(self, **kwargs):
91
+ self.opt = self.pop[[0]]
92
+
93
+
94
+ parse_doc_string(G3PCX.__init__)
@@ -0,0 +1,93 @@
1
+ import numpy as np
2
+
3
+ from pymoo.algorithms.base.genetic import GeneticAlgorithm
4
+ from pymoo.core.survival import Survival
5
+ from pymoo.docs import parse_doc_string
6
+ from pymoo.operators.crossover.sbx import SBX
7
+ from pymoo.operators.crossover.spx import SPX
8
+ from pymoo.operators.mutation.bitflip import BitflipMutation
9
+ from pymoo.operators.mutation.pm import PM
10
+ from pymoo.operators.sampling.rnd import BinaryRandomSampling
11
+ from pymoo.operators.sampling.rnd import FloatRandomSampling
12
+ from pymoo.operators.selection.tournament import compare, TournamentSelection
13
+ from pymoo.termination.default import DefaultSingleObjectiveTermination
14
+ from pymoo.util.display.single import SingleObjectiveOutput
15
+
16
+
17
+ # =========================================================================================================
18
+ # Survival
19
+ # =========================================================================================================
20
+
21
+ class FitnessSurvival(Survival):
22
+
23
+ def __init__(self) -> None:
24
+ super().__init__(filter_infeasible=False)
25
+
26
+ def _do(self, problem, pop, n_survive=None, **kwargs):
27
+ F, cv = pop.get("F", "cv")
28
+ assert F.shape[1] == 1, "FitnessSurvival can only used for single objective single!"
29
+ S = np.lexsort([F[:, 0], cv])
30
+ pop.set("rank", np.argsort(S))
31
+ return pop[S[:n_survive]]
32
+
33
+
34
+ # =========================================================================================================
35
+ # Implementation
36
+ # =========================================================================================================
37
+
38
+
39
+ def comp_by_cv_and_fitness(pop, P, **kwargs):
40
+ S = np.full(P.shape[0], np.nan)
41
+
42
+ for i in range(P.shape[0]):
43
+ a, b = P[i, 0], P[i, 1]
44
+
45
+ # if at least one solution is infeasible
46
+ if pop[a].CV > 0.0 or pop[b].CV > 0.0:
47
+ S[i] = compare(a, pop[a].CV, b, pop[b].CV, method='smaller_is_better', return_random_if_equal=True)
48
+
49
+ # both solutions are feasible just set random
50
+ else:
51
+ S[i] = compare(a, pop[a].F, b, pop[b].F, method='smaller_is_better', return_random_if_equal=True)
52
+
53
+ return S[:, None].astype(int)
54
+
55
+
56
+ class GA(GeneticAlgorithm):
57
+
58
+ def __init__(self,
59
+ pop_size=100,
60
+ sampling=FloatRandomSampling(),
61
+ selection=TournamentSelection(func_comp=comp_by_cv_and_fitness),
62
+ crossover=SBX(),
63
+ mutation=PM(),
64
+ survival=FitnessSurvival(),
65
+ eliminate_duplicates=True,
66
+ n_offsprings=None,
67
+ output=SingleObjectiveOutput(),
68
+ **kwargs):
69
+ super().__init__(pop_size=pop_size,
70
+ sampling=sampling,
71
+ selection=selection,
72
+ crossover=crossover,
73
+ mutation=mutation,
74
+ survival=survival,
75
+ eliminate_duplicates=eliminate_duplicates,
76
+ n_offsprings=n_offsprings,
77
+ output=output,
78
+ **kwargs)
79
+
80
+ self.termination = DefaultSingleObjectiveTermination()
81
+
82
+
83
+ class BGA(GA):
84
+
85
+ def __init__(self,
86
+ sampling=BinaryRandomSampling(),
87
+ crossover=SPX(),
88
+ mutation=BitflipMutation(),
89
+ **kwargs):
90
+ super().__init__(sampling=sampling, crossover=crossover, mutation=mutation, **kwargs)
91
+
92
+
93
+ parse_doc_string(GA.__init__)
@@ -0,0 +1,223 @@
1
+ import numpy as np
2
+
3
+ from pymoo.algorithms.soo.nonconvex.ga import FitnessSurvival, GA
4
+ from pymoo.core.survival import Survival
5
+ from pymoo.docs import parse_doc_string
6
+ from pymoo.operators.selection.tournament import compare, TournamentSelection
7
+ from pymoo.termination.cv import ConstraintViolationTermination
8
+ from pymoo.termination.default import DefaultSingleObjectiveTermination, DefaultTermination
9
+ from pymoo.termination.ftol import SingleObjectiveSpaceTermination
10
+ from pymoo.termination.robust import RobustTermination
11
+ from pymoo.termination.xtol import DesignSpaceTermination
12
+ from pymoo.util.clearing import EpsilonClearing
13
+ from pymoo.util.display.column import Column
14
+ from pymoo.util.display.single import SingleObjectiveOutput
15
+ from pymoo.util.misc import norm_eucl_dist
16
+
17
+
18
+ # =========================================================================================================
19
+ # Display
20
+ # =========================================================================================================
21
+
22
+ class NicheOutput(SingleObjectiveOutput):
23
+
24
+ def __init__(self):
25
+ super().__init__()
26
+ self.n_niches = Column("n_niches", width=10, func=lambda algorithm: len(algorithm.opt))
27
+ self.columns += [self.n_niches]
28
+
29
+
30
+ # =========================================================================================================
31
+ # Termination
32
+ # =========================================================================================================
33
+
34
+ class NicheSingleObjectiveSpaceToleranceTermination(SingleObjectiveSpaceTermination):
35
+
36
+ def _data(self, algorithm):
37
+ return algorithm.opt.get("F").mean()
38
+
39
+
40
+ class NicheTermination(DefaultTermination):
41
+
42
+ def __init__(self,
43
+ x_tol=1e-32,
44
+ cv_tol=1e-6,
45
+ f_tol=1e-6,
46
+ period=20,
47
+ **kwargs) -> None:
48
+ super().__init__(RobustTermination(DesignSpaceTermination(tol=x_tol), period=period),
49
+ RobustTermination(ConstraintViolationTermination(tol=cv_tol), period=period),
50
+ RobustTermination(NicheSingleObjectiveSpaceToleranceTermination(tol=f_tol, n_skip=5),
51
+ period=period),
52
+ **kwargs)
53
+
54
+
55
+ # =========================================================================================================
56
+ # Selection
57
+ # =========================================================================================================
58
+
59
+
60
+ def comp_by_cv_and_clearing_fitness(pop, P, **kwargs):
61
+ S = np.full(P.shape[0], np.nan)
62
+
63
+ for i in range(P.shape[0]):
64
+ a, b = P[i, 0], P[i, 1]
65
+
66
+ # if at least one solution is infeasible
67
+ if pop[a].CV[0] > 0.0 or pop[b].CV[0] > 0.0:
68
+ S[i] = compare(a, pop[a].CV, b, pop[b].CV,
69
+ method='smaller_is_better',
70
+ return_random_if_equal=True)
71
+
72
+ # first compare by the round the individual was selected
73
+ else:
74
+ S[i] = compare(a, pop[a].get("iter"), b, pop[b].get("iter"), method='smaller_is_better')
75
+
76
+ # if it was the same round - then use the rank of the fitness directly
77
+ if np.isnan(S[i]):
78
+ S[i] = compare(a, pop[a].get("rank"), b, pop[b].get("rank"),
79
+ method='smaller_is_better', return_random_if_equal=True)
80
+
81
+ return S[:, None].astype(int)
82
+
83
+
84
+ # =========================================================================================================
85
+ # Survival
86
+ # =========================================================================================================
87
+
88
+ class EpsilonClearingSurvival(Survival):
89
+
90
+ def __init__(self, epsilon, n_max_each_iter=None, norm_by_dim=False) -> None:
91
+ super().__init__(False)
92
+ self.epsilon = epsilon
93
+ self.n_max_each_iter = n_max_each_iter
94
+ self.norm_by_dim = norm_by_dim
95
+
96
+ def _do(self, problem, pop, n_survive=None, out=None, **kwargs):
97
+ F = pop.get("F")
98
+
99
+ if F.shape[1] != 1:
100
+ raise ValueError("FitnessSurvival can only used for single objective single!")
101
+
102
+ # this basically sorts the population by constraint and objective value
103
+ pop = FitnessSurvival().do(problem, pop, n_survive=len(pop))
104
+
105
+ # calculate the distance from each individual to another - pre-processing for the clearing
106
+ # NOTE: the distance is normalized by the maximum distance possible
107
+ X = pop.get("X").astype(float)
108
+ D = norm_eucl_dist(problem, X, X)
109
+ if self.norm_by_dim:
110
+ D = D / (problem.n_var ** 0.5)
111
+
112
+ # initialize the clearing strategy
113
+ clearing = EpsilonClearing(D, self.epsilon)
114
+
115
+ # initialize the iteration and rank i the beginning
116
+ iter, rank = 1, 1
117
+
118
+ # also solutions that have been found in the first iteration
119
+ iter_one = None
120
+
121
+ # until the number of selected individuals are less than expected survivors
122
+ while len(clearing.selected()) < n_survive:
123
+
124
+ # get all the remaining indices
125
+ remaining = clearing.remaining()
126
+
127
+ # if no individuals are left because of clearing - perform a reset
128
+ if len(remaining) == 0 or (self.n_max_each_iter is not None and rank > self.n_max_each_iter):
129
+ # reset and retrieve the newly available indices
130
+ clearing.reset()
131
+ remaining = clearing.remaining()
132
+
133
+ # increase the iteration counter and start over from rank 1
134
+ iter += 1
135
+ rank = 1
136
+
137
+ # get the individual of the first iteration - needed for niche assignment
138
+ iter_one = np.where(pop.get("iter") == 1)[0] if iter_one is None else iter_one
139
+
140
+ # since the population is ordered by F and CV it is always the first index
141
+ k = remaining[0]
142
+
143
+ # set the attribute to the selected individual
144
+ pop[k].set("iter", iter)
145
+ pop[k].set("rank", rank)
146
+
147
+ # in the first iteration set the niche counter for each solution equal to rank
148
+ if iter == 1:
149
+ pop[k].set("niche", rank)
150
+ else:
151
+ closest_iter_one = iter_one[D[k][iter_one].argmin()]
152
+ niche = pop[closest_iter_one].get("niche")
153
+ pop[k].set("niche", niche)
154
+
155
+ clearing.select(k)
156
+ rank += 1
157
+
158
+ # retrieve all individuals being selected
159
+ S = clearing.selected()
160
+
161
+ return pop[S]
162
+
163
+
164
+ # =========================================================================================================
165
+ # Algorithm
166
+ # =========================================================================================================
167
+
168
+
169
+ class NicheGA(GA):
170
+
171
+ def __init__(self,
172
+ pop_size=100,
173
+ norm_niche_size=0.05,
174
+ norm_by_dim=False,
175
+ return_all_opt=True,
176
+ output=NicheOutput(),
177
+ **kwargs):
178
+ """
179
+
180
+ Parameters
181
+ ----------
182
+ norm_niche_size : float
183
+ The radius in which the clearing shall be performed. The clearing is performed in the normalized design
184
+ space, e.g. 0.05 corresponds to clear all solutions which have less norm euclidean distance than 5%.
185
+ pop_size : {pop_size}
186
+ sampling : {sampling}
187
+ selection : {selection}
188
+ crossover : {crossover}
189
+ mutation : {mutation}
190
+ eliminate_duplicates : {eliminate_duplicates}
191
+ n_offsprings : {n_offsprings}
192
+
193
+ """
194
+
195
+ surv = kwargs.get("survival")
196
+ if surv is None:
197
+ surv = EpsilonClearingSurvival(norm_niche_size, n_max_each_iter=None, norm_by_dim=norm_by_dim)
198
+
199
+ selection = kwargs.get("selection")
200
+ if selection is None:
201
+ selection = TournamentSelection(comp_by_cv_and_clearing_fitness)
202
+
203
+ super().__init__(pop_size=pop_size,
204
+ selection=selection,
205
+ survival=surv,
206
+ output=output,
207
+ advance_after_initial_infill=True,
208
+ **kwargs)
209
+
210
+ # self.termination = NicheTermination()
211
+ self.termination = DefaultSingleObjectiveTermination()
212
+
213
+ # whether with rank one after clearing or just the best should be considered as optimal
214
+ self.return_all_opt = return_all_opt
215
+
216
+ def _set_optimum(self, **kwargs):
217
+ if self.return_all_opt:
218
+ self.opt = self.pop[self.pop.get("iter") == 1]
219
+ else:
220
+ super()._set_optimum()
221
+
222
+
223
+ parse_doc_string(NicheGA.__init__)
@@ -0,0 +1,74 @@
1
+ from math import sqrt, log, exp
2
+
3
+ import numpy as np
4
+
5
+ from pymoo.algorithms.soo.nonconvex.es import es_sigma, es_mut_repair
6
+ from pymoo.algorithms.soo.nonconvex.sres import SRES
7
+ from pymoo.core.population import Population
8
+ from pymoo.docs import parse_doc_string
9
+
10
+
11
+ class ISRES(SRES):
12
+
13
+ def __init__(self, gamma=0.85, alpha=0.2, **kwargs):
14
+ """
15
+ Improved Stochastic Ranking Evolutionary Strategy (SRES)
16
+
17
+ Parameters
18
+ ----------
19
+ alpha : float
20
+ Length scale of the differentials during mutation.
21
+ PF: float
22
+ The stochastic ranking weight for choosing a random decision while doing the modified bubble sort.
23
+ """
24
+
25
+ super().__init__(**kwargs)
26
+ self.gamma = gamma
27
+ self.alpha = alpha
28
+
29
+ def _setup(self, problem, **kwargs):
30
+ super()._setup(problem, **kwargs)
31
+ n = problem.n_var
32
+
33
+ chi = (1 / (2 * n) + 1 / (2 * (n ** 0.5)))
34
+ varphi = sqrt((2 / chi) * log((1 / self.alpha) * (exp(self.phi ** 2 * chi / 2) - (1 - self.alpha))))
35
+
36
+ self.taup = varphi / ((2 * n) ** 0.5)
37
+ self.tau = varphi / ((2 * (n ** 0.5)) ** 0.5)
38
+
39
+ def _infill(self):
40
+ pop, mu, _lambda = self.pop, self.pop_size, self.n_offsprings
41
+ xl, xu = self.problem.bounds()
42
+ X, sigma = pop.get("X", "sigma")
43
+
44
+ # cycle through the elites individuals for create the solutions
45
+ I = np.arange(_lambda) % min(mu, len(X))
46
+
47
+ # transform X and sigma to the shape of number of offsprings
48
+ X, sigma = X[I], sigma[I]
49
+
50
+ # copy the original sigma to sigma prime to be modified
51
+ Xp, sigmap = np.copy(X), np.copy(sigma)
52
+
53
+ # for the best individuals do differential variation to provide a direction to search in
54
+ Xp[:mu - 1] = X[:mu - 1] + self.gamma * (X[0] - X[1:mu])
55
+
56
+ # update the sigma values for elite and non-elite individuals
57
+ sigmap[mu - 1:] = np.minimum(self.sigma_max, es_sigma(sigma[mu - 1:], self.tau, self.taup))
58
+
59
+ # execute the evolutionary strategy to calculate the offspring solutions
60
+ Xp[mu - 1:] = X[mu - 1:] + sigmap[mu - 1:] * np.random.normal(size=sigmap[mu - 1:].shape)
61
+
62
+ # repair the individuals which are not feasible by sampling from sigma again
63
+ Xp = es_mut_repair(Xp, X, sigmap, xl, xu, 10)
64
+
65
+ # now update the sigma values of the non-elites only
66
+ sigmap[mu:] = sigma[mu:] + self.alpha * (sigmap[mu:] - sigma[mu:])
67
+
68
+ # create the population to proceed further
69
+ off = Population.new(X=Xp, sigma=sigmap)
70
+
71
+ return off
72
+
73
+
74
+ parse_doc_string(ISRES.__init__)