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}")