Source code for cea.optimization.master.crossover

"""
Crossover routines

"""

from deap import tools

from cea.optimization.master.validation import validation_main


[docs]class CrossOverMethodsInteger(object): """ mutation methods for integers """
[docs] def __init__(self, crossover_method): self.method = crossover_method
[docs] def crossover(self, individual_1, individual_2, probability): if self.method == 'Uniform': return tools.cxUniform(individual_1, individual_2, probability) elif self.method == 'TwoPoint': return tools.cxESTwoPoint(individual_1, individual_2)
[docs]class CrossOverMethodsContinuous(object): """ mutation methods for integers """
[docs] def __init__(self, crossover_method): self.method = crossover_method
[docs] def crossover(self, individual_1, individual_2, probability): if self.method == 'Uniform': return tools.cxUniform(individual_1, individual_2, probability) elif self.method == 'TwoPoint': return tools.cxESTwoPoint(individual_1, individual_2)
[docs]def crossover_main(ind1, ind2, 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, crossover_method_integer, crossover_method_continuous ): crossover_integer = CrossOverMethodsInteger(crossover_method_integer) crossover_continuous = CrossOverMethodsContinuous(crossover_method_continuous) # create dict of individual with his/her name ind1_with_name_dict = dict(zip(column_names, ind1)) ind2_with_name_dict = dict(zip(column_names, ind2)) if district_heating_network: # MUTATE BUILDINGS CONNECTED buildings_heating_ind1 = [ind1_with_name_dict[column] for column in column_names_buildings_heating] buildings_heating_ind2 = [ind2_with_name_dict[column] for column in column_names_buildings_heating] # apply crossover buildings_heating_ind1, \ buildings_heating_ind2 = crossover_integer.crossover(buildings_heating_ind1, buildings_heating_ind2, indpb) # take back to the individual for column, cross_over_value in zip(column_names_buildings_heating, buildings_heating_ind1): ind1_with_name_dict[column] = cross_over_value for column, cross_over_value in zip(column_names_buildings_heating, buildings_heating_ind2): ind2_with_name_dict[column] = cross_over_value # MUTATE SUPPLY SYSTEM UNITS SHARE heating_units_share_ind1 = [ind1_with_name_dict[column] for column in heating_unit_names_share] heating_units_share_ind2 = [ind2_with_name_dict[column] for column in heating_unit_names_share] # apply crossover heating_units_share_ind1, \ heating_units_share_ind2 = crossover_continuous.crossover(heating_units_share_ind1, heating_units_share_ind2, indpb) # take back to the individual for column, cross_over_value in zip(heating_unit_names_share, heating_units_share_ind1): ind1_with_name_dict[column] = cross_over_value for column, cross_over_value in zip(heating_unit_names_share, heating_units_share_ind2): ind2_with_name_dict[column] = cross_over_value if district_cooling_network: # CROSSOVER BUILDINGS CONNECTED buildings_cooling_ind1 = [ind1_with_name_dict[column] for column in column_names_buildings_cooling] buildings_cooling_ind2 = [ind2_with_name_dict[column] for column in column_names_buildings_cooling] # apply crossover buildings_cooling_ind1, \ buildings_cooling_ind2 = crossover_integer.crossover(buildings_cooling_ind1, buildings_cooling_ind2, indpb) # take back to the individual for column, cross_over_value in zip(column_names_buildings_cooling, buildings_cooling_ind1): ind1_with_name_dict[column] = cross_over_value for column, cross_over_value in zip(column_names_buildings_cooling, buildings_cooling_ind2): ind2_with_name_dict[column] = cross_over_value # CROSSOVER SUPPLY SYSTEM UNITS SHARE cooling_units_share_ind1 = [ind1_with_name_dict[column] for column in cooling_unit_names_share] cooling_units_share_ind2 = [ind2_with_name_dict[column] for column in cooling_unit_names_share] # apply crossover cooling_units_share_ind1, \ cooling_units_share_ind2 = crossover_continuous.crossover(cooling_units_share_ind1, cooling_units_share_ind2, indpb) # take back to the individual for column, cross_over_value in zip(cooling_unit_names_share, cooling_units_share_ind1): ind1_with_name_dict[column] = cross_over_value for column, cross_over_value in zip(cooling_unit_names_share, cooling_units_share_ind2): ind2_with_name_dict[column] = cross_over_value # now validate individual # now validate individual ind1_with_name_dict = validation_main(ind1_with_name_dict, column_names_buildings_heating, column_names_buildings_cooling, district_heating_network, district_cooling_network, technologies_heating_allowed, technologies_cooling_allowed, ) ind2_with_name_dict = validation_main(ind2_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): ind1[i] = ind1_with_name_dict[column] for i, column in enumerate(column_names): ind2[i] = ind2_with_name_dict[column] return ind1, ind2