Last active
September 7, 2022 21:47
-
-
Save ahmedfgad/d5de9f103d2e5c6aded76cf9c4402a7c to your computer and use it in GitHub Desktop.
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 numpy | |
| # This project is extended and a library called PyGAD is released to build the genetic algorithm. | |
| # PyGAD documentation: https://pygad.readthedocs.io | |
| # Install PyGAD: pip install pygad | |
| # PyGAD source code at GitHub: https://github.com/ahmedfgad/GeneticAlgorithmPython | |
| def cal_pop_fitness(equation_inputs, pop): | |
| # Calculating the fitness value of each solution in the current population. | |
| # The fitness function caulcuates the sum of products between each input and its corresponding weight. | |
| fitness = numpy.sum(pop*equation_inputs, axis=1) | |
| return fitness | |
| def select_mating_pool(pop, fitness, num_parents): | |
| # Selecting the best individuals in the current generation as parents for producing the offspring of the next generation. | |
| parents = numpy.empty((num_parents, pop.shape[1])) | |
| for parent_num in range(num_parents): | |
| max_fitness_idx = numpy.where(fitness == numpy.max(fitness)) | |
| max_fitness_idx = max_fitness_idx[0][0] | |
| parents[parent_num, :] = pop[max_fitness_idx, :] | |
| fitness[max_fitness_idx] = -99999999999 | |
| return parents | |
| def crossover(parents, offspring_size): | |
| offspring = numpy.empty(offspring_size) | |
| # The point at which crossover takes place between two parents. Usually it is at the center. | |
| crossover_point = numpy.uint8(offspring_size[1]/2) | |
| for k in range(offspring_size[0]): | |
| # Index of the first parent to mate. | |
| parent1_idx = k%parents.shape[0] | |
| # Index of the second parent to mate. | |
| parent2_idx = (k+1)%parents.shape[0] | |
| # The new offspring will have its first half of its genes taken from the first parent. | |
| offspring[k, 0:crossover_point] = parents[parent1_idx, 0:crossover_point] | |
| # The new offspring will have its second half of its genes taken from the second parent. | |
| offspring[k, crossover_point:] = parents[parent2_idx, crossover_point:] | |
| return offspring | |
| def mutation(offspring_crossover): | |
| # Mutation changes a single gene in each offspring randomly. | |
| for idx in range(offspring_crossover.shape[0]): | |
| # The random value to be added to the gene. | |
| random_value = numpy.random.uniform(-1.0, 1.0, 1) | |
| offspring_crossover[idx, 4] = offspring_crossover[idx, 4] + random_value | |
| return offspring_crossover |
May I please attempt to vectorise and write tests for these?
Author
Yes sure you can do it @keithreid-sfw :)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Ah I see. Nice one, sorry.