Source code for cea.optimization.master.mutations

"""
Mutation routines

"""




from deap import tools

from cea.optimization.master.validation import validation_main


[docs]class MutationMethodInteger(object): """ mutation methods for integers """
[docs] def __init__(self, mutation_method): self.method = mutation_method
[docs] def mutate(self, individual, probability): if self.method == 'Shuffle': return tools.mutShuffleIndexes(individual, probability)[0] elif self.method == 'Flipbit': return tools.mutFlipBit(individual, probability)[0]
[docs]class MutationMethodContinuos(object): """ mutation methods for continuous variables """
[docs] def __init__(self, mutation_method): self.method = mutation_method
[docs] def mutate(self, individual, probability): if self.method == 'Polynomial': return tools.mutPolynomialBounded(individual, eta=20.0, low=0.0, up=1.0, indpb=1 / len(individual))[0] elif self.method == 'Shuffle': return tools.mutShuffleIndexes(individual, probability)[0]
[docs]def mutation_main(individual, indpb, column_names, heating_unit_names_share, cooling_unit_names_share, column_names_buildings_heating, column_names_buildings_cooling, district_heating_network, district_cooling_network, technologies_heating_allowed, technologies_cooling_allowed, mutation_method_integer, mutation_method_continuous ): mutation_integer = MutationMethodInteger(mutation_method_integer) mutation_continuous = MutationMethodContinuos(mutation_method_continuous) # create dict of individual with his/her name individual_with_name_dict = dict(zip(column_names, individual)) if district_heating_network: # MUTATE BUILDINGS CONNECTED buildings_heating = [individual_with_name_dict[column] for column in column_names_buildings_heating] # apply mutations buildings_heating_mutated = mutation_integer.mutate(buildings_heating, indpb) # take back to the individual for column, mutated_value in zip(column_names_buildings_heating, buildings_heating_mutated): individual_with_name_dict[column] = mutated_value # MUTATE SUPPLY SYSTEM UNITS SHARE heating_units_share = [individual_with_name_dict[column] for column in heating_unit_names_share] # apply mutations heating_units_share_mutated = mutation_continuous.mutate(heating_units_share, indpb) # takeback to the individual for column, mutated_value in zip(heating_unit_names_share, heating_units_share_mutated): individual_with_name_dict[column] = mutated_value if district_cooling_network: # MUTATE BUILDINGS CONNECTED buildings_cooling = [individual_with_name_dict[column] for column in column_names_buildings_cooling] # apply mutations buildings_cooling_mutated = mutation_integer.mutate(buildings_cooling, indpb) # take back to the individual for column, mutated_value in zip(column_names_buildings_cooling, buildings_cooling_mutated): individual_with_name_dict[column] = mutated_value # MUTATE SUPPLY SYSTEM UNITS SHARE cooling_units_share = [individual_with_name_dict[column] for column in cooling_unit_names_share] NDIM = len(cooling_units_share) # apply mutations cooling_units_share_mutated = mutation_continuous.mutate(cooling_units_share, indpb) # takeback to the individual for column, mutated_value in zip(cooling_unit_names_share, cooling_units_share_mutated): individual_with_name_dict[column] = mutated_value # now validate individual individual_with_name_dict = validation_main(individual_with_name_dict, column_names_buildings_heating, column_names_buildings_cooling, district_heating_network, district_cooling_network, technologies_heating_allowed, technologies_cooling_allowed, ) # now pass all the values mutated to the original individual for i, column in enumerate(column_names): individual[i] = individual_with_name_dict[column] return individual, # add the, because deap needs this