GAFT
A Genetic Algorithm Framework in pyThon
Introduction
GAFT is a general Python Framework for genetic algorithm computation. It provides built-in genetic operators for target optimization and plugin interfaces for users to define your own genetic operators and on-the-fly analysis for algorithm testing.
GAFT is now accelerated using MPI parallelization interfaces. You can run it on your cluster in parallel with MPI environment.
Python Support
GAFT requires Python version 3.x (Python 2.x is not supported).
Installation
Via pip: pip install gaft
From source: python setup.py install
If you want GAFT to run in MPI env, please install mpi4py explicitly:
pip install mpi4py
See INSTALL.md for more installation details.
Test
Run unit test:
python setup.py test
Quick start
1. Importing
from gaft import GAEngine
from gaft.components import BinaryIndividual, Population
from gaft.operators import RouletteWheelSelection, UniformCrossover, FlipBitMutation
# Analysis plugin base class.
from gaft.plugin_interfaces.analysis import OnTheFlyAnalysis
2. Define population
indv_template = BinaryIndividual(ranges=[(0, 10)], eps=0.001)
population = Population(indv_template=indv_template, size=50)
population.init() # Initialize population with individuals.
3. Create genetic operators
# Use built-in operators here.
selection = RouletteWheelSelection()
crossover = UniformCrossover(pc=0.8, pe=0.5)
mutation = FlipBitMutation(pm=0.1)
4. Create genetic algorithm engine to run optimization
engine = GAEngine(population=population, selection=selection,
crossover=crossover, mutation=mutation,
analysis=[FitnessStore])
5. Define and register fitness function
@engine.fitness_register
def fitness(indv):
x, = indv.solution
return x + 10*sin(5*x) + 7*cos(4*x)
or if you want to minimize it, you can add a minimization decorator on it
@engine.fitness_register
@engine.minimize
def fitness(indv):
x, = indv.solution
return x + 10*sin(5*x) + 7*cos(4*x)
6. Define and register an on-the-fly analysis (optional)
@engine.analysis_register
class ConsoleOutput(OnTheFlyAnalysis):
master_only = True
interval = 1
def register_step(self, g, population, engine):
best_indv = population.best_indv(engine.fitness)
msg = 'Generation: {}, best fitness: {:.3f}'.format(g, engine.fmax)
engine.logger.info(msg)
7. Run
if '__main__' == __name__:
engine.run(ng=100)
8. Evolution curve
9. Optimization animation
See example 01 for a one-dimension search for the global maximum of function f(x) = x + 10sin(5x) + 7cos(4x)
Global maximum search for binary function
See example 02 for a two-dimension search for the global maximum of function f(x, y) = y*sin(2*pi*x) + x*cos(2*pi*y)
Plugins
You can define your own genetic operators for GAFT and run your algorithm test.
The plugin interfaces are defined in /gaft/plugin_interfaces/, you can extend the interface class and define your own analysis class or genetic operator class. The built-in operators and built-in on-the-fly analysis can be treated as an official example for plugins development.
Blogs(Chinese Simplified)
TODO
✅ Parallelization
✅ Add more built-in genetic operators with different algorithms
🏃 Add C++ backend(See GASol)
Obtain a copy
The GAFT framework is distributed under the GPLv3 license and can be obtained from the GAFT git repository or PyPI