genetic

genetic algorithm framework
git clone igris.git:dracuxan/genetic.git
Log | Files | Refs | README

commit 7f7c6dbcd40d1755b1f08dcdb1a218a05d45a179
parent 47bc5d08c726253078ee45d20479ddaa26353549
Author: dracuxan <[email protected]>
Date:   Thu,  9 Apr 2026 12:01:40 +0530

problem: optimizing schedule

Diffstat:
Mgenetic/.gitignore | 2++
Mgenetic/lib/genetic.ex | 2+-
Mgenetic/scripts/one_max.exs | 4++--
Agenetic/scripts/schedule.exs | 47+++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/genetic/.gitignore b/genetic/.gitignore @@ -21,3 +21,5 @@ genetic-*.tar # Temporary files, for example, from tests. /tmp/ + +.codex diff --git a/genetic/lib/genetic.ex b/genetic/lib/genetic.ex @@ -83,7 +83,7 @@ defmodule Genetic do def evolve(population, problem, generation, opts \\ []) do population = evaluate(population, &problem.fitness_function/1, opts) best = hd(population) - IO.write("\rcurrent best: #{best.fitness}") + IO.write("\rcurrent best: #{best.fitness}\tgeneration: #{generation}") if problem.terminate?(population, generation) do {best, generation} diff --git a/genetic/scripts/one_max.exs b/genetic/scripts/one_max.exs @@ -1,7 +1,7 @@ defmodule OneMax do alias Types.Chromosome @behaviour Problem - @max_n 30 + @max_n 1000 @impl true def genotype do @@ -39,7 +39,7 @@ end OneMax, selection_type: &Toolbox.Selection.elite/2, crossover_type: &Toolbox.Crossover.uniform/3, - mutation_type: &Toolbox.Mutation.gaussian/2 + mutation_type: &Toolbox.Mutation.scramble/2 ) IO.puts("\nfinal answer: #{inspect(soln)}") diff --git a/genetic/scripts/schedule.exs b/genetic/scripts/schedule.exs @@ -0,0 +1,47 @@ +defmodule Schedule do + alias Types.Chromosome + @behaviour Problem + @max_classes 10 + + def genotype do + genes = Enum.map(1..10, fn _ -> Enum.random(0..1) end) + %Chromosome{genes: genes, size: @max_classes} + end + + def fitness_function(chromosome) do + schedule = chromosome.genes + + fitness = + [schedule, difficulties(), usefulness(), interest()] + |> Enum.zip() + |> Enum.map(fn {class, diff, use, int} -> + class * (0.3 * use + 0.4 * int - 0.3 * diff) + end) + |> Enum.sum() + + credit = + schedule + |> Enum.zip(credit_hours()) + |> Enum.map(fn {class, credit} -> class * credit end) + |> Enum.sum() + + if credit <= 18.0, do: fitness, else: -9999 + end + + def terminate?(_population, generation) do + generation == 1000 + end + + defp credit_hours, do: [3.0, 3.0, 3.0, 4.5, 3.0, 3.0, 3.0, 3.0, 4.5, 1.5] + defp difficulties, do: [8.0, 9.0, 4.0, 3.0, 5.0, 2.0, 4.0, 2.0, 6.0, 1.0] + defp usefulness, do: [8.0, 9.0, 6.0, 2.0, 8.0, 9.0, 1.0, 2.0, 5.0, 1.0] + defp interest, do: [8.0, 8.0, 5.0, 9.0, 7.0, 2.0, 8.0, 2.0, 7.0, 10.0] +end + +{soln, _} = + Genetic.run(Schedule, + crossover_type: &Toolbox.Crossover.single_point/3, + mutation_type: &Toolbox.Mutation.flip_some/2 + ) + +IO.puts("\nschedule: #{inspect(soln)}")