pymoo 0.6.1.5.dev0__cp312-cp312-manylinux_2_17_x86_64.manylinux2014_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 (328) 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-312-x86_64-linux-gnu.so +0 -0
  91. pymoo/cython/calc_perpendicular_distance.pyx +67 -0
  92. pymoo/cython/decomposition.cpython-312-x86_64-linux-gnu.so +0 -0
  93. pymoo/cython/decomposition.pyx +165 -0
  94. pymoo/cython/hv.cpython-312-x86_64-linux-gnu.so +0 -0
  95. pymoo/cython/hv.pyx +18 -0
  96. pymoo/cython/info.cpython-312-x86_64-linux-gnu.so +0 -0
  97. pymoo/cython/info.pyx +5 -0
  98. pymoo/cython/mnn.cpython-312-x86_64-linux-gnu.so +0 -0
  99. pymoo/cython/mnn.pyx +273 -0
  100. pymoo/cython/non_dominated_sorting.cpython-312-x86_64-linux-gnu.so +0 -0
  101. pymoo/cython/non_dominated_sorting.pyx +645 -0
  102. pymoo/cython/pruning_cd.cpython-312-x86_64-linux-gnu.so +0 -0
  103. pymoo/cython/pruning_cd.pyx +197 -0
  104. pymoo/cython/stochastic_ranking.cpython-312-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 +328 -0
  326. pymoo-0.6.1.5.dev0.dist-info/WHEEL +6 -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
@@ -0,0 +1,18 @@
1
+ import numpy as np
2
+ import pymoo.gradient.toolbox as anp
3
+ from pymoo.core.problem import Problem
4
+
5
+
6
+ class Griewank(Problem):
7
+ def __init__(self, n_var=2):
8
+ super().__init__(n_var=n_var, n_obj=1, xl=-600, xu=600, vtype=float)
9
+
10
+ def _evaluate(self, x, out, *args, **kwargs):
11
+ out["F"] = 1 + 1 / 4000 * anp.sum(anp.power(x, 2), axis=1) \
12
+ - anp.prod(anp.cos(x / anp.sqrt(anp.arange(1, x.shape[1] + 1))), axis=1)
13
+
14
+ def _calc_pareto_front(self):
15
+ return 0
16
+
17
+ def _calc_pareto_set(self):
18
+ return np.full(self.n_var, 0)
@@ -0,0 +1,15 @@
1
+ from pymoo.core.problem import Problem
2
+
3
+
4
+ class Himmelblau(Problem):
5
+ def __init__(self, **kwargs):
6
+ super().__init__(n_var=2, n_obj=1, xl=-6, xu=6, vtype=float)
7
+
8
+ def _evaluate(self, x, out, *args, **kwargs):
9
+ out["F"] = (x[:, 0] ** 2 + x[:, 1] - 11) ** 2 + (x[:, 0] + x[:, 1] ** 2 - 7) ** 2
10
+
11
+ def _calc_pareto_front(self):
12
+ return 0
13
+
14
+ def _calc_pareto_set(self):
15
+ return [[3.0, 2.0], [-2.805118, 3.131312], [-3.779310, -3.283186], [3.584428, -1.848126]]
@@ -0,0 +1,48 @@
1
+ import numpy as np
2
+ import numpy as np
3
+
4
+ from pymoo.core.problem import Problem
5
+
6
+
7
+ class Knapsack(Problem):
8
+ def __init__(self,
9
+ n_items, # number of items that can be picked up
10
+ W, # weights for each item
11
+ P, # profit of each item
12
+ C, # maximum capacity
13
+ ):
14
+ super().__init__(n_var=n_items, n_obj=1, n_ieq_constr=1, xl=0, xu=1, vtype=bool)
15
+
16
+ self.W = W
17
+ self.P = P
18
+ self.C = C
19
+
20
+ def _evaluate(self, x, out, *args, **kwargs):
21
+ out["F"] = -np.sum(self.P * x, axis=1)
22
+ out["G"] = (np.sum(self.W * x, axis=1) - self.C)
23
+
24
+
25
+ class MultiObjectiveKnapsack(Knapsack):
26
+ def __init__(self, *args):
27
+ super().__init__(*args)
28
+
29
+ def _evaluate(self, x, out, *args, **kwargs):
30
+ f1 = - np.sum(self.P * x, axis=1)
31
+ f2 = np.sum(x, axis=1)
32
+
33
+ out["F"] = np.column_stack([f1, f2])
34
+ out["G"] = (np.sum(self.W * x, axis=1) - self.C)
35
+
36
+
37
+ def create_random_knapsack_problem(n_items, seed=1, variant="single"):
38
+ np.random.seed(seed)
39
+ P = np.random.randint(1, 100, size=n_items)
40
+ W = np.random.randint(1, 100, size=n_items)
41
+ C = int(np.sum(W) / 10)
42
+
43
+ if variant == "single":
44
+ problem = Knapsack(n_items, W, P, C)
45
+ else:
46
+ problem = MultiObjectiveKnapsack(n_items, W, P, C)
47
+
48
+ return problem
@@ -0,0 +1,26 @@
1
+ import os
2
+ import subprocess
3
+
4
+ import numpy as np
5
+
6
+ from pymoo.core.problem import ElementwiseProblem
7
+
8
+
9
+ class MOPTA08(ElementwiseProblem):
10
+ def __init__(self, exec):
11
+ super().__init__(n_var=124, n_obj=1, n_ieq_constr=68, xl=0, xu=1, vtype=float)
12
+ self.exec = exec
13
+
14
+ def _evaluate(self, x, out, *args, **kwargs):
15
+ inputs = os.linesep.join([str(e) for e in x])
16
+ res = subprocess.run(self.exec, input=inputs, text=True, stdout=subprocess.PIPE)
17
+ val = np.array([float(e) for e in res.stdout.split()])
18
+ out["F"] = val[0]
19
+ out["G"] = val[1:]
20
+
21
+ def _calc_pareto_front(self, *args, **kwargs):
22
+ return 222.74
23
+
24
+
25
+
26
+
@@ -0,0 +1,20 @@
1
+ import pymoo.gradient.toolbox as anp
2
+
3
+ from pymoo.core.problem import Problem
4
+
5
+
6
+ class MultiModalSimple1(Problem):
7
+ def __init__(self, n_var=1):
8
+ super().__init__(n_var=n_var, n_obj=1, xl=0, xu=1, vtype=float)
9
+
10
+ def _evaluate(self, x, out, *args, **kwargs):
11
+ out["F"] = 1 - anp.exp(-x ** 2) * anp.sin(2 * anp.pi * x) ** 2
12
+
13
+
14
+ class MultiModalSimple2(Problem):
15
+ def __init__(self, n_var=1):
16
+ super().__init__(n_var=n_var, n_obj=1, xl=-1, xu=0, vtype=float)
17
+
18
+ def _evaluate(self, x, out, *args, **kwargs):
19
+ x = - x
20
+ out["F"] = 1.1 - anp.exp(-2 * x) * anp.sin(5 * anp.pi * x) ** 2
@@ -0,0 +1,30 @@
1
+ import pymoo.gradient.toolbox as anp
2
+ import numpy as np
3
+
4
+ from pymoo.core.problem import Problem
5
+
6
+
7
+ class PressureVessel(Problem):
8
+ def __init__(self):
9
+ super().__init__(n_var=4, n_obj=1, n_ieq_constr=4, vtype=float)
10
+ self.xl = np.array([1, 1, 10.0, 10.0])
11
+ self.xu = np.array([99, 99, 200.0, 200.0])
12
+
13
+ def _evaluate(self, x, out, *args, **kwargs):
14
+
15
+ d1, d2, r, L = x[:, 0]*0.0625, x[:, 1]*0.0625, x[:, 2], x[:, 3]
16
+
17
+ out["F"] = 0.6224*d1*r*L + 1.7781*d2*r**2 + 3.1661*d1**2*L + 19.84*d1**2*r
18
+
19
+ g1 = (-d1 + 0.0193*r)/3
20
+ g2 = (-d2 + 0.00954*r)/3
21
+ g3 = (-anp.pi * r ** 2 * L - 4 * anp.pi / 3 * r ** 3 + 1296000) / 1296000
22
+ g4 = (L - 240)/240
23
+
24
+ out["G"] = anp.column_stack([g1, g2, g3, g4])
25
+
26
+ def _calc_pareto_front(self):
27
+ return 5.8853e+03
28
+
29
+ def _calc_pareto_set(self):
30
+ return [13, 7, 42.0984456, 176.6366]
@@ -0,0 +1,20 @@
1
+ import pymoo.gradient.toolbox as anp
2
+ import numpy as np
3
+
4
+ from pymoo.core.problem import Problem
5
+
6
+
7
+ class Rastrigin(Problem):
8
+ def __init__(self, n_var=2, A=10.0):
9
+ super().__init__(n_var=n_var, n_obj=1, xl=-5, xu=5, vtype=float)
10
+ self.A = A
11
+
12
+ def _evaluate(self, x, out, *args, **kwargs):
13
+ z = anp.power(x, 2) - self.A * anp.cos(2 * anp.pi * x)
14
+ out["F"] = self.A * self.n_var + anp.sum(z, axis=1)
15
+
16
+ def _calc_pareto_front(self):
17
+ return 0.0
18
+
19
+ def _calc_pareto_set(self):
20
+ return np.full(self.n_var, 0)
@@ -0,0 +1,22 @@
1
+ import pymoo.gradient.toolbox as anp
2
+ import numpy as np
3
+
4
+ from pymoo.core.problem import Problem
5
+
6
+
7
+ class Rosenbrock(Problem):
8
+ def __init__(self, n_var=2):
9
+ super().__init__(n_var=n_var, n_obj=1, n_ieq_constr=0, xl=-2.048, xu=2.048, vtype=float)
10
+
11
+ def _evaluate(self, x, out, *args, **kwargs):
12
+ l = []
13
+ for i in range(x.shape[1] - 1):
14
+ val = 100 * (x[:, i + 1] - x[:, i] ** 2) ** 2 + (1 - x[:, i]) ** 2
15
+ l.append(val)
16
+ out["F"] = anp.sum(anp.column_stack(l), axis=1)
17
+
18
+ def _calc_pareto_front(self):
19
+ return 0.0
20
+
21
+ def _calc_pareto_set(self):
22
+ return np.full(self.n_var, 1.0)
@@ -0,0 +1,18 @@
1
+ import pymoo.gradient.toolbox as anp
2
+ import numpy as np
3
+
4
+ from pymoo.core.problem import Problem
5
+
6
+
7
+ class Schwefel(Problem):
8
+ def __init__(self, n_var=2):
9
+ super().__init__(n_var=n_var, n_obj=1, n_ieq_constr=0, xl=-500, xu=500, vtype=float)
10
+
11
+ def _evaluate(self, x, out, *args, **kwargs):
12
+ out["F"] = 418.9829 * self.n_var - anp.sum(x * anp.sin(anp.sqrt(anp.abs(x))), axis=1)
13
+
14
+ def _calc_pareto_front(self):
15
+ return 0
16
+
17
+ def _calc_pareto_set(self):
18
+ return np.full(self.n_var, 420.9687)
@@ -0,0 +1,13 @@
1
+ import pymoo.gradient.toolbox as anp
2
+
3
+ from pymoo.core.problem import Problem
4
+
5
+
6
+ class SimpleMultiModal01(Problem):
7
+
8
+ def __init__(self):
9
+ super().__init__(n_var=2, n_obj=1, n_ieq_constr=0, xl=0, xu=1, vtype=float)
10
+
11
+ def _evaluate(self, X, out, *args, **kwargs):
12
+ x, y = X[:, 0], X[:, 1]
13
+ out["F"] = - anp.exp(-9 * abs(x * y)) * anp.sin(3 * anp.pi * x) ** 2 * anp.sin(3 * anp.pi * y) ** 2
@@ -0,0 +1,19 @@
1
+ import pymoo.gradient.toolbox as anp
2
+ import numpy as np
3
+
4
+ from pymoo.core.problem import Problem
5
+
6
+
7
+ class Sphere(Problem):
8
+
9
+ def __init__(self, n_var=10):
10
+ super().__init__(n_var=n_var, n_obj=1, n_ieq_constr=0, xl=-0, xu=1, vtype=float)
11
+
12
+ def _evaluate(self, x, out, *args, **kwargs):
13
+ out["F"] = anp.sum(anp.square(x - 0.5), axis=1)
14
+
15
+ def _calc_pareto_front(self):
16
+ return 0.0
17
+
18
+ def _calc_pareto_set(self):
19
+ return np.full(self.n_var, 0.5)
@@ -0,0 +1,79 @@
1
+ import matplotlib.pyplot as plt
2
+ import numpy as np
3
+ from scipy.spatial.distance import cdist
4
+
5
+ from pymoo.core.problem import ElementwiseProblem
6
+
7
+
8
+ class TravelingSalesman(ElementwiseProblem):
9
+
10
+ def __init__(self, cities, **kwargs):
11
+ """
12
+ A two-dimensional traveling salesman problem (TSP)
13
+
14
+ Parameters
15
+ ----------
16
+ cities : numpy.array
17
+ The cities with 2-dimensional coordinates provided by a matrix where city is represented by a row.
18
+
19
+ """
20
+ n_cities, _ = cities.shape
21
+
22
+ self.cities = cities
23
+ self.D = cdist(cities, cities)
24
+
25
+ super(TravelingSalesman, self).__init__(
26
+ n_var=n_cities,
27
+ n_obj=1,
28
+ xl=0,
29
+ xu=n_cities,
30
+ vtype=int,
31
+ **kwargs
32
+ )
33
+
34
+ def _evaluate(self, x, out, *args, **kwargs):
35
+ out['F'] = self.get_route_length(x)
36
+
37
+ def get_route_length(self, x):
38
+ n_cities = len(x)
39
+ dist = 0
40
+ for k in range(n_cities - 1):
41
+ i, j = x[k], x[k + 1]
42
+ dist += self.D[i, j]
43
+
44
+ last, first = x[-1], x[0]
45
+ dist += self.D[last, first] # back to the initial city
46
+ return dist
47
+
48
+
49
+ def create_random_tsp_problem(n_cities, grid_width=100.0, grid_height=None, seed=None):
50
+ if seed is not None:
51
+ np.random.seed(seed)
52
+ grid_height = grid_height if grid_height is not None else grid_width
53
+ cities = np.random.random((n_cities, 2)) * [grid_width, grid_height]
54
+ return TravelingSalesman(cities)
55
+
56
+
57
+ def visualize(problem, x, fig=None, ax=None, show=True, label=True):
58
+ with plt.style.context('ggplot'):
59
+
60
+ if fig is None or ax is None:
61
+ fig, ax = plt.subplots()
62
+
63
+ # plot cities using scatter plot
64
+ ax.scatter(problem.cities[:, 0], problem.cities[:, 1], s=250)
65
+ if label:
66
+ # annotate cities
67
+ for i, c in enumerate(problem.cities):
68
+ ax.annotate(str(i), xy=c, fontsize=10, ha="center", va="center", color="white")
69
+
70
+ # plot the line on the path
71
+ for i in range(len(x)):
72
+ current = x[i]
73
+ next_ = x[(i + 1) % len(x)]
74
+ ax.plot(problem.cities[[current, next_], 0], problem.cities[[current, next_], 1], 'r--')
75
+
76
+ fig.suptitle("Route length: %.4f" % problem.get_route_length(x))
77
+
78
+ if show:
79
+ fig.show()
@@ -0,0 +1,19 @@
1
+ import pymoo.gradient.toolbox as anp
2
+ import numpy as np
3
+
4
+ from pymoo.core.problem import Problem
5
+
6
+
7
+ class Zakharov(Problem):
8
+ def __init__(self, n_var=2):
9
+ super().__init__(n_var=n_var, n_obj=1, xl=-10, xu=10, vtype=float)
10
+
11
+ def _evaluate(self, x, out, *args, **kwargs):
12
+ a = anp.sum(0.5 * anp.arange(1, self.n_var + 1) * x, axis=1)
13
+ out["F"] = anp.sum(anp.square(x), axis=1) + anp.square(a) + anp.power(a, 4)
14
+
15
+ def _calc_pareto_front(self):
16
+ return 0
17
+
18
+ def _calc_pareto_set(self):
19
+ return np.full(self.n_var, 0)
@@ -0,0 +1,14 @@
1
+ from pymoo.core.meta import Meta
2
+ from pymoo.core.problem import Problem
3
+
4
+
5
+ class StaticProblem(Meta, Problem):
6
+
7
+ def __init__(self, problem, **kwargs):
8
+ super().__init__(problem)
9
+ self.kwargs = kwargs
10
+
11
+ def _evaluate(self, _, out, *args, **kwargs):
12
+ for K, V in self.kwargs.items():
13
+ out[K] = V
14
+
pymoo/problems/util.py ADDED
@@ -0,0 +1,42 @@
1
+ import copy
2
+ import os
3
+ import types
4
+
5
+ import numpy as np
6
+
7
+
8
+ def decompose(problem, decomposition, weights, return_copy=True):
9
+ if return_copy:
10
+ problem = copy.deepcopy(problem)
11
+
12
+ problem._multi_evaluate = problem._evaluate
13
+
14
+ def _evaluate(self, x, out, *args, **kwargs):
15
+ self._multi_evaluate(x, out, *args, **kwargs)
16
+ out["F"] = decomposition.do(out["F"], weights, _type="many_to_one")
17
+
18
+ problem._evaluate = types.MethodType(_evaluate, problem)
19
+ problem.n_obj = 1
20
+
21
+ return problem
22
+
23
+
24
+ def load_pareto_front_from_file(fname):
25
+ current_dir = os.path.dirname(os.path.realpath(__file__))
26
+ fname = os.path.join(current_dir, "pf", "%s" % fname)
27
+ if os.path.isfile(fname):
28
+ pf = np.loadtxt(fname)
29
+ return pf[pf[:, 0].argsort()]
30
+
31
+
32
+ def binomial(n, k):
33
+ if 0 <= k <= n:
34
+ ntok = 1
35
+ ktok = 1
36
+ for t in range(1, min(k, n - k) + 1):
37
+ ntok *= n
38
+ ktok *= t
39
+ n -= 1
40
+ return ntok // ktok
41
+ else:
42
+ return 0
@@ -0,0 +1,27 @@
1
+ import numpy as np
2
+
3
+ from pymoo.core.meta import Meta
4
+ from pymoo.core.problem import Problem
5
+ from pymoo.util.normalization import denormalize, normalize
6
+
7
+
8
+ class ZeroToOne(Meta, Problem):
9
+
10
+ def __init__(self, problem):
11
+ super().__init__(problem)
12
+ assert self.xl is not None and self.xu is not None, "Both, xl and xu, must be set to redefine the problem!"
13
+ self.xl, self.xu = np.zeros(self.n_var), np.ones(self.n_var)
14
+
15
+ def do(self, X, return_values_of, *args, **kwargs):
16
+ Xp = self.normalize(X)
17
+
18
+ out = super().do(Xp, return_values_of, *args, **kwargs)
19
+ out["__X__"] = X
20
+
21
+ return out
22
+
23
+ def denormalize(self, x):
24
+ return denormalize(x, self.__object__.xl, self.__object__.xu)
25
+
26
+ def normalize(self, x):
27
+ return normalize(x, self.__object__.xl, self.__object__.xu)
@@ -0,0 +1,23 @@
1
+
2
+ def get_termination(name, *args, **kwargs):
3
+ from pymoo.termination.default import DefaultMultiObjectiveTermination, DefaultSingleObjectiveTermination
4
+ from pymoo.termination.max_eval import MaximumFunctionCallTermination
5
+ from pymoo.termination.max_gen import MaximumGenerationTermination
6
+ from pymoo.termination.max_time import TimeBasedTermination
7
+ from pymoo.termination.fmin import MinimumFunctionValueTermination
8
+
9
+ TERMINATION = {
10
+ "n_eval": MaximumFunctionCallTermination,
11
+ "n_evals": MaximumFunctionCallTermination,
12
+ "n_gen": MaximumGenerationTermination,
13
+ "n_iter": MaximumGenerationTermination,
14
+ "fmin": MinimumFunctionValueTermination,
15
+ "time": TimeBasedTermination,
16
+ "soo": DefaultSingleObjectiveTermination,
17
+ "moo": DefaultMultiObjectiveTermination,
18
+ }
19
+
20
+ if name not in TERMINATION:
21
+ raise Exception("Termination not found.")
22
+
23
+ return TERMINATION[name](*args, **kwargs)
@@ -0,0 +1,12 @@
1
+
2
+ from pymoo.core.termination import Termination
3
+
4
+
5
+ class TerminationCollection(Termination):
6
+
7
+ def __init__(self, *args) -> None:
8
+ super().__init__()
9
+ self.terminations = args
10
+
11
+ def _update(self, algorithm):
12
+ return max([termination.update(algorithm) for termination in self.terminations])
@@ -0,0 +1,48 @@
1
+ from pymoo.core.termination import Termination
2
+ from pymoo.termination.delta import DeltaToleranceTermination
3
+
4
+
5
+ class ConstraintViolationTermination(DeltaToleranceTermination):
6
+
7
+ def __init__(self, tol=1e-6, terminate_when_feasible=True, **kwargs):
8
+ super().__init__(tol, **kwargs)
9
+ self.terminate_when_feasible = terminate_when_feasible
10
+
11
+ def _update(self, algorithm):
12
+ if algorithm.problem.has_constraints():
13
+ feasible_found = any(algorithm.opt.get("feas"))
14
+
15
+ if feasible_found:
16
+ if self.terminate_when_feasible:
17
+ return 1.0
18
+ else:
19
+ return 0.0
20
+
21
+ else:
22
+ return super()._update(algorithm)
23
+ else:
24
+ return 0.0
25
+
26
+ def _delta(self, prev, current):
27
+ return max(0.0, prev - current)
28
+
29
+ def _data(self, algorithm):
30
+ return algorithm.opt.get("CV").min()
31
+
32
+
33
+ class UntilFeasibleTermination(Termination):
34
+
35
+ def __init__(self) -> None:
36
+ super().__init__()
37
+ self.initial_cv = None
38
+
39
+ def _update(self, algorithm):
40
+ cv = algorithm.opt.get("CV").min()
41
+
42
+ if self.initial_cv is None:
43
+ if cv <= 0:
44
+ self.initial_cv = 1e-32
45
+ else:
46
+ self.initial_cv = cv
47
+
48
+ return 1 - cv / self.initial_cv
@@ -0,0 +1,45 @@
1
+ from pymoo.core.termination import Termination
2
+ from pymoo.termination.cv import ConstraintViolationTermination
3
+ from pymoo.termination.ftol import SingleObjectiveSpaceTermination, MultiObjectiveSpaceTermination
4
+ from pymoo.termination.max_eval import MaximumFunctionCallTermination
5
+ from pymoo.termination.max_gen import MaximumGenerationTermination
6
+ from pymoo.termination.robust import RobustTermination
7
+ from pymoo.termination.xtol import DesignSpaceTermination
8
+
9
+
10
+ class DefaultTermination(Termination):
11
+
12
+ def __init__(self, x, cv, f, n_max_gen=1000, n_max_evals=100000) -> None:
13
+ super().__init__()
14
+ self.x = x
15
+ self.cv = cv
16
+ self.f = f
17
+
18
+ self.max_gen = MaximumGenerationTermination(n_max_gen)
19
+ self.max_evals = MaximumFunctionCallTermination(n_max_evals)
20
+
21
+ self.criteria = [self.x, self.cv, self.f, self.max_gen, self.max_evals]
22
+
23
+ def _update(self, algorithm):
24
+ p = [criterion.update(algorithm) for criterion in self.criteria]
25
+ return max(p)
26
+
27
+
28
+ class DefaultSingleObjectiveTermination(DefaultTermination):
29
+
30
+ def __init__(self, xtol=1e-8, cvtol=1e-8, ftol=1e-6, period=30, **kwargs) -> None:
31
+ x = RobustTermination(DesignSpaceTermination(xtol), period=period)
32
+ cv = RobustTermination(ConstraintViolationTermination(cvtol, terminate_when_feasible=False), period=period)
33
+ f = RobustTermination(SingleObjectiveSpaceTermination(ftol, only_feas=True), period=period)
34
+ super().__init__(x, cv, f, **kwargs)
35
+
36
+
37
+ class DefaultMultiObjectiveTermination(DefaultTermination):
38
+
39
+ def __init__(self, xtol=0.0005, cvtol=1e-8, ftol=0.005, n_skip=5, period=50, **kwargs) -> None:
40
+ x = RobustTermination(DesignSpaceTermination(tol=xtol, n_skip=n_skip), period)
41
+ cv = RobustTermination(ConstraintViolationTermination(cvtol, terminate_when_feasible=False, n_skip=n_skip), period)
42
+ f = RobustTermination(MultiObjectiveSpaceTermination(ftol, only_feas=True, n_skip=n_skip), period)
43
+ super().__init__(x, cv, f, **kwargs)
44
+
45
+
@@ -0,0 +1,64 @@
1
+ import math
2
+ from abc import abstractmethod
3
+
4
+ from pymoo.core.termination import Termination
5
+
6
+
7
+ class DeltaToleranceTermination(Termination):
8
+
9
+ def __init__(self, tol, n_skip=0):
10
+ super().__init__()
11
+
12
+ # the tolerance threshold the difference (delta) to be under
13
+ assert tol >= 0
14
+ self.tol = tol
15
+
16
+ # the previous values to calculate the difference
17
+ self.data = None
18
+
19
+ # a counter of update calls
20
+ self.counter = 0
21
+
22
+ # whether some updates should be skipped
23
+ self.n_skip = n_skip
24
+
25
+ def _update(self, algorithm):
26
+
27
+ # the object from the previous iteration
28
+ prev = self.data
29
+
30
+ # and the one from the current iteration
31
+ current = self._data(algorithm)
32
+
33
+ # if there is no previous element to use
34
+ if prev is None:
35
+ perc = 0.0
36
+
37
+ elif self.counter > 0 and self.counter % (self.n_skip + 1) != 0:
38
+ perc = self.perc
39
+
40
+ else:
41
+ tol = self.tol
42
+ delta = self._delta(prev, current)
43
+
44
+ if delta <= tol:
45
+ return 1.0
46
+ else:
47
+ v = (delta - tol)
48
+ perc = 1 / (1 + v)
49
+
50
+ # remember the data from the current iteration and set it to data
51
+ self.data = current
52
+
53
+ # increase the function update counter
54
+ self.counter += 1
55
+
56
+ return perc
57
+
58
+ @abstractmethod
59
+ def _delta(self, prev, current):
60
+ pass
61
+
62
+ @abstractmethod
63
+ def _data(self, algorithm):
64
+ pass
@@ -0,0 +1,16 @@
1
+ from pymoo.core.termination import Termination
2
+
3
+
4
+ class MinimumFunctionValueTermination(Termination):
5
+
6
+ def __init__(self, fmin) -> None:
7
+ super().__init__()
8
+ self.fmin = fmin
9
+
10
+ def _update(self, algorithm):
11
+ opt = algorithm.opt
12
+
13
+ if not any(opt.get("feas")):
14
+ return 0.0
15
+ else:
16
+ return self.fmin / opt.get("F").min()