Skip to content
This repository has been archived by the owner on Jun 27, 2021. It is now read-only.

jakub-gonet/genetic-alchemy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Genetic algoritm

Build Status Coverage Status

This is genetic algoritm implementation written in Elixir. It uses Flow library to achieve high concurrency in time-consuming tasks such as calculating fitness or crossovering chromosomes.

Rulette select is used to select chromosomes for crossover, it's based on selecting chromosomes with chance coresponding to their fitness.

Examples of usage can be viewed here
One test is finding specific gene pattern, second searches for RNP expression of given number (e.g. 2 11 * for 22)

Installation

mix do deps.get, compile

Building docs

mix docs

Built docs can be accessed in doc/ folder or viewed online here.

Running tests and code style check

mix test --cover && mix credo --strict

Usage

iex -S mix

This command load Elixir's REPL with project modules loaded.
Example:

# Define fitness function:
fitness_f = fn genes ->
  desired = [%Gene{v: 1}, %Gene{v: 2}, %Gene{v: 3}, %Gene{v: 4}, %Gene{v: 5}]
    count = Enum.count(genes)

    fitting =
      desired
      |> Enum.zip(genes)
      |> Enum.reduce(0, fn {x, y}, acc -> if(x == y, do: 1, else: 0) + acc end)

    fitting / count
end

# Set algoritm options:
settings = [
  gene_values: [{Enum.to_list(1..5), 1.0}],
  length: 5,
  min_fitness: 1.0
]

# And call `GeneticAlgorithm.find_solution/2`:
GeneticAlgorithm.find_solution(fitness_f, settings)

Result:

%{
  generations: 2,
  most_fitting: [
    %Chromosome{
      fitness: 1.0,
      genes: [
        %Gene{v: 1},
        %Gene{v: 2},
        %Gene{v: 3},
        %Gene{v: 4},
        %Gene{v: 5}
      ]
    }, 
    %Chromosome{
      fitness: 1.0,
      genes: [
        %Gene{v: 1}, 
        %Gene{v: 2},
        %Gene{v: 3},
        %Gene{v: 4},
        %Gene{v: 5}
      ]
    },
    %Chromosome{
      fitness: 0.8,
      genes: [
        %Gene{v: 1},
        %Gene{v: 1},
        %Gene{v: 3},
        %Gene{v: 4},
        %Gene{v: 5}
      ]
    }
  ]
}