Skip to content

Instantly share code, notes, and snippets.

@yuzu-original
Created June 19, 2024 16:05
Show Gist options
  • Save yuzu-original/c599273872ee251b0baa3082b5fbb1c5 to your computer and use it in GitHub Desktop.
Save yuzu-original/c599273872ee251b0baa3082b5fbb1c5 to your computer and use it in GitHub Desktop.
A quickly made implementation of the Genetic Algorithm in python
import random
def generate_random_gens(n: int, size: int, items_count: int) -> list[set[int]]:
res = []
v = list(range(items_count))
for _ in range(n):
random.shuffle(v)
res.append(set(v[:size]))
return res
def cross(gen1: set[int], gen2: set[int]) -> set[int]:
return set(random.sample(tuple(gen1 | gen2), len(gen1)))
def mutate(gen: set[int], items_count: int, chance: float) -> None:
can_use = list(set(range(items_count)).difference(gen))
for v in set(gen):
if random.uniform(0, 1) <= chance:
gen.remove(v)
can_use.append(v)
new = random.choice(can_use)
can_use.remove(new)
gen.add(new)
def evolve(gens: list[set[int]], items: list[int], nice_res: int) -> None:
# Selection and crossover
selected_count = len(gens) // 2
gens.sort(key=lambda x: abs(nice_res - sum(map(lambda y: items[y], x))))
for i in range(selected_count, len(gens)):
gens[i] = cross(gens[random.randint(0, selected_count - 1)],
gens[random.randint(0, selected_count - 1)])
# Mutation
for i in range(len(gens)):
mutate(gens[i], len(items), 0.1)
def main():
items = [5, 1, 10, 20, 5, 30, 2, 5, 1, 1]
nice = 13
c = len(items)
gens_count = 8
gen_size = 5
gens = generate_random_gens(gens_count, gen_size, c)
for _ in range(10):
evolve(gens, items, nice)
print(*(sum(map(lambda x: items[x], inds)) for inds in gens))
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment