Exemplo n.º 1
0
 def double_population(self):
     for _ in xrange(len(self.solution_pool)):
         parent1 = random.choice(self.solution_pool)
         parent2 = random.choice(self.solution_pool)
         child = Solution.cross_over(parent1, parent2)
         should_mutate = random.random() < (1.0 / len(self.solution_pool))
         if should_mutate:
             child.mutate(1)
         child.repair()
         self.add_solution(child)
Exemplo n.º 2
0
def main():
    parser = argparse.ArgumentParser(
        description='Poorly solve the general assignment problem.',
        fromfile_prefix_chars='@')

    parser.add_argument('filename',
                        metavar='filename',
                        type=unicode,
                        help='a data file to parse and run on')
    parser.add_argument('--population',
                        metavar='population',
                        type=int,
                        default=100,
                        help='how large to keep population')
    parser.add_argument('--evaluations',
                        metavar='evaluations',
                        type=int,
                        default=100000,
                        help='how many evaluations to run between restarts')
    parser.add_argument('--restarts',
                        metavar='restarts',
                        type=int,
                        default=10,
                        help='how often to restart from a random point')

    args = parser.parse_args()

    POPULATION = args.population
    NUMBER_OF_EVALUATIONS = args.evaluations
    RESTARTS = args.restarts

    total_evaluations = 0
    top_genotypes = []
    for n in xrange(RESTARTS):
        print "restart", n, "out of {0}:".format(RESTARTS)
        print
        with open(args.filename) as f:
            ga = GeneticAlgorithm.from_file(f, fittest_found_callback)
            ga.generate_random_solutions(POPULATION)

            evolutions = NUMBER_OF_EVALUATIONS / POPULATION
            for _ in xrange(evolutions):
                ga.evolve_population()

            indexes = agent_indexes(ga.agents)
            top_genotypes.extend(
                assignment_indexes(solution) for solution in ga.solution_pool)
            total_evaluations += ga.evaluations

    with open(args.filename) as f:
        ga = GeneticAlgorithm.from_file(f, fittest_found_callback)
        ga.solution_pool = [
            Solution(ga.agents, assignment_agents(genotype, ga.agents))
            for genotype in top_genotypes
        ]

        while len(ga.solution_pool) > 10:
            ga.double_population()
            ga.halve_population()
            ga.halve_population()
            print "population:", len(ga.solution_pool)

        print "all done:"
        print "total_evaluations: ", (ga.evaluations + total_evaluations)

        best_solution = sorted(ga.solution_pool, key=lambda s: s.total_cost)[0]
        fittest_found_callback(best_solution, ga)
Exemplo n.º 3
0
 def generate_random_solutions(self, population_size):
     for _ in xrange(population_size):
         solution = Solution.generate_random(self.agents)
         self.add_solution(solution)