Metadata-Version: 2.1
Name: geneticpython
Version: 0.0.2
Summary: A simple and friendly Python framework for genetic-based algorithms
Home-page: UNKNOWN
Author: Ngoc Bui
Author-email: ngocjr7@gmail.com
License: UNKNOWN
Project-URL: Bug Tracker, https://github.com/ngocjr7/geneticpython/issues
Project-URL: Documentation, https://github.com/ngocjr7/geneticpython/blob/master/README.md
Project-URL: Source Code, https://github.com/ngocjr7/geneticpython
Platform: UNKNOWN
Requires-Python: >=3.6
Description-Content-Type: text/markdown
Requires-Dist: cycler (>=0.10.0)
Requires-Dist: kiwisolver (>=1.2.0)
Requires-Dist: matplotlib (>=3.3.0)
Requires-Dist: numpy (>=1.19.1)
Requires-Dist: Pillow (>=7.2.0)
Requires-Dist: pyparsing (>=2.4.7)
Requires-Dist: python-dateutil (>=2.8.1)
Requires-Dist: six (>=1.15.0)
Requires-Dist: tqdm (>=4.48.1)

# geneticpython

A simple and friendly Python framework for genetic-based algorithms (strongly supports tree-encoding)

* Supported algorithms: Genetic Algorithm (`GAEngine`), NSGA-ii (`NSGAIIEngine`).
* An [example](https://github.com/ngocjr7/geneticpython/tree/master/examples) on ZDT1 problem:    

![alt tag](https://raw.githubusercontent.com/ngocjr7/geneticpython/master/examples/zdt1/solutions.gif)

## Installation

This package requires `python 3.6` or later.
```
pip install geneticpython
```

## Getting started

We can quickly design a genetic algorithm in the following steps:

1. define a template individual with specific encoding

```python
from geneticpython.models import BinaryIndividual
indv_temp = BinaryIndividual(length=100)
```

2. define population based on this population can uniformly initialize a population or you can define your own by passing `init_population` argument function

```python
from geneticpython import Population
population = Population(indv_temp, pop_size=100)
```
3. define some core operators in genetic algorithm

```python
from geneticpython.core.operators import RouletteWheelSelection, UniformCrossover, \
                                        FlipBitMutation, RouletteWheelReplacement
selection = RouletteWheelSelection()
crossover = UniformCrossover(pc=0.8, pe=0.5)
mutation = FlipBitMutation(pm=0.1)
# this function decides which individuals will be survived
replacement = RouletteWheelReplacement()
```

4. create an engine and register the defined population and operators

```python
from geneticpython import GAEngine
engine = GAEngine(population, selection=selection,
                  selection_size=100,
                  crossover=crossover,
                  mutation=mutation,
                  replacement=replacement)
```

5. register fitness function which gets an individual and returns its fitness value

```python
@engine.maximize_objective
def fitness(indv):
    return fitness_of_indv
```

6. run engine

```python
engine.create_seed(seed)
history = engine.run(generations=1000)
```

7. get results and plot history

```python
ans = engine.get_best_indv()
print(ans)
plot_single_objective_history({'geneticpython': history})
```

You can find more examples [here](https://github.com/ngocjr7/geneticpython/tree/master/examples)

## TODO

* [ ] Create extensive documentation and docs and comments in source-code
* [ ] Implement other algorithms: `PSO, DE, MOED/A, MOPSO, MODE,...`
* [ ] Implement other operators: `PMX crossover, ...`

## Issues and Contribution
This project is in development, if you find any issues, please create an issue [here](https://github.com/ngocjr7/geneticpython/issues).

If you are interested in contributing this project, feel free to create pull request [here](https://github.com/ngocjr7/geneticpython/pulls). We appreciate any contributions from you.

## Acknowledgements
Special thanks to https://github.com/PytLab/gaft for getting me started a great API design.

This repository includes adaptions of the following repositories as baselines:

* https://github.com/msu-coinlab/pymoo
* https://github.com/tensorflow/tensorflow


