From 3c7ed234fad962d79651ec49f7e2e1015885a2f5 Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Tue, 8 Jul 2025 19:10:52 -0400 Subject: [PATCH 1/2] Solve a bug in NSGA2 tournament selection of parents --- .DS_Store | Bin 0 -> 8196 bytes docs/.DS_Store | Bin 0 -> 6148 bytes docs/md/pygad_more.md | 12 +- docs/md/releases.md | 10 +- docs/md/utils.md | 2 +- example_multi_objective.py | 65 +++++++++ pygad/.DS_Store | Bin 0 -> 10244 bytes pygad/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 205 bytes pygad/__pycache__/pygad.cpython-310.pyc | Bin 0 -> 81308 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 260 bytes pygad/helper/__pycache__/misc.cpython-310.pyc | Bin 0 -> 16690 bytes .../helper/__pycache__/unique.cpython-310.pyc | Bin 0 -> 15150 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 332 bytes .../__pycache__/crossover.cpython-310.pyc | Bin 0 -> 6127 bytes .../__pycache__/mutation.cpython-310.pyc | Bin 0 -> 17480 bytes pygad/utils/__pycache__/nsga2.cpython-310.pyc | Bin 0 -> 7658 bytes .../parent_selection.cpython-310.pyc | Bin 0 -> 14992 bytes pygad/utils/nsga2.py | 60 +++++--- pygad/utils/parent_selection.py | 137 +++++++++--------- .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 237 bytes .../__pycache__/plot.cpython-310.pyc | Bin 0 -> 13830 bytes pygad/visualize/plot.py | 5 +- 22 files changed, 193 insertions(+), 98 deletions(-) create mode 100644 .DS_Store create mode 100644 docs/.DS_Store create mode 100644 example_multi_objective.py create mode 100644 pygad/.DS_Store create mode 100644 pygad/__pycache__/__init__.cpython-310.pyc create mode 100644 pygad/__pycache__/pygad.cpython-310.pyc create mode 100644 pygad/helper/__pycache__/__init__.cpython-310.pyc create mode 100644 pygad/helper/__pycache__/misc.cpython-310.pyc create mode 100644 pygad/helper/__pycache__/unique.cpython-310.pyc create mode 100644 pygad/utils/__pycache__/__init__.cpython-310.pyc create mode 100644 pygad/utils/__pycache__/crossover.cpython-310.pyc create mode 100644 pygad/utils/__pycache__/mutation.cpython-310.pyc create mode 100644 pygad/utils/__pycache__/nsga2.cpython-310.pyc create mode 100644 pygad/utils/__pycache__/parent_selection.cpython-310.pyc create mode 100644 pygad/visualize/__pycache__/__init__.cpython-310.pyc create mode 100644 pygad/visualize/__pycache__/plot.cpython-310.pyc diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2f034958172052b7a3bef5fd41e0e5c179f3d3b1 GIT binary patch literal 8196 zcmeHML2nyH6n-yFVsAs6ZR(_fMUqJN00Q`yFPaTsG{(@T!!TeNFbo(53b#F-|d1o71=>;Ur739B8S{0kt_`yfVfa3aZt~&QWl{l9r}53>XH+8IZaAEUd#Z zMDQe&ze`v8nCjiXRZ+&%&>~b5!bF}galcN&HTq#U{ypHwM%VYkXm#~>oH{o>Gn>m< zxw+iq$`jGAL~hgz%Wm*cK2?SA8$;b~?0KwTw+rinN3O?NpbWegBgmr%9&d?$S@d`- zRJIj8U|D&qZeKY$xq0W-b!YAN>2>Gi&aG8a-&;F9wepL_8+Ui>&-@M-U#pD)#*qas z=;u-U4QZooA65eH3*M$aiO&OrBXFSuUGPcI(1QDfNzyllKO6LnZ7V}l4(`Jiow7~% z1S+tZK0Ej_L(&Y9c?@l$wUtIrvB}7@L1bdvFqfm^K)-qxHxZL zTDV+TSX@|IDlA=DUV8iLJ6G%W<%ZjQ)()gotP5WRWxvNBwgazK>AFpiw`&nQiYnf7 zR<{>2&|TL0{8d-=xJ#JAs}42Y2LWST&9{AU5VEM2(Dy%ckE)~D=fh?oe1AuTUgQbB z|0pEy-ilafiysJD{E$3*yDNvnJr;x{>vqPbw(kak%iFAc{MdIJ%-`l^5k;a?^O}O| zP0Xul>2W7ua?0ZSf6_srQY?KmR93WNLs2W_yM>_^ORRFinN=+9=?;tB`&~M<+fXA1 ze*xdZckn&@06)QR@CW>bvsl1ucmvn)9)5`T@l)KxHu~7XLp{ONFr-{duY`SiPJHT& zw_H@`zY76H+NTs$niQK?s0w-uKkX4JKL4DE&lc>Gm)(O68rdYPPS%H1q)u9#Pg#8R zIvW|ru%1}OrgvlTCG@~kT8ExEybVcqqgO?E@iJu`X z1y{L38mS_}1mszX2&1iMj)@IbB2XTSfIfpu_m2ZR$wQN-N*e{=Hh z{~Bdl!+>GnOfrDe8>?s@@0^hV(}KobBgRKog4Y+ewGlP*b3dnhRQ z8DAg(ABv+yo-bt^hhe}l@YWbmi+g~p_8KCXTfadf1AJN97>-f9Pb~cU7J5|v1;mg* zMC*Mn|9&CA1_KDIIpXo9oM4;}^>glmVG`#>yZs<)EANXxwkEf0Jq9$7z&tK^#Vy^6O`uhH~7KqcqI9)>8r7w(Nd$b28cP z?6jQyy=lvtbavWk?(R>gwzcv3YxksooeWZW!vui9?T+P>#u?nA!PEWgWoaVQOYBqb zD&!zx1R0z!(j`tYK2L8Y_kB=OnbHC^IC~?n!hrsWt+iJf-3)3NFbuq9255h9Pzha) zr9$31u;D8JVjbNqXwxqP)i@emjio}2pa@lps7i&tVhB}^en;oI8cT($9E84n2tBgU zHx$96GnT`?f)2i`#sr=-u;rODA* u>!AKYC84}hA(vpIk7G9IDBeP4!I(n^qN}k~h#nO4BfvD6#xU?-8F&Wa=C+Oi literal 0 HcmV?d00001 diff --git a/docs/md/pygad_more.md b/docs/md/pygad_more.md index def0fc4..631be60 100644 --- a/docs/md/pygad_more.md +++ b/docs/md/pygad_more.md @@ -337,9 +337,17 @@ Out of the range of *1000* numbers, all the 100 values might not be satisfying t > PyGAD does not yet handle the **dependencies** among the genes in the `gene_constraint` parameter. > -> For example, gene 0 might depend on gene 1. To efficiently enforce the constraints, the constraint for gene 1 must be enforced first (if not `None`) then the constraint for gene 0. +> This is an example where gene 0 depends on gene 1. To efficiently enforce the constraints, the constraint for gene 1 must be enforced first (if not `None`) then the constraint for gene 0. > -> PyGAD applies constraints sequentially, starting from the first gene to the last. To ensure correct behavior when genes depend on each other, structure your GA problem so that if gene X depends on gene Y, then gene Y appears earlier in the chromosome (solution) than gene X. +> ```python +> gene_constraint= +> [ +> lambda solution,values: [val for val in values if val lambda solution,values: [val for val in values if val>10] +> ] +> ``` +> +> PyGAD applies constraints sequentially, starting from the first gene to the last. To ensure correct behavior when genes depend on each other, structure your GA problem so that if gene X depends on gene Y, then gene Y appears earlier in the chromosome (solution) than gene X. As a result, its gene constraint will be earlier in the list. ## Full Example diff --git a/docs/md/releases.md b/docs/md/releases.md index 291d69e..7a2c450 100644 --- a/docs/md/releases.md +++ b/docs/md/releases.md @@ -566,7 +566,7 @@ Release Date 07 January 2025 6. Created a new method called `unique_float_gene_from_range()` inside the `pygad.helper.unique.Unique` class to find a unique floating-point number from a range. 7. Fix a bug in the `pygad.helper.unique.Unique.unique_gene_by_space()` method to return the numeric value only instead of a NumPy array. 8. Refactoring the `pygad/helper/unique.py` script to remove duplicate codes and reformatting the docstrings. -9. The plot_pareto_front_curve() method added to the pygad.visualize.plot.Plot class to visualize the Pareto front for multi-objective problems. It only supports 2 objectives. https://github.com/ahmedfgad/GeneticAlgorithmPython/issues/279 +9. The `plot_pareto_front_curve()` method added to the pygad.visualize.plot.Plot class to visualize the Pareto front for multi-objective problems. It only supports 2 objectives. https://github.com/ahmedfgad/GeneticAlgorithmPython/issues/279 11. Fix a bug converting a nested NumPy array to a nested list. https://github.com/ahmedfgad/GeneticAlgorithmPython/issues/300 12. The `Matplotlib` library is only imported when a method inside the `pygad/visualize/plot.py` script is used. This is more efficient than using `import matplotlib.pyplot` at the module level as this causes it to be imported when `pygad` is imported even when it is not needed. https://github.com/ahmedfgad/GeneticAlgorithmPython/issues/292 13. Fix a bug when minus sign (-) is used inside the `stop_criteria` parameter (e.g. `stop_criteria=["saturate_10", "reach_-0.5"]`). https://github.com/ahmedfgad/GeneticAlgorithmPython/issues/296 @@ -575,9 +575,9 @@ Release Date 07 January 2025 ## PyGAD 3.5.0 -Release Date 07 July 2025 +Release Date 08 July 2025 -1. Fix a bug when minus sign (-) is used inside the `stop_criteria` parameter for multi-objective problems. https://github.com/ahmedfgad/GeneticAlgorithmPython/issues/314 +1. Fix a bug when minus sign (-) is used inside the `stop_criteria` parameter for multi-objective problems. https://github.com/ahmedfgad/GeneticAlgorithmPython/issues/314 https://github.com/ahmedfgad/GeneticAlgorithmPython/issues/323 2. Fix a bug when the `stop_criteria` parameter is passed as an iterable (e.g. list) for multi-objective problems (e.g. `['reach_50_60', 'reach_20, 40']`). https://github.com/ahmedfgad/GeneticAlgorithmPython/issues/314 3. Call the `get_matplotlib()` function from the `plot_genes()` method inside the `pygad.visualize.plot.Plot` class to import the matplotlib library. https://github.com/ahmedfgad/GeneticAlgorithmPython/issues/315 4. Create a new helper method called `select_unique_value()` inside the `pygad/helper/unique.py` script to select a unique gene from an array of values. @@ -598,12 +598,14 @@ Release Date 07 July 2025 11. `filter_gene_values_by_constraint()`: Receives a list of values for a gene. Then it filters such values using the gene constraint. 12. `get_valid_gene_constraint_values()`: Selects one valid gene value that satisfy the gene constraint. It simply calls `generate_gene_value()` to generate some gene values then it filters such values using `filter_gene_values_by_constraint()`. 9. Create a new helper method called `mutation_process_random_value()` inside the `pygad/utils/mutation.py` script that generates constrained random values for mutation. It calls either `generate_gene_value()` or `get_valid_gene_constraint_values()` based on whether the `gene_constraint` parameter is used or not. -10. A new parameter called `gene_constraint` is added. It accepts a list of callables (i.e. functions) acting as constraints for the gene values. Before selecting a value for a gene, the callable is called to ensure the candidate value is valid. Check the [Gene Constraint](https://pygad.readthedocs.io/en/latest/pygad_more.html#gene-constraint) section for more information. +10. A new parameter called `gene_constraint` is added. It accepts a list of callables (i.e. functions) acting as constraints for the gene values. Before selecting a value for a gene, the callable is called to ensure the candidate value is valid. Check the [Gene Constraint](https://pygad.readthedocs.io/en/latest/pygad_more.html#gene-constraint) section for more information. https://github.com/ahmedfgad/GeneticAlgorithmPython/issues/119 11. A new parameter called `sample_size` is added. To select a gene value that respects a constraint, this variable defines the size of the sample from which a value is selected randomly. Useful if either `allow_duplicate_genes` or `gene_constraint` is used. An instance attribute of the same name is created in the instances of the `pygad.GA` class. Check the [sample_size Parameter](https://pygad.readthedocs.io/en/latest/pygad_more.html#sample-size-parameter) section for more information. 12. Use the `sample_size` parameter instead of `num_trials` in the methods `solve_duplicate_genes_randomly()` and `unique_float_gene_from_range()` inside the `pygad/helper/unique.py` script. It is the maximum number of values to generate as the search space when looking for a unique float value out of a range. 13. Fixed a bug in population initialization when `allow_duplicate_genes=False`. Previously, gene values were checked for duplicates before rounding, which could allow near-duplicates like 7.61 and 7.62 to pass. After rounding (e.g., both becoming 7.6), this resulted in unintended duplicates. The fix ensures gene values are now rounded before duplicate checks, preventing such cases. 14. More tests are created. 15. More examples are created. +16. Edited the `sort_solutions_nsga2()` method in the `pygad/utils/nsga2.py` script to accept an optional parameter called `find_best_solution` when calling this method just to find the best solution. +17. Fixed a bug while applying the non-dominated sorting in the `get_non_dominated_set()` method inside the `pygad/utils/nsga2.py` script. It was swapping the non-dominated and dominated sets. In other words, it used the non-dominated set as if it is the dominated set and vice versa. All the calls to this method were edited accordingly. https://github.com/ahmedfgad/GeneticAlgorithmPython/issues/320. # PyGAD Projects at GitHub diff --git a/docs/md/utils.md b/docs/md/utils.md index 6859d97..bf6873f 100644 --- a/docs/md/utils.md +++ b/docs/md/utils.md @@ -190,7 +190,7 @@ It has the following helper methods: The `pygad.utils.nsga2` module has a class named `NSGA2` that implements NSGA-II. The methods inside this class are: 1. `non_dominated_sorting()`: Returns all the pareto fronts by applying non-dominated sorting over the solutions. -2. `get_non_dominated_set()`: Returns the set of non-dominated solutions from the passed solutions. +2. `get_non_dominated_set()`: Returns the 2 sets of non-dominated solutions and dominated solutions from the passed solutions. Note that the Pareto front consists of the solutions in the non-dominated set. 3. `crowding_distance()`: Calculates the crowding distance for all solutions in the current pareto front. 4. `sort_solutions_nsga2()`: Sort the solutions. If the problem is single-objective, then the solutions are sorted by sorting the fitness values of the population. If it is multi-objective, then non-dominated sorting and crowding distance are applied to sort the solutions. diff --git a/example_multi_objective.py b/example_multi_objective.py new file mode 100644 index 0000000..b08db04 --- /dev/null +++ b/example_multi_objective.py @@ -0,0 +1,65 @@ +import pygad +import numpy + +""" +Given these 2 functions: + y1 = f(w1:w6) = w1x1 + w2x2 + w3x3 + w4x4 + w5x5 + 6wx6 + y2 = f(w1:w6) = w1x7 + w2x8 + w3x9 + w4x10 + w5x11 + 6wx12 + where (x1,x2,x3,x4,x5,x6)=(4,-2,3.5,5,-11,-4.7) and y=50 + and (x7,x8,x9,x10,x11,x12)=(-2,0.7,-9,1.4,3,5) and y=30 +What are the best values for the 6 weights (w1 to w6)? We are going to use the genetic algorithm to optimize these 2 functions. +This is a multi-objective optimization problem. + +PyGAD considers the problem as multi-objective if the fitness function returns: + 1) List. + 2) Or tuple. + 3) Or numpy.ndarray. +""" + +function_inputs1 = [4,-2,3.5,5,-11,-4.7] # Function 1 inputs. +function_inputs2 = [-2,0.7,-9,1.4,3,5] # Function 2 inputs. +desired_output1 = 50 # Function 1 output. +desired_output2 = 30 # Function 2 output. + +def fitness_func(ga_instance, solution, solution_idx): + output1 = numpy.sum(solution*function_inputs1) + output2 = numpy.sum(solution*function_inputs2) + fitness1 = 1.0 / (numpy.abs(output1 - desired_output1) + 0.000001) + fitness2 = 1.0 / (numpy.abs(output2 - desired_output2) + 0.000001) + return [fitness1, fitness2] + +num_generations = 1 # Number of generations. +num_parents_mating = 5 # Number of solutions to be selected as parents in the mating pool. + +sol_per_pop = 10 # Number of solutions in the population. +num_genes = len(function_inputs1) + +ga_instance = pygad.GA(num_generations=num_generations, + num_parents_mating=num_parents_mating, + sol_per_pop=sol_per_pop, + num_genes=num_genes, + fitness_func=fitness_func, + random_seed=3, + parent_selection_type='tournament_nsga2') + +# Running the GA to optimize the parameters of the function. +ga_instance.run() + +""" +ga_instance.plot_fitness(label=['Obj 1', 'Obj 2']) +ga_instance.plot_pareto_front_curve() + +# Returning the details of the best solution. +solution, solution_fitness, solution_idx = ga_instance.best_solution(ga_instance.last_generation_fitness) +print(f"Parameters of the best solution : {solution}") +print(f"Fitness value of the best solution = {solution_fitness}") +print(f"Index of the best solution : {solution_idx}") + +prediction = numpy.sum(numpy.array(function_inputs1)*solution) +print(f"Predicted output 1 based on the best solution : {prediction}") +prediction = numpy.sum(numpy.array(function_inputs2)*solution) +print(f"Predicted output 2 based on the best solution : {prediction}") + +if ga_instance.best_solution_generation != -1: + print(f"Best fitness value reached after {ga_instance.best_solution_generation} generations.") +""" diff --git a/pygad/.DS_Store b/pygad/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4ba40964114e92b744e0ed6b1f3469e24b37259e GIT binary patch literal 10244 zcmeI1Pm9w)6u{r~&!(XYJ-B!h0$w~U+FcZO*-NSG!Gjkoim23d8+OCSq%`f8S_-}D z7xGhh61@6R^u0IJl1#dShm|F~DKl>}^WG%$>&&F@6#!IsI@|~F0HA@HWa}0dTN3qC zE~JWSxrb7rJwON(=;P-hj0)P)AOwVf5D)@FKnUCf0{G6R)M#ocr4SGTLSRFH&Ib=O z$&QgLE&1rcf?WWVHEiaDb@T(+#xt^G1eD@~%>>EN=^q+GC&R5R4*_e|K^0X zwbcmba0))=a|mc0%jySi#eT-BikdORMXlV}Mr$xjN9GB>4MtIzPTK9Cs#2}hcO1uc zn$Cybc{1xw{K+)!`r~(W^(slC!Mg4bUWdV~-@5ZOi6?#-2V*t}hXJa*e-p;TWY$fl z@i1lEp6+nnhTCu5T`cyG4)(mmC(Au=adgne>f^)Z(rxVCe{}q^e-V9(lP`<{lsT2) zw!Yq!U$JH;bJ-imQ4*hF3u)KkjIkA9sJGag1)b3>2awE!EGRXGQbh90LbA~-2awHl zEF3$$sUi%f1u)KUnMz23T~m4)=VA_pH<&8r;epv4m{SREI^ej zj@c|0)+q-Jo{EK_fg5MeC(4i`($*V|585ma2cy>st|@w#71orZGw3hc*1hX6#nD2D zAkD8$-niLuGMeT1Dl!wYptx{}NK!=OBbX3ALy(6<8#niJVT(mMAZ?kL1q+v(Bq1OK zgn$qb0@pyGs>k#w{{QUi|NpPy&N8GB5CS)afU2GJPP+Is>nN7}U=(ZjFn`2MiS$-l zvI!O(jz`Jic)Xx+`~%FS+a^f~>m4IkT4D>P|Ndt{DdLLa|MTJjpdhRG{}lWFhj{lN DIQ(ko literal 0 HcmV?d00001 diff --git a/pygad/__pycache__/__init__.cpython-310.pyc b/pygad/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a939de9e2e698a7f89fc506e58abc4558a6692ed GIT binary patch literal 205 zcmd1j<>g`kg6+F^GcG?{L(7F4DurrhF=k1tCtD$dN$i;rK)P{ayU2_}9y=!X^qCG-lIYq X;;_lhPbtkwwF6mS%mO4h7&w>!VCOT1 literal 0 HcmV?d00001 diff --git a/pygad/__pycache__/pygad.cpython-310.pyc b/pygad/__pycache__/pygad.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..817b8d3e75a0ae3a500a183f88295d667bd86cb8 GIT binary patch literal 81308 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 QH~sVO_O7{|LPn1N7oef6g#Z8m literal 0 HcmV?d00001 diff --git a/pygad/helper/__pycache__/__init__.cpython-310.pyc b/pygad/helper/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b92603d2b45f76f85219da6837cef6d3d8aed1e0 GIT binary patch literal 260 zcmYjJK~BRk5VW17sv!A8uerp)6@*#|skaIVxa4A0^(wZA?O;1dffw0_n=;J|0Z(@hGvZuR!EXa+7m-tN|R=&S<6soZ6@;bJyJL>bxz7soTp&K|g@^sorNu^R*D4;DdHnh#%sM6eK!s`CGt% z@09_GulxzZdvpWef`zCLo4#{iM`fO;sGQ~h{rud|h0s<;M1& literal 0 HcmV?d00001 diff --git a/pygad/helper/__pycache__/misc.cpython-310.pyc b/pygad/helper/__pycache__/misc.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4629ff4d45cd0d84f1036d75c785435561ac0a54 GIT binary patch literal 16690 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 literal 0 HcmV?d00001 diff --git a/pygad/helper/__pycache__/unique.cpython-310.pyc b/pygad/helper/__pycache__/unique.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5824dd0b2023a617a6fb353fd1bf84f184a103d GIT binary patch literal 15150 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 literal 0 HcmV?d00001 diff --git a/pygad/utils/__pycache__/__init__.cpython-310.pyc b/pygad/utils/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d759c90d10eaed53530be5207e3626eadf84f7ae GIT binary patch literal 332 zcmYk2F;B!G6vu(Kch$Q~{2E=#sf&X#8jWto#N5I{NFgneLIc#Kei~Q5QdcJ@cPAf> zgOBj%_udQtM{v8{F@pHMRoy$BpDFnt1d?mm;Q~Y=i4E#8!#FVkCX6hc0cR{*I0w#I z4qUK8uAWh~{({@6!t==>yt0u8WmFTjvrs!~ybHm-Di2B7k5T+J3L9E+_EwzM=k@-v zTCvSAwL;co)F$}!GM^>MlN2EHhI6n9;LG_3^6S({@^eoQ0UA_vy^`QT?^Jk+ZlDj! xs;HYA(>kwX*FR0MbCxcH=rV|MuC0!o*TXcIm%WptQCApTL;AWc+TyfI@(W3FR22XK literal 0 HcmV?d00001 diff --git a/pygad/utils/__pycache__/crossover.cpython-310.pyc b/pygad/utils/__pycache__/crossover.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44a88fde75e7912b73cf61d58034dd2747d0da79 GIT binary patch literal 6127 zcmeHLOK;rP6(%`+4QDKmWj&%eaoEOntlE-l_pxw|)J6guDGVb>(k_G+1T~~IlsM%0 z@{VPx9Ke8*rGU2UF04%f{e$dUbl3cV7GQw_ZL)DU-M2;1?_55Hl1F}^?WU~+p1Jq( z+;h)8B){*R8=pF5N%&j&(`Ik~rX+n%o%&w`otwClix8f)DtWS}gz~B^ew9__j^s5w z^<&9X_mtI!r+g?aYP)x>k9xj6*x7KsR!{c@N0N2_}R{y@04ymWnPBWcgVa7;Ym=J?;T2v;xQI~yR-6x#AnHh+w1!t zcDwSfpKS4XuyV(bd>(Xfg&Q#oc(4Ed4)4X$iU`Sy2+2yd+2z4bW;#v~1>AAyaU`@i zRoYhcgcbBuZ2bvm+&)#$Emc52ehTI4wpBTR6!q)WC4$8Ul}zbBOm2z-bYW{ z)IBAYHw{l+kWxkHYWt0m%FVpDC%-HG_*WwhmYSYEl-VOOOA~X*vav6ZbZ+q$mmjxN zo%FWk13ZQWX;0phM+QHY8hhx&D=(GPYUZ5e>7M?HvJTC(k>Ww+y&KZ~%f%cObMB`G z*&3OtIci34aP9FFM$7|cWK?&A_qf}sTgME|Q|G19(>ZC>#QG-otESq5R9m?=as&El zGuNnlS090nw0YWV!n?nq)j?b&_B*uB&_1vmX>%IaSzI%?8n|XXYhV9SgYMsuM%Ku> ze;K25mA=p+eY~KpeeIZLgI-qm*Lc8|UHsh|48p)q>?DXbLVsxx2NAD*K5IVT_Wj5n zxB*M-cpVMqM;u>MY2c$?kl5?PsLO*mvJ*e_yBuGn&D_X~`*v>7<@RR`4+aX*c*81@zug5EV-Tx7+T9#wdDIQbNfEW_j0`&BX^4V_9d4wcV{UKw*1BG zwm^{FYn#V*-{ro&9y5Eu03cmjgVwICQ|^p@t6?Vzc76L2qEncRhW$055JFPvkonxI zU-R|@pAT7d%+;}n*X>)8ExL9$j<}1jw{WR2<&77pMV%3@9LkyI@tuMHMD!Y2BaF8* zwHIvkGL;;@cPO(q6rT_f+&MjT~EKZu+MZit5aP&DTILyn-wk+ZhrFn+lY0~H zWb=8;sp3?I@aY?QNJT(IXilTXFA5xzM)=cSRxTQ!RN{fMZm?HQoB17X<^Gl=3$P#kECPhq9gsX=;2 zD9+@a)GR3O6VQiV&IH97o>38vUiLt7cZ)f+v!4?wf#RBJb7XLZ3yRZ74-|)ercFU{dX3_Uptb9&BKHkOgQ9*~( zM2A0>*_(*YSwvAn`!w1!pg34XYZliWu6bNUcdt~GsDlz)qt^Yq7+t9Jg%0W0C~>Tr zQ(`oU5{VYBC{u8;Jay+#AC(}3FbgD`6V%-9<=Xp{H~iLa7) zlf(rQUn4;k344pgB@&AyzD|PZEGM?hXf3wc6&hF~u}oqGVs*NL%N#xv=jw#9YwQ~| z<0^@3B)&<4Dh~E-5|oYSLICm%-;PUjmHiK)ldM8m7Qyk9+L29VPC)XU)&b}~8cmsNwO0zUIv!KeZ0Z$+(Oidx|(RjmL>npi8C zM}V|mD>wi$suje{XVeN8i(0`1kcL%7P_Gr#W3_@wP+Qarg>_LYn4(rFN1B{=1zk}A zy#-)J)sR|Lt%zFYm+;Tb`;^5~3$XsPnihHVDZ%jst+IajD`KD54}U=GMe7Fw%Zt!| ze*KVZ=3x2oB(NMt0TSze9V>4m(e_;={*-22L0OOkmK_f{rOr8iA|_{ zX!qGmpdFo-ycpW$nmO8i|0J|aP(|Vl0w7c|w8#ysG_X7iA&?WWCBP~MepSdbULAm*_2GhY?!yr_u99`okcY>9LI~hj+1B8f(K~MBx9L*BX{X-d;(HJW>tv} I0j8CI0=vchRsaA1 literal 0 HcmV?d00001 diff --git a/pygad/utils/__pycache__/mutation.cpython-310.pyc b/pygad/utils/__pycache__/mutation.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e69a325f8d799a9f962ef5e2ba684d0694eaa07c GIT binary patch literal 17480 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 literal 0 HcmV?d00001 diff --git a/pygad/utils/__pycache__/parent_selection.cpython-310.pyc b/pygad/utils/__pycache__/parent_selection.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff196e2d06e98c2669cef162e01c086e81faec60 GIT binary patch literal 14992 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 two_solutions[:, 0] gr = two_solutions[:, 1] > two_solutions[:, 0] - # If the 2 conditions hold, then a solution dominates the current solution. - # The current solution is not considered a member of the dominated set. + # If the 2 conditions hold, then a solution (sol2) dominates the current solution (sol1). + # The current solution (sol1) is not considered a member of the non-dominated set. if gr_eq.all() and gr.any(): - # Set the is_dominated flag to False to NOT insert the current solution in the current dominated set. - # Instead, insert it into the non-dominated set. - is_dominated = False - non_dominated_set.append(sol1) + # Set the is_not_dominated flag to False because another solution dominates the current solution (sol1) + is_not_dominated = False + # DO NOT insert the current solution in the current non-dominated set. + # Instead, insert it into the dominated set. + dominated_set.append(sol1) break else: # Reaching here means the solution does not dominate the current solution. pass # If the flag is True, then no solution dominates the current solution. - if is_dominated: - dominated_set.append(sol1) + # Insert the current solution (sol1) into the non-dominated set. + if is_not_dominated: + non_dominated_set.append(sol1) # Return the dominated and non-dominated sets. return dominated_set, non_dominated_set - + def non_dominated_sorting(self, fitness): """ - Apply non-dominant sorting over the fitness to create the pareto fronts based on non-dominaned sorting of the solutions. + Apply non-dominant sorting over the fitness to create the pareto fronts based on non-dominated sorting of the solutions. Parameters ---------- @@ -101,7 +104,6 @@ def non_dominated_sorting(self, fitness): # Each element has: # 1) The index of the solution. # 2) An array of the fitness values of this solution across all objectives. - # remaining_set = numpy.array(list(zip(range(0, fitness.shape[0]), non_dominated_set))) remaining_set = list(zip(range(0, fitness.shape[0]), remaining_set)) # A list mapping the index of each pareto front to the set of solutions in this front. @@ -112,15 +114,15 @@ def non_dominated_sorting(self, fitness): front_index = -1 while len(remaining_set) > 0: front_index += 1 - + # Get the current non-dominated set of solutions. - pareto_front, remaining_set = self.get_non_dominated_set(curr_solutions=remaining_set) + remaining_set, pareto_front = self.get_non_dominated_set(curr_solutions=remaining_set) pareto_front = numpy.array(pareto_front, dtype=object) pareto_fronts.append(pareto_front) solutions_indices = pareto_front[:, 0].astype(int) solutions_fronts_indices[solutions_indices] = front_index - + return pareto_fronts, solutions_fronts_indices def crowding_distance(self, pareto_front, fitness): @@ -200,7 +202,7 @@ def crowding_distance(self, pareto_front, fitness): # Insert the crowding distance back into the list to override the initial zero. obj_sorted[idx][2] = crowding_dist - # Sort the objective by the original index at index 0 of the each child list. + # Sort the objective by the original index at index 0 of each child list. obj_sorted = sorted(obj_sorted, key=lambda x: x[0]) obj_crowding_dist_list.append(obj_sorted) @@ -225,8 +227,10 @@ def crowding_distance(self, pareto_front, fitness): crowding_dist_pop_sorted_indices = crowding_dist_pop_sorted_indices.astype(int) return obj_crowding_dist_list, crowding_dist_sum, crowding_dist_front_sorted_indices, crowding_dist_pop_sorted_indices - - def sort_solutions_nsga2(self, fitness): + + def sort_solutions_nsga2(self, + fitness, + find_best_solution=False): """ Sort the solutions based on the fitness. The sorting procedure differs based on whether the problem is single-objective or multi-objective optimization. @@ -237,9 +241,9 @@ def sort_solutions_nsga2(self, fitness): Parameters ---------- - fitness : TYPE - The fitness of the entire population. - + fitness: The fitness of the entire population. + find_best_solution: Whether the method is called only to find the best solution or as part of the PyGAD lifecycle. This is to decide whether the pareto_fronts instance attribute is edited or not. + Returns ------- solutions_sorted : TYPE @@ -251,7 +255,13 @@ def sort_solutions_nsga2(self, fitness): solutions_sorted = [] # Split the solutions into pareto fronts using non-dominated sorting. pareto_fronts, solutions_fronts_indices = self.non_dominated_sorting(fitness) - self.pareto_fronts = pareto_fronts.copy() + if find_best_solution: + # Do not edit the pareto_fronts instance attribute when just getting the best solution. + pass + else: + # The method is called within the regular GA lifecycle. + # We have to edit the pareto_fronts to be assigned the latest pareto front. + self.pareto_fronts = pareto_fronts.copy() for pareto_front in pareto_fronts: # Sort the solutions in the front using crowded distance. _, _, _, crowding_dist_pop_sorted_indices = self.crowding_distance(pareto_front=pareto_front.copy(), @@ -264,5 +274,7 @@ def sort_solutions_nsga2(self, fitness): solutions_sorted = sorted(range(len(fitness)), key=lambda k: fitness[k]) # Reverse the sorted solutions so that the best solution comes first. solutions_sorted.reverse() - + else: + raise TypeError(f'Each element in the fitness array must be of a number of an iterable (list, tuple, numpy.ndarray). But the type {type(fitness[0])} found') + return solutions_sorted diff --git a/pygad/utils/parent_selection.py b/pygad/utils/parent_selection.py index ac293c2..3ea4577 100644 --- a/pygad/utils/parent_selection.py +++ b/pygad/utils/parent_selection.py @@ -107,7 +107,7 @@ def tournament_selection(self, fitness, num_parents): """ Selects the parents using the tournament selection technique. Later, these parents will mate to produce the offspring. - It accepts 2 parameters: + It accepts: -fitness: The fitness values of the solutions in the current population. -num_parents: The number of parents to be selected. It returns: @@ -127,10 +127,8 @@ def tournament_selection(self, fitness, num_parents): parents_indices = [] for parent_num in range(num_parents): - # Generate random indices for the candiadate solutions. - rand_indices = numpy.random.randint(low=0.0, high=len(fitness), size=self.K_tournament) - # K_fitnesses = fitness[rand_indices] - # selected_parent_idx = numpy.where(K_fitnesses == numpy.max(K_fitnesses))[0][0] + # Generate random indices for the candidate solutions. + rand_indices = numpy.random.randint(low=0, high=len(fitness), size=self.K_tournament) # Find the rank of the candidate solutions. The lower the rank, the better the solution. rand_indices_rank = [fitness_sorted.index(rand_idx) for rand_idx in rand_indices] @@ -275,8 +273,6 @@ def stochastic_universal_selection(self, fitness, num_parents): probs_start[min_probs_idx] = curr curr = curr + probs[min_probs_idx] probs_end[min_probs_idx] = curr - # Replace 99999999999 by float('inf') - # probs[min_probs_idx] = 99999999999 probs[min_probs_idx] = float('inf') pointers_distance = 1.0 / self.num_parents_mating # Distance between different pointers. @@ -304,8 +300,7 @@ def stochastic_universal_selection(self, fitness, num_parents): def tournament_selection_nsga2(self, fitness, - num_parents - ): + num_parents): """ Select the parents using the tournament selection technique for NSGA-II. @@ -347,85 +342,97 @@ def tournament_selection_nsga2(self, self.pareto_fronts = pareto_fronts.copy() # Randomly generate pairs of indices to apply for NSGA-II tournament selection for selecting the parents solutions. - rand_indices = numpy.random.randint(low=0.0, + rand_indices = numpy.random.randint(low=0, high=len(solutions_fronts_indices), size=(num_parents, self.K_tournament)) - + for parent_num in range(num_parents): # Return the indices of the current 2 solutions. current_indices = rand_indices[parent_num] # Return the front index of the 2 solutions. parent_fronts_indices = solutions_fronts_indices[current_indices] - - if parent_fronts_indices[0] < parent_fronts_indices[1]: - # If the first solution is in a lower pareto front than the second, then select it. - selected_parent_idx = current_indices[0] - elif parent_fronts_indices[0] > parent_fronts_indices[1]: - # If the second solution is in a lower pareto front than the first, then select it. - selected_parent_idx = current_indices[1] + parent_fronts_indices_unique = numpy.unique(parent_fronts_indices) + + # Here are the possible cases: + # 1) All the solutions are in the same front (e.g. [0, 0, 0, 0]). Select a solution randomly. + # 2) Each solution is in a different front but there is only one solution in the pareto front with the lowest index (e.g. [0, 1, 2, 3]). Use the solution in the best front (lower front index). + # 3) The solutions are split into groups in different pareto fronts and there are more than one solution in the pareto front with the lowest index (e.g. [0, 0, 1, 1]). Filter the solutions in the lowest rank pareto front and randomly select a solution from this filtered list. + + # If no single solution found, then store the unique solutions indices. + current_indices_unique = None + # If a single solution found, store its index here. + selected_parent_index = None + # The pareto front where the filtered solutions exists. + selected_pareto_front_index = None + if len(parent_fronts_indices_unique) == 1: + # CASE 1 + # There are multiple solutions at the same front. + # Use crowding distance to select a solution. + selected_pareto_front_index = parent_fronts_indices_unique[0] + current_indices_unique = numpy.unique(current_indices[parent_fronts_indices == selected_pareto_front_index]) else: - # The 2 solutions are in the same pareto front. + best_pareto_front = min(parent_fronts_indices_unique) + best_pareto_front_count = list(parent_fronts_indices).count(best_pareto_front) + if best_pareto_front_count == 1: + # CASE 2 + #### DONE + # Use the single solution at the best pareto front directly as parent. + selected_parent_index = current_indices[parent_fronts_indices == best_pareto_front][0] + else: + # CASE 3 + current_indices_unique = numpy.unique(current_indices[parent_fronts_indices == best_pareto_front]) + if len(current_indices_unique) == 1: + #### DONE + # There is only one solution in the best pareto front. Just select it as a parent. + # The same solution index was randomly generated more than once using the numpy.random.randint() + selected_parent_index = current_indices_unique[0] + else: + # There are different solutions at the same front. + # Use crowding distance to select a solution. + selected_pareto_front_index = best_pareto_front + + if selected_parent_index is not None: + pass + else: + # Use crowding distance to select between 1 or more solutions within the same pareto front. # The selection is made using the crowding distance. - - # A list holding the crowding distance of the current 2 solutions. It is initialized to -1. - solutions_crowding_distance = [-1, -1] - + # If more than 1 solution has the same crowding distance, select a solution randomly. + # Fetch the current pareto front. - pareto_front = pareto_fronts[parent_fronts_indices[0]] # Index 1 can also be used. + pareto_front = pareto_fronts[selected_pareto_front_index] # If there is only 1 solution in the pareto front, just return it without calculating the crowding distance (it is useless). if pareto_front.shape[0] == 1: - selected_parent_idx = current_indices[0] # Index 1 can also be used. + selected_parent_index = current_indices[0] # Index 1 can also be used. else: - # Reaching here means the pareto front has more than 1 solution. - + # Reaching here means the selected pareto front has more than 1 solution. # Calculate the crowding distance of the solutions of the pareto front. obj_crowding_distance_list, crowding_distance_sum, crowding_dist_front_sorted_indices, crowding_dist_pop_sorted_indices = self.crowding_distance(pareto_front=pareto_front.copy(), - fitness=fitness) - - # This list has the sorted front-based indices for the solutions in the current pareto front. - crowding_dist_front_sorted_indices = list(crowding_dist_front_sorted_indices) + fitness=fitness) # This list has the sorted population-based indices for the solutions in the current pareto front. crowding_dist_pop_sorted_indices = list(crowding_dist_pop_sorted_indices) - - # Return the indices of the solutions from the pareto front. - solution1_idx = crowding_dist_pop_sorted_indices.index(current_indices[0]) - solution2_idx = crowding_dist_pop_sorted_indices.index(current_indices[1]) - + + # Return the indices of the solutions from the pareto front based on the crowding distance. + # If there is more than one solution, select the solution that has a better crowding distance. + # This solution comes first in the order in the crowding_dist_pop_sorted_indices list. + solutions_indices = [crowding_dist_pop_sorted_indices.index(rand_sol_idx) for rand_sol_idx in current_indices_unique] + # Fetch the crowding distance using the indices. - solutions_crowding_distance[0] = crowding_distance_sum[solution1_idx][1] - solutions_crowding_distance[1] = crowding_distance_sum[solution2_idx][1] - - # # Instead of using the crowding distance, we can select the solution that comes first in the list. - # # Its limitation is that it is biased towards the low indexed solution if the 2 solutions have the same crowding distance. - # if solution1_idx < solution2_idx: - # # Select the first solution if it has higher crowding distance. - # selected_parent_idx = current_indices[0] - # else: - # # Select the second solution if it has higher crowding distance. - # selected_parent_idx = current_indices[1] - - if solutions_crowding_distance[0] > solutions_crowding_distance[1]: - # Select the first solution if it has higher crowding distance. - selected_parent_idx = current_indices[0] - elif solutions_crowding_distance[1] > solutions_crowding_distance[0]: - # Select the second solution if it has higher crowding distance. - selected_parent_idx = current_indices[1] + solutions_crowding_distance = [crowding_distance_sum[rand_sol_idx][1] for rand_sol_idx in solutions_indices] + max_crowding_distance = max(solutions_crowding_distance) + + if solutions_crowding_distance.count(max_crowding_distance) == 1: + # There is only a single solution with the maximum crowding distance. Just select it. + selected_parent_index = current_indices_unique[solutions_crowding_distance.index(max_crowding_distance)] else: - # If the crowding distance is equal, select the parent randomly. - rand_num = numpy.random.uniform() - if rand_num < 0.5: - # If the random number is < 0.5, then select the first solution. - selected_parent_idx = current_indices[0] - else: - # If the random number is >= 0.5, then select the second solution. - selected_parent_idx = current_indices[1] + # If the crowding distance is equal across multiple solutions, select a solution randomly as a parent. + selected_parent_index = numpy.random.choice(current_indices_unique) # Insert the selected parent index. - parents_indices.append(selected_parent_idx) + parents_indices.append(selected_parent_index) # Insert the selected parent. - parents[parent_num, :] = self.population[selected_parent_idx, :].copy() - + parents[parent_num, :] = self.population[selected_parent_index, :].copy() + # Make sure the parents indices is returned as a NumPy array. return parents, numpy.array(parents_indices) diff --git a/pygad/visualize/__pycache__/__init__.cpython-310.pyc b/pygad/visualize/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..473b3f831e39a308d92cef5e00424e43e5c2b1cb GIT binary patch literal 237 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 literal 0 HcmV?d00001 diff --git a/pygad/visualize/plot.py b/pygad/visualize/plot.py index ab6bd25..623c0d9 100644 --- a/pygad/visualize/plot.py +++ b/pygad/visualize/plot.py @@ -455,11 +455,12 @@ def plot_pareto_front_curve(self, # Plot the pareto front curve. remaining_set = list(zip(range(0, self.last_generation_fitness.shape[0]), self.last_generation_fitness)) + # The non-dominated set is the pareto front set. dominated_set, non_dominated_set = self.get_non_dominated_set(remaining_set) # Extract the fitness values (objective values) of the non-dominated solutions for plotting. - pareto_front_x = [self.last_generation_fitness[item[0]][0] for item in dominated_set] - pareto_front_y = [self.last_generation_fitness[item[0]][1] for item in dominated_set] + pareto_front_x = [self.last_generation_fitness[item[0]][0] for item in non_dominated_set] + pareto_front_y = [self.last_generation_fitness[item[0]][1] for item in non_dominated_set] # Sort the Pareto front solutions (optional but can make the plot cleaner) sorted_pareto_front = sorted(zip(pareto_front_x, pareto_front_y)) From 9ac72f63e0d60106e37372e8b50029e760a1e971 Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Tue, 8 Jul 2025 21:44:32 -0400 Subject: [PATCH 2/2] Clean repo --- .DS_Store | Bin 8196 -> 0 bytes docs/.DS_Store | Bin 6148 -> 0 bytes pygad/.DS_Store | Bin 10244 -> 0 bytes pygad/__pycache__/__init__.cpython-310.pyc | Bin 205 -> 0 bytes pygad/__pycache__/pygad.cpython-310.pyc | Bin 81308 -> 0 bytes .../helper/__pycache__/__init__.cpython-310.pyc | Bin 260 -> 0 bytes pygad/helper/__pycache__/misc.cpython-310.pyc | Bin 16690 -> 0 bytes pygad/helper/__pycache__/unique.cpython-310.pyc | Bin 15150 -> 0 bytes .../utils/__pycache__/__init__.cpython-310.pyc | Bin 332 -> 0 bytes .../utils/__pycache__/crossover.cpython-310.pyc | Bin 6127 -> 0 bytes .../utils/__pycache__/mutation.cpython-310.pyc | Bin 17480 -> 0 bytes pygad/utils/__pycache__/nsga2.cpython-310.pyc | Bin 7658 -> 0 bytes .../parent_selection.cpython-310.pyc | Bin 14992 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 237 -> 0 bytes .../visualize/__pycache__/plot.cpython-310.pyc | Bin 13830 -> 0 bytes 15 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store delete mode 100644 docs/.DS_Store delete mode 100644 pygad/.DS_Store delete mode 100644 pygad/__pycache__/__init__.cpython-310.pyc delete mode 100644 pygad/__pycache__/pygad.cpython-310.pyc delete mode 100644 pygad/helper/__pycache__/__init__.cpython-310.pyc delete mode 100644 pygad/helper/__pycache__/misc.cpython-310.pyc delete mode 100644 pygad/helper/__pycache__/unique.cpython-310.pyc delete mode 100644 pygad/utils/__pycache__/__init__.cpython-310.pyc delete mode 100644 pygad/utils/__pycache__/crossover.cpython-310.pyc delete mode 100644 pygad/utils/__pycache__/mutation.cpython-310.pyc delete mode 100644 pygad/utils/__pycache__/nsga2.cpython-310.pyc delete mode 100644 pygad/utils/__pycache__/parent_selection.cpython-310.pyc delete mode 100644 pygad/visualize/__pycache__/__init__.cpython-310.pyc delete mode 100644 pygad/visualize/__pycache__/plot.cpython-310.pyc diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 2f034958172052b7a3bef5fd41e0e5c179f3d3b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHML2nyH6n-yFVsAs6ZR(_fMUqJN00Q`yFPaTsG{(@T!!TeNFbo(53b#F-|d1o71=>;Ur739B8S{0kt_`yfVfa3aZt~&QWl{l9r}53>XH+8IZaAEUd#Z zMDQe&ze`v8nCjiXRZ+&%&>~b5!bF}galcN&HTq#U{ypHwM%VYkXm#~>oH{o>Gn>m< zxw+iq$`jGAL~hgz%Wm*cK2?SA8$;b~?0KwTw+rinN3O?NpbWegBgmr%9&d?$S@d`- zRJIj8U|D&qZeKY$xq0W-b!YAN>2>Gi&aG8a-&;F9wepL_8+Ui>&-@M-U#pD)#*qas z=;u-U4QZooA65eH3*M$aiO&OrBXFSuUGPcI(1QDfNzyllKO6LnZ7V}l4(`Jiow7~% z1S+tZK0Ej_L(&Y9c?@l$wUtIrvB}7@L1bdvFqfm^K)-qxHxZL zTDV+TSX@|IDlA=DUV8iLJ6G%W<%ZjQ)()gotP5WRWxvNBwgazK>AFpiw`&nQiYnf7 zR<{>2&|TL0{8d-=xJ#JAs}42Y2LWST&9{AU5VEM2(Dy%ckE)~D=fh?oe1AuTUgQbB z|0pEy-ilafiysJD{E$3*yDNvnJr;x{>vqPbw(kak%iFAc{MdIJ%-`l^5k;a?^O}O| zP0Xul>2W7ua?0ZSf6_srQY?KmR93WNLs2W_yM>_^ORRFinN=+9=?;tB`&~M<+fXA1 ze*xdZckn&@06)QR@CW>bvsl1ucmvn)9)5`T@l)KxHu~7XLp{ONFr-{duY`SiPJHT& zw_H@`zY76H+NTs$niQK?s0w-uKkX4JKL4DE&lc>Gm)(O68rdYPPS%H1q)u9#Pg#8R zIvW|ru%1}OrgvlTCG@~kT8ExEybVcqqgO?E@iJu`X z1y{L38mS_}1mszX2&1iMj)@IbB2XTSfIfpu_m2ZR$wQN-N*e{=Hh z{~Bdl!+>GnOfrDe8>?s@@0^hV(}KobBgRKog4Y+ewGlP*b3dnhRQ z8DAg(ABv+yo-bt^hhe}l@YWbmi+g~p_8KCXTfadf1AJN97>-f9Pb~cU7J5|v1;mg* zMC*Mn|9&CA1_KDIIpXo9oM4;}^>glmVG`#>yZs<)EANXxwkEf0Jq9$7z&tK^#Vy^6O`uhH~7KqcqI9)>8r7w(Nd$b28cP z?6jQyy=lvtbavWk?(R>gwzcv3YxksooeWZW!vui9?T+P>#u?nA!PEWgWoaVQOYBqb zD&!zx1R0z!(j`tYK2L8Y_kB=OnbHC^IC~?n!hrsWt+iJf-3)3NFbuq9255h9Pzha) zr9$31u;D8JVjbNqXwxqP)i@emjio}2pa@lps7i&tVhB}^en;oI8cT($9E84n2tBgU zHx$96GnT`?f)2i`#sr=-u;rODA* u>!AKYC84}hA(vpIk7G9IDBeP4!I(n^qN}k~h#nO4BfvD6#xU?-8F&Wa=C+Oi diff --git a/pygad/.DS_Store b/pygad/.DS_Store deleted file mode 100644 index 4ba40964114e92b744e0ed6b1f3469e24b37259e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeI1Pm9w)6u{r~&!(XYJ-B!h0$w~U+FcZO*-NSG!Gjkoim23d8+OCSq%`f8S_-}D z7xGhh61@6R^u0IJl1#dShm|F~DKl>}^WG%$>&&F@6#!IsI@|~F0HA@HWa}0dTN3qC zE~JWSxrb7rJwON(=;P-hj0)P)AOwVf5D)@FKnUCf0{G6R)M#ocr4SGTLSRFH&Ib=O z$&QgLE&1rcf?WWVHEiaDb@T(+#xt^G1eD@~%>>EN=^q+GC&R5R4*_e|K^0X zwbcmba0))=a|mc0%jySi#eT-BikdORMXlV}Mr$xjN9GB>4MtIzPTK9Cs#2}hcO1uc zn$Cybc{1xw{K+)!`r~(W^(slC!Mg4bUWdV~-@5ZOi6?#-2V*t}hXJa*e-p;TWY$fl z@i1lEp6+nnhTCu5T`cyG4)(mmC(Au=adgne>f^)Z(rxVCe{}q^e-V9(lP`<{lsT2) zw!Yq!U$JH;bJ-imQ4*hF3u)KkjIkA9sJGag1)b3>2awE!EGRXGQbh90LbA~-2awHl zEF3$$sUi%f1u)KUnMz23T~m4)=VA_pH<&8r;epv4m{SREI^ej zj@c|0)+q-Jo{EK_fg5MeC(4i`($*V|585ma2cy>st|@w#71orZGw3hc*1hX6#nD2D zAkD8$-niLuGMeT1Dl!wYptx{}NK!=OBbX3ALy(6<8#niJVT(mMAZ?kL1q+v(Bq1OK zgn$qb0@pyGs>k#w{{QUi|NpPy&N8GB5CS)afU2GJPP+Is>nN7}U=(ZjFn`2MiS$-l zvI!O(jz`Jic)Xx+`~%FS+a^f~>m4IkT4D>P|Ndt{DdLLa|MTJjpdhRG{}lWFhj{lN DIQ(ko diff --git a/pygad/__pycache__/__init__.cpython-310.pyc b/pygad/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index a939de9e2e698a7f89fc506e58abc4558a6692ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205 zcmd1j<>g`kg6+F^GcG?{L(7F4DurrhF=k1tCtD$dN$i;rK)P{ayU2_}9y=!X^qCG-lIYq X;;_lhPbtkwwF6mS%mO4h7&w>!VCOT1 diff --git a/pygad/__pycache__/pygad.cpython-310.pyc b/pygad/__pycache__/pygad.cpython-310.pyc deleted file mode 100644 index 817b8d3e75a0ae3a500a183f88295d667bd86cb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81308 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 QH~sVO_O7{|LPn1N7oef6g#Z8m diff --git a/pygad/helper/__pycache__/__init__.cpython-310.pyc b/pygad/helper/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index b92603d2b45f76f85219da6837cef6d3d8aed1e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 zcmYjJK~BRk5VW17sv!A8uerp)6@*#|skaIVxa4A0^(wZA?O;1dffw0_n=;J|0Z(@hGvZuR!EXa+7m-tN|R=&S<6soZ6@;bJyJL>bxz7soTp&K|g@^sorNu^R*D4;DdHnh#%sM6eK!s`CGt% z@09_GulxzZdvpWef`zCLo4#{iM`fO;sGQ~h{rud|h0s<;M1& diff --git a/pygad/helper/__pycache__/misc.cpython-310.pyc b/pygad/helper/__pycache__/misc.cpython-310.pyc deleted file mode 100644 index 4629ff4d45cd0d84f1036d75c785435561ac0a54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16690 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 diff --git a/pygad/helper/__pycache__/unique.cpython-310.pyc b/pygad/helper/__pycache__/unique.cpython-310.pyc deleted file mode 100644 index a5824dd0b2023a617a6fb353fd1bf84f184a103d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15150 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 diff --git a/pygad/utils/__pycache__/__init__.cpython-310.pyc b/pygad/utils/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index d759c90d10eaed53530be5207e3626eadf84f7ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmYk2F;B!G6vu(Kch$Q~{2E=#sf&X#8jWto#N5I{NFgneLIc#Kei~Q5QdcJ@cPAf> zgOBj%_udQtM{v8{F@pHMRoy$BpDFnt1d?mm;Q~Y=i4E#8!#FVkCX6hc0cR{*I0w#I z4qUK8uAWh~{({@6!t==>yt0u8WmFTjvrs!~ybHm-Di2B7k5T+J3L9E+_EwzM=k@-v zTCvSAwL;co)F$}!GM^>MlN2EHhI6n9;LG_3^6S({@^eoQ0UA_vy^`QT?^Jk+ZlDj! xs;HYA(>kwX*FR0MbCxcH=rV|MuC0!o*TXcIm%WptQCApTL;AWc+TyfI@(W3FR22XK diff --git a/pygad/utils/__pycache__/crossover.cpython-310.pyc b/pygad/utils/__pycache__/crossover.cpython-310.pyc deleted file mode 100644 index 44a88fde75e7912b73cf61d58034dd2747d0da79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6127 zcmeHLOK;rP6(%`+4QDKmWj&%eaoEOntlE-l_pxw|)J6guDGVb>(k_G+1T~~IlsM%0 z@{VPx9Ke8*rGU2UF04%f{e$dUbl3cV7GQw_ZL)DU-M2;1?_55Hl1F}^?WU~+p1Jq( z+;h)8B){*R8=pF5N%&j&(`Ik~rX+n%o%&w`otwClix8f)DtWS}gz~B^ew9__j^s5w z^<&9X_mtI!r+g?aYP)x>k9xj6*x7KsR!{c@N0N2_}R{y@04ymWnPBWcgVa7;Ym=J?;T2v;xQI~yR-6x#AnHh+w1!t zcDwSfpKS4XuyV(bd>(Xfg&Q#oc(4Ed4)4X$iU`Sy2+2yd+2z4bW;#v~1>AAyaU`@i zRoYhcgcbBuZ2bvm+&)#$Emc52ehTI4wpBTR6!q)WC4$8Ul}zbBOm2z-bYW{ z)IBAYHw{l+kWxkHYWt0m%FVpDC%-HG_*WwhmYSYEl-VOOOA~X*vav6ZbZ+q$mmjxN zo%FWk13ZQWX;0phM+QHY8hhx&D=(GPYUZ5e>7M?HvJTC(k>Ww+y&KZ~%f%cObMB`G z*&3OtIci34aP9FFM$7|cWK?&A_qf}sTgME|Q|G19(>ZC>#QG-otESq5R9m?=as&El zGuNnlS090nw0YWV!n?nq)j?b&_B*uB&_1vmX>%IaSzI%?8n|XXYhV9SgYMsuM%Ku> ze;K25mA=p+eY~KpeeIZLgI-qm*Lc8|UHsh|48p)q>?DXbLVsxx2NAD*K5IVT_Wj5n zxB*M-cpVMqM;u>MY2c$?kl5?PsLO*mvJ*e_yBuGn&D_X~`*v>7<@RR`4+aX*c*81@zug5EV-Tx7+T9#wdDIQbNfEW_j0`&BX^4V_9d4wcV{UKw*1BG zwm^{FYn#V*-{ro&9y5Eu03cmjgVwICQ|^p@t6?Vzc76L2qEncRhW$055JFPvkonxI zU-R|@pAT7d%+;}n*X>)8ExL9$j<}1jw{WR2<&77pMV%3@9LkyI@tuMHMD!Y2BaF8* zwHIvkGL;;@cPO(q6rT_f+&MjT~EKZu+MZit5aP&DTILyn-wk+ZhrFn+lY0~H zWb=8;sp3?I@aY?QNJT(IXilTXFA5xzM)=cSRxTQ!RN{fMZm?HQoB17X<^Gl=3$P#kECPhq9gsX=;2 zD9+@a)GR3O6VQiV&IH97o>38vUiLt7cZ)f+v!4?wf#RBJb7XLZ3yRZ74-|)ercFU{dX3_Uptb9&BKHkOgQ9*~( zM2A0>*_(*YSwvAn`!w1!pg34XYZliWu6bNUcdt~GsDlz)qt^Yq7+t9Jg%0W0C~>Tr zQ(`oU5{VYBC{u8;Jay+#AC(}3FbgD`6V%-9<=Xp{H~iLa7) zlf(rQUn4;k344pgB@&AyzD|PZEGM?hXf3wc6&hF~u}oqGVs*NL%N#xv=jw#9YwQ~| z<0^@3B)&<4Dh~E-5|oYSLICm%-;PUjmHiK)ldM8m7Qyk9+L29VPC)XU)&b}~8cmsNwO0zUIv!KeZ0Z$+(Oidx|(RjmL>npi8C zM}V|mD>wi$suje{XVeN8i(0`1kcL%7P_Gr#W3_@wP+Qarg>_LYn4(rFN1B{=1zk}A zy#-)J)sR|Lt%zFYm+;Tb`;^5~3$XsPnihHVDZ%jst+IajD`KD54}U=GMe7Fw%Zt!| ze*KVZ=3x2oB(NMt0TSze9V>4m(e_;={*-22L0OOkmK_f{rOr8iA|_{ zX!qGmpdFo-ycpW$nmO8i|0J|aP(|Vl0w7c|w8#ysG_X7iA&?WWCBP~MepSdbULAm*_2GhY?!yr_u99`okcY>9LI~hj+1B8f(K~MBx9L*BX{X-d;(HJW>tv} I0j8CI0=vchRsaA1 diff --git a/pygad/utils/__pycache__/mutation.cpython-310.pyc b/pygad/utils/__pycache__/mutation.cpython-310.pyc deleted file mode 100644 index e69a325f8d799a9f962ef5e2ba684d0694eaa07c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17480 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 diff --git a/pygad/utils/__pycache__/parent_selection.cpython-310.pyc b/pygad/utils/__pycache__/parent_selection.cpython-310.pyc deleted file mode 100644 index ff196e2d06e98c2669cef162e01c086e81faec60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14992 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