Releases: ahmedfgad/GeneticAlgorithmPython
PyGAD-2.18.1
PyGAD 2.18.1
- A big fix when
keep_elitism
is 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_completed
property 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_elitism
added to hold the elitism in the last generation. - A new parameter called
random_seed
added 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.TorchGA
module 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_space
parameter 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_genes
parameter 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_processing
in the constructor of thepygad.GA
class. 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_fitness
added in thepygad.GA
class. 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_fitness
to 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
tqdm
library 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
solutions
andsolutions_fitness
when thesave_solutions
parameter is set toTrue
. Now, the fitness of the last population is appended to thesolutions_fitness
array. #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_indices
holds 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_fitness
andlast_generation_parents_indices
attributes. This speeds-up the adaptive mutation. - When a sublist has a value of
None
in thegene_space
parameter (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 ofNone
in a sublist of thegene_space
parameter was identical across all solutions. - The dictionary assigned to the
gene_space
parameter 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_space
Parameter section. #48 - A new function called
predict()
is added in both thepygad.kerasga
andpygad.torchga
modules to make predictions. This makes it easier than using custom code each time a prediction is to be made. - A new parameter called
stop_criteria
allows the user to specify one or more stop criteria to stop the evolution based on some conditions. Each criterion is passed asstr
which has a stop word. The current 2 supported words arereach
andsaturate
.reach
stops therun()
method if the fitness value is equal to or greater than a given fitness value. An example forreach
is"reach_40"
which stops the evolution if the fitness is >= 40.saturate
means stop the evolution if the fitness saturates for a given number of consecutive generations. An example forsaturate
is"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_solutions
is added to the constructor of thepygad.GA
class. IfTrue
, then all solutions in each generation are appended into an attribute calledsolutions
which 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.GA
class which arefont_size=14
,save_dir=None
,color="#3870FF"
, andplot_type="plot"
. Usefont_size
to change the font of the plot title and labels.save_dir
accepts the directory to which the figure is saved. It defaults toNone
which means do not save the figure.color
changes the color of the plot.plot_type
changes the plot type which can be either"plot"
(default),"scatter"
, or"bar"
. #47 - The default value of the
title
parameter 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=True
in thepygad.GA
class'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
, andsolutions
parameters. Thegraph_type
parameter can be either"plot"
(default),"boxplot"
, or"histogram"
.fill_color
accepts the fill color which works whengraph_type
is either"boxplot"
or"histogram"
.solutions
can be either"all"
or"best"
to decide whether all solutions or only best solutions are used. - The
gene_type
parameter now supports controlling the precision offloat
data types. For a gene, rather than assigning just the data type likefloat
, assign alist
/tuple
/numpy.ndarray
with 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.1234
to be0.12
. For more information, check the More about thegene_type
Parameter section.
PyGAD-2.14.3
Some bug fixes when setting the save_best_solutions
parameter to True
. Previously, the best solution for generation i
was added into the best_solutions
attribute at generation i+1
. Now, the best_solutions
attribute is updated by each solution at its exact generation.
PyGAD-2.14.2
Some bug fixes when the gene_type
parameter is nested. Thanks to Rainer Engel for opening a discussion to report this bug: #43 (reply in thread)
Rainer Engel helped a lot in suggesting new features and suggesting enhancements in 2.14.0 to 2.14.2 releases.