Last active
June 20, 2023 08:13
-
-
Save sharavsambuu/585f09b94c70427357accc5643d4eee7 to your computer and use it in GitHub Desktop.
Hello World Genetic Algorithm
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#%% | |
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