commit 7f7c6dbcd40d1755b1f08dcdb1a218a05d45a179
parent 47bc5d08c726253078ee45d20479ddaa26353549
Author: dracuxan <[email protected]>
Date: Thu, 9 Apr 2026 12:01:40 +0530
problem: optimizing schedule
Diffstat:
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)}")