genetic

genetic algorithm framework
git clone [email protected]:dracuxan/genetic.git
Log | Files | Refs | README

codebreaker.exs (1116B)


      1 defmodule Codebreaker do
      2   alias Types.Chromosome
      3   @behaviour Problem
      4   @max_n 64
      5   import Bitwise
      6 
      7   def genotype do
      8     genes = Enum.map(1..@max_n, fn _ -> Enum.random(0..1) end)
      9     %Chromosome{genes: genes, size: @max_n}
     10   end
     11 
     12   def fitness_function(chromosome) do
     13     target = "dracuxan"
     14     encrypted = "awdfp}dk"
     15 
     16     cypher = fn word, key ->
     17       word
     18       |> to_charlist()
     19       |> Enum.map(fn x -> rem(bxor(x, key), 32768) end)
     20     end
     21 
     22     key = generate_integer_key(chromosome.genes)
     23     guess = List.to_string(cypher.(encrypted, key))
     24     String.jaro_distance(target, guess)
     25   end
     26 
     27   def terminate?(population, _generation) do
     28     best = hd(population)
     29     best.fitness == 1
     30   end
     31 
     32   def generate_integer_key(key) do
     33     key
     34     |> Enum.map(&Integer.to_string(&1))
     35     |> Enum.join("")
     36     |> String.to_integer(2)
     37   end
     38 end
     39 
     40 {soln, generation} =
     41   Genetic.run(
     42     Codebreaker,
     43     crossover_type: &Toolbox.Crossover.single_point/3,
     44     mutation_type: &Toolbox.Mutation.flip_some/2
     45   )
     46 
     47 key = Codebreaker.generate_integer_key(soln.genes)
     48 
     49 IO.puts("\nkey: #{key}\ngenerations passed: #{generation}")