# Genex

> Genex makes it easy to write Genetic Algorithms with Elixir.

[![Build Status](](
[![Coverage Status](](
[![Hex Version](](

This library is inspired by Python's [DEAP](

## Documentation

Documentation is available at [](

## Installation

The package can be installed by adding `genex` to your list of dependencies in `mix.exs`.

def deps do
    {:genex, "~> 0.2.1"}

## Usage

Genex requires an implementation module with 3 functions: `encoding/0`, `fitness_function/1`, and `terminate?/1`.

defmodule OneMax do
  use Genex

  def encoding do
    for _ <- 1..10, do: Enum.random(0..1)

  def fitness_function(chromosome), do: Enum.sum(chromosome.genes)

  def terminate?(population), do: population.max_fitness == 10

Now, run `iex -S mix`.


## Features

Genex strives to be as simple and customizable as possible. Along with the ability to customize EVERY step of your Genetic algorithm, Genex comes with the following features:

- 6 Selection Operators
- 7 Crossover Operators
- 6 Mutation Operators
- Customizable Population Statistics
- Customizable Benchmarking of Algorithms
- Exportable Genealogy Tree
- Flexible Encoding of Chromosomes
- Simple Text Visualizations

## Examples

There are currently 3 basic examples available in the `examples` directory. To run them, clone the repo and run:

mix run examples/[example].exs

The current examples are:

- `one_max.exs`
- `speller.exs`
- `linear_regression.exs`

## Benchmarks

To run benchmarks, clone this repo. In the `genex` directory run:

mix run bench/benchmarks.exs

You can also run the individual benchmarks available in the `bench/` directory. This will take some time!

## Contributing

If you have any problems with Genex, please open an issue! If you have a fix for an issue, submit a pull request.

## Roadmap

The next phase of this library will involve extensive performance improvements. Most of the algorithms involve processing very large lists. This is an ideal job for a NIF.

If anybody has any experience writing NIFs or writing algorithms for processing large lists, [email me]( to get involved!