Releases: ahmedfgad/GeneticAlgorithmPython
Releases · ahmedfgad/GeneticAlgorithmPython
PyGAD-2.18.3
Update conf.py
PyGAD-2.18.2
PyGAD-2.18.1
PyGAD 2.18.1
- A big fix when
keep_elitismis used. #132
PyGAD-2.18.0
- Raise an exception if the sum of fitness values is zero while either roulette wheel or stochastic universal parent selection is used. #129
- Initialize the value of the
run_completedproperty toFalse. #122 - The values of these properties are no longer reset with each call to the
run()methodself.best_solutions, self.best_solutions_fitness, self.solutions, self.solutions_fitness: #123. Now, the user can have the flexibility of calling therun()method more than once while extending the data collected after each generation. Another advantage happens when the instance is loaded and therun()method is called, as the old fitness value are shown on the graph alongside with the new fitness values. Read more in this section: [Continue without Loosing Progress](https://pygad.readthedocs.io/en/latest/README_pygad_ReadTheDocs.html#continue-without-loosing-progress) - Thanks [Prof. Fernando Jiménez Barrionuevo](http://webs.um.es/fernan) (Dept. of Information and Communications Engineering, University of Murcia, Murcia, Spain) for editing this [comment](https://github.com/ahmedfgad/GeneticAlgorithmPython/blob/5315bbec02777df96ce1ec665c94dece81c440f4/pygad.py#L73) in the code. 5315bbe
- A bug fixed when
crossover_type=None. - Support of elitism selection through a new parameter named
keep_elitism. It defaults to 1 which means for each generation keep only the best solution in the next generation. If assigned 0, then it has no effect. Read more in this section: [Elitism Selection](https://pygad.readthedocs.io/en/latest/README_pygad_ReadTheDocs.html#elitism-selection). #74 - A new instance attribute named
last_generation_elitismadded to hold the elitism in the last generation. - A new parameter called
random_seedadded to accept a seed for the random function generators. Credit to this issue #70 and [Prof. Fernando Jiménez Barrionuevo](http://webs.um.es/fernan). Read more in this section: [Random Seed](https://pygad.readthedocs.io/en/latest/README_pygad_ReadTheDocs.html#random-seed). - Editing the
pygad.TorchGAmodule to make sure the tensor data is moved from GPU to CPU. Thanks to Rasmus Johansson for opening this pull request: ahmedfgad/TorchGA#2
PyGAD-2.17.0
PyGAD 2.17.0
Release Date: 8 July 2022
- An issue is solved when the
gene_spaceparameter is given a fixed value. e.g. gene_space=[range(5), 4]. The second gene's value is static (4) which causes an exception. - Fixed the issue where the
allow_duplicate_genesparameter did not work when mutation is disabled (i.e.mutation_type=None). This is by checking for duplicates after crossover directly. #39 - Solve an issue in the
tournament_selection()method as the indices of the selected parents were incorrect. #89 - Reuse the fitness values of the previously explored solutions rather than recalculating them. This feature only works if
save_solutions=True. - Parallel processing is supported. This is by the introduction of a new parameter named
parallel_processingin the constructor of thepygad.GAclass. Thanks to [@windowshopr](https://github.com/windowshopr) for opening the issue [#78](#78) at GitHub. Check the [Parallel Processing in PyGAD](https://pygad.readthedocs.io/en/latest/README_pygad_ReadTheDocs.html#parallel-processing-in-pygad) section for more information and examples.
PyGAD-2.16.3
Changes in PyGAD 2.16.3
- A new instance attribute called
previous_generation_fitnessadded in thepygad.GAclass. It holds the fitness values of one generation before the fitness values saved in thelast_generation_fitness. - Issue in the
cal_pop_fitness()method in getting the correct indices of the previous parents. This is solved by using the previous generation's fitness saved in the new attributeprevious_generation_fitnessto return the parents' fitness values. Thanks to Tobias Tischhauser (M.Sc. - [Mitarbeiter Institut EMS, Departement Technik, OST – Ostschweizer Fachhochschule, Switzerland](https://www.ost.ch/de/forschung-und-dienstleistungen/technik/systemtechnik/ems/team)) for detecting this bug. - Validate the fitness value returned from the fitness function. An exception is raised if something is wrong. #67
PyGAD-2.16.1
- Reuse the fitness of previously explored solutions rather than recalculating them. This feature only works if
save_solutions=True. - The user can use the
tqdmlibrary to show a progress bar. #50
import pygad
import numpy
import tqdm
equation_inputs = [4,-2,3.5]
desired_output = 44
def fitness_func(solution, solution_idx):
output = numpy.sum(solution * equation_inputs)
fitness = 1.0 / (numpy.abs(output - desired_output) + 0.000001)
return fitness
num_generations = 10000
with tqdm.tqdm(total=num_generations) as pbar:
ga_instance = pygad.GA(num_generations=num_generations,
sol_per_pop=5,
num_parents_mating=2,
num_genes=len(equation_inputs),
fitness_func=fitness_func,
on_generation=lambda _: pbar.update(1))
ga_instance.run()
ga_instance.plot_result()- Solved the issue of unequal length between the
solutionsandsolutions_fitnesswhen thesave_solutionsparameter is set toTrue. Now, the fitness of the last population is appended to thesolutions_fitnessarray. #64 - There was an issue of getting the length of these 4 variables (
solutions,solutions_fitness,best_solutions, andbest_solutions_fitness) doubled after each call of therun()method. This is solved by resetting these variables at the beginning of therun()method. #62 - Bug fixes when adaptive mutation is used (
mutation_type="adaptive"). #65
PyGAD-2.16.0
A user-defined function can be passed to the mutation_type, crossover_type, and parent_selection_type parameters in the pygad.GA class to create a custom mutation, crossover, and parent selection operators. Check the User-Defined Crossover, Mutation, and Parent Selection Operators section in the documentation: https://pygad.readthedocs.io/en/latest/README_pygad_ReadTheDocs.html#user-defined-crossover-mutation-and-parent-selection-operators
The example_custom_operators.py script gives an example of building and using custom functions for the 3 operators.
#50
PyGAD-2.15.1
Fix a bug when keep_parents is set to a positive integer. #49
PyGAD-2.15.0
- Control the precision of all genes/individual genes. Thanks to Rainer for asking about this feature: #43 (comment)
- A new attribute named
last_generation_parents_indicesholds the indices of the selected parents in the last generation. - In adaptive mutation, no need to recalculate the fitness values of the parents selected in the last generation as these values can be returned based on the
last_generation_fitnessandlast_generation_parents_indicesattributes. This speeds-up the adaptive mutation. - When a sublist has a value of
Nonein thegene_spaceparameter (e.g.gene_space=[[1, 2, 3], [5, 6, None]]), then its value will be randomly generated for each solution rather than being generated once for all solutions. Previously, a value ofNonein a sublist of thegene_spaceparameter was identical across all solutions. - The dictionary assigned to the
gene_spaceparameter itself or one of its elements has a new key called"step"to specify the step of moving from the start to the end of the range specified by the 2 existing keys"low"and"high". An example is{"low": 0, "high": 30, "step": 2}to have only even values for the gene(s) starting from 0 to 30. For more information, check the More about thegene_spaceParameter section. #48 - A new function called
predict()is added in both thepygad.kerasgaandpygad.torchgamodules to make predictions. This makes it easier than using custom code each time a prediction is to be made. - A new parameter called
stop_criteriaallows the user to specify one or more stop criteria to stop the evolution based on some conditions. Each criterion is passed asstrwhich has a stop word. The current 2 supported words arereachandsaturate.reachstops therun()method if the fitness value is equal to or greater than a given fitness value. An example forreachis"reach_40"which stops the evolution if the fitness is >= 40.saturatemeans stop the evolution if the fitness saturates for a given number of consecutive generations. An example forsaturateis"saturate_7"which means stop therun()method if the fitness does not change for 7 consecutive generations. Thanks to Rainer for asking about this feature: #44 - A new bool parameter, defaults to
False, namedsave_solutionsis added to the constructor of thepygad.GAclass. IfTrue, then all solutions in each generation are appended into an attribute calledsolutionswhich is NumPy array. - The
plot_result()method is renamed toplot_fitness(). The users should migrate to the new name as the old name will be removed in the future. - Four new optional parameters are added to the
plot_fitness()function in thepygad.GAclass which arefont_size=14,save_dir=None,color="#3870FF", andplot_type="plot". Usefont_sizeto change the font of the plot title and labels.save_diraccepts the directory to which the figure is saved. It defaults toNonewhich means do not save the figure.colorchanges the color of the plot.plot_typechanges the plot type which can be either"plot"(default),"scatter", or"bar". #47 - The default value of the
titleparameter in theplot_fitness()method is"PyGAD - Generation vs. Fitness"rather than"PyGAD - Iteration vs. Fitness". - A new method named
plot_new_solution_rate()creates, shows, and returns a figure showing the rate of new/unique solutions explored in each generation. It accepts the same parameters as in theplot_fitness()method. This method only works whensave_solutions=Truein thepygad.GAclass's constructor. - A new method named
plot_genes()creates, shows, and returns a figure to show how each gene changes per each generation. It accepts similar parameters like theplot_fitness()method in addition to thegraph_type,fill_color, andsolutionsparameters. Thegraph_typeparameter can be either"plot"(default),"boxplot", or"histogram".fill_coloraccepts the fill color which works whengraph_typeis either"boxplot"or"histogram".solutionscan be either"all"or"best"to decide whether all solutions or only best solutions are used. - The
gene_typeparameter now supports controlling the precision offloatdata types. For a gene, rather than assigning just the data type likefloat, assign alist/tuple/numpy.ndarraywith 2 elements where the first one is the type and the second one is the precision. For example,[float, 2]forces a gene with a value like0.1234to be0.12. For more information, check the More about thegene_typeParameter section.