From c09f0c0e0278e8eba2a906ee3d8f596d16fdde4c Mon Sep 17 00:00:00 2001 From: Fredrik Robertsen Date: Sat, 31 Jan 2026 11:55:26 +0100 Subject: [PATCH] implement two_point_crossover --- src/main.odin | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main.odin b/src/main.odin index b045f30..19dd8af 100644 --- a/src/main.odin +++ b/src/main.odin @@ -126,6 +126,30 @@ single_point_crossover :: proc(parent1, parent2: ^Chromosome) -> (child1, child2 return } +two_point_crossover :: proc(parent1, parent2: ^Chromosome) -> (child1, child2: Chromosome) { + point1 := rand.int_max(NUMBER_OF_ITEMS) + point2 := rand.int_max(NUMBER_OF_ITEMS) + + if point1 > point2 { + point1, point2 = point2, point1 + } + + child1 = bit_array.create(NUMBER_OF_ITEMS)^ + child2 = bit_array.create(NUMBER_OF_ITEMS)^ + + for i in 0 ..< NUMBER_OF_ITEMS { + if i >= point1 && i < point2 { + bit_array.set(&child1, i, bit_array.get(parent2, i)) + bit_array.set(&child2, i, bit_array.get(parent1, i)) + } else { + bit_array.set(&child1, i, bit_array.get(parent1, i)) + bit_array.set(&child2, i, bit_array.get(parent2, i)) + } + } + + return +} + main :: proc() { items, ok := read_data(DATA_FILE) if !ok {