示例#1
0
    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
示例#2
0
    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
示例#3
0
 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)
示例#4
0
        ## ------------- 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