/genex

Genetic Algorithms in Elixir!

Primary LanguageElixirApache License 2.0Apache-2.0

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 https://hexdocs.pm/genex/introduction-overview.html

Installation

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

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

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)
  end

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

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

Now, run iex -S mix.

Then:

  iex> OneMax.run()

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
  • knapsack.exs
  • speller.exs
  • linear_regression.exs
  • n_queens.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!