def substations(col_of_subs, one_substation): '''Randomly selects a specified number (or random number) of substations from a chromosome and returns their memory locations in a colection_of_substations class. One_substation is a boolean ''' if not isinstance(col_of_subs, collection_of_substations): raise ValueError( 'Invalid chromosome input into substation_selector') if not isinstance(one_substation, int): raise ValueError( 'Invalid max_nr_subs_to_select input into substation_selector') if one_substation == 1: # returns 1 substation of class substation instead of a collection of substations selected_substation = choice(list(col_of_subs.get_collection())) return selected_substation else: if len(col_of_subs.get_collection()) == 1: k1 = 1 return col_of_subs, col_of_subs k1 = randint(1, len(col_of_subs.get_collection()) - 1) selected_substations = rndm.sample( population=col_of_subs.get_collection(), k=k1) new_col_of_subs1 = collection_of_substations() new_col_of_subs1.add_collection(selected_substations) new_col_of_subs2 = collection_of_substations() set_of_subs = col_of_subs.get_collection().difference( set(selected_substations)) new_col_of_subs2.add_collection(set_of_subs) return new_col_of_subs1, new_col_of_subs2
def crossover(chrom1, chrom2, all_centroids): '''To keep the operators on similar compute times only one offspring is created. ''' if not isinstance(chrom1, chromosome): raise ValueError('Invalid chromosome1 input into mutate_location') if not isinstance(chrom2, chromosome): raise ValueError('Invalid chromosome2 input into mutate_location') if not isinstance(all_centroids, collection_of_centroids): raise ValueError('Invalid input into crossover') col_of_subs1 = collection_of_substations() for gene1 in chrom1.get_collection(): col_of_subs1.add_substation(gene1.get_substation()) col_of_subs2 = collection_of_substations() for gene1 in chrom2.get_collection(): col_of_subs2.add_substation(gene1.get_substation()) col_of_subs11, col_of_subs12 = selector.substations(col_of_subs1, 0) col_of_subs21, col_of_subs22 = selector.substations(col_of_subs2, 0) col_of_subs3 = process.substation_crossover(col_of_subs11, col_of_subs22) col_of_subs4 = process.substation_crossover(col_of_subs12, col_of_subs21) col_of_subs5 = collection_of_substations() col_of_subs6 = collection_of_substations() for sub in col_of_subs3.get_collection(): sub1 = copy.deepcopy(sub) sub1.reset_sub() col_of_subs5.add_substation(sub1) for sub in col_of_subs4.get_collection(): sub1 = copy.deepcopy(sub) sub1.reset_sub() col_of_subs6.add_substation(sub1) offspring1 = generator.create_chromosome(all_centroids, col_of_subs5) offspring2 = generator.create_chromosome(all_centroids, col_of_subs6) if offspring1.get_cost() < offspring2.get_cost(): return offspring1 return offspring2
def mutate_substation_size(chrom1, chrom2, all_centroids): '''Returns a mutated collection of substations in a new memory location. Calculated from the given population. ''' if not isinstance(chrom1, chromosome): raise ValueError('Invalid input into mutate_location') if not isinstance(all_centroids, collection_of_centroids): raise ValueError('Invalid input into mutate_substation_size') col_of_subs = collection_of_substations() for gene1 in chrom1.get_collection(): sub = copy.deepcopy(gene1.get_substation()) sub.reset_sub() col_of_subs.add_substation(sub) selected_substation = selector.substations(col_of_subs, 1) process.substation_size_mutator(selected_substation) return generator.create_chromosome(all_centroids, col_of_subs)
## ------------- Instantiate population ------------------------------- # number_of_substation_options = len(substation.get_max_cap_to_cost_index(substation).keys()) # pop_size = population_size_calculator(all_centroids.get_number_of_centroids(), number_of_substation_options) pop = population(pop_size) # print('Population size = ' + str(pop.get_max_population_size())) ## ------------- Fill initial population with chromosomes ------------- for i in range(pop.get_max_population_size()): new_chromosome_len = randint( 1, max_nr_substations_in_chromosome( all_centroids.get_number_of_centroids())) coll_of_substations = collection_of_substations() for i in range(new_chromosome_len ): #adding substations to coll_of_substations new_substation = generator.substation( all_centroids.get_x_bounds(), all_centroids.get_y_bounds()) coll_of_substations.add_substation(new_substation) new_chromosome = chromosome( generator.gene(all_centroids, coll_of_substations)) process.update_chrom_cost(new_chromosome) pop.add_chromosome(new_chromosome) ## ------------------ Other Initialization ---------------------------- operator = Operator( operator_dict, adaptive=operator_adaptive ) # Instantiates an operator class instance for every new prgram run