Skip to content

Instantly share code, notes, and snippets.

@sharavsambuu
Last active June 20, 2023 08:13
Show Gist options
  • Save sharavsambuu/585f09b94c70427357accc5643d4eee7 to your computer and use it in GitHub Desktop.
Save sharavsambuu/585f09b94c70427357accc5643d4eee7 to your computer and use it in GitHub Desktop.
Hello World Genetic Algorithm
#%%
import random
import numpy as np
#%%
#%%
def calculate_fitness(individual_chromosome):
in_sample = [4,-2,7,5,11,1]
fitness = 1/np.abs(44.1-np.sum(np.multiply(individual_chromosome,in_sample)))
return fitness
def population_fitness(population):
qualities = np.zeros(population.shape[0])
for individual_idx in range(0, population.shape[0]):
qualities[individual_idx] = calculate_fitness(population[individual_idx, :])
return qualities
def select_mating_pool(population, qualities, num_parents):
parents = np.empty((num_parents, population.shape[1]))
for parent_idx in range(0, num_parents):
max_quality_idx = np.where(qualities==np.max(qualities))
max_quality_idx = max_quality_idx[0][0]
parents[parent_idx, :] = population[max_quality_idx, :]
qualities[max_quality_idx] = -1
return parents
def crossover(parents, n_individuals=6):
new_population = np.empty((6,6))
new_population[0:parents.shape[0], :] = parents
new_population[3,0:3] = parents[0, 0:3]
new_population[3,3: ] = parents[1, 3: ]
new_population[4,0:3] = parents[1, 0:3]
new_population[4,3: ] = parents[2, 3: ]
new_population[5,0:3] = parents[2, 0:3]
new_population[5,3: ] = parents[0, 3: ]
return new_population
def mutate(population):
for idx in range(0, population.shape[0]):
population[idx, 4] = population[idx, 4]/3
return population
#%%
#%%
#%%
generation_size = 10
population_size = 6
mating_parents_size = 3
new_population = np.zeros((6,6))
new_population[0, :] = [ 2.4, 0.7, 8.0, -2.0, 5.0, 1.1]
new_population[0, :] = [-0.4, 2.7, 5.0, -1.0, 7.0, 0.1]
new_population[0, :] = [-1.0, 2.0, 2.0, -3.0, 2.0, 0.9]
new_population[0, :] = [ 4.0, 7.0, 12.0, 6.1, 1.4, -4.0]
new_population[0, :] = [ 3.1, 4.0, 0.0, 2.4, 4.8, 0.0]
new_population[0, :] = [-2.0, 3.0, -7.0, 6.0, 3.0, 3.3]
for generation_idx in range(0, generation_size):
qualities = population_fitness(new_population)
parents = select_mating_pool(new_population, qualities, mating_parents_size)
new_population = crossover(parents, n_individuals=population_size)
new_population = mutate(new_population)
in_sample = [4,-2, 7, 5, 11, 1]
for k in range(6):
print(f"{round(np.sum(np.multiply(new_population[k, :], in_sample)),1)}")
#%%
#%%
#%%
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment