Esempio n. 1
0
def run_ga(id):
    # Also log to file
    if args.o:
        file_handler = logging.FileHandler(log_dir + "/report%i.log" %
                                           (id + 1))
        file_handler.setFormatter(format)
        logger.addHandler(file_handler)

    # Summary
    logger.info("------------------------------GA Settings------------------")
    logger.info("Initial population: %i", args.p)
    logger.info("Initial population method: %s", args.M)
    logger.info("Initial population ratio: %i", args.R)
    logger.info("Population restart method: %s", args.S)
    logger.info("Population restart ratio: %f", args.r)
    logger.info("Elitism: %i", args.e)
    if args.k is not None:
        logger.info("Tournament selection size: %i", args.k)
    elif args.K is not None:
        logger.info("Selection pressure (Ranking): %f", args.K)
    elif args.P:
        logger.info("Pairwise selection")
    logger.info("Crossover probability: %f", args.c)
    logger.info("Mutation probability: %f", args.m)
    logger.info("Mutation operator: %s", args.t)
    logger.info("Fusion: %s", args.F)
    logger.info("Explore: %s", args.E)
    logger.info("Generation limit: %i", args.g)
    logger.info("Instance: %s", args.I)
    logger.info("Dimension: %i", instance.dimension)
    logger.info("Iteration: %i/%i", id + 1, args.n)

    # Stats
    avg_fitness = defaultdict(list)
    best_fitness = defaultdict(list)
    best_solution = dict()
    counters = defaultdict(list)
    timers = defaultdict(list)

    # Crossover operator
    gpx = GPX(instance)

    # Define which tests will be applied
    gpx.test_1 = args.t1
    gpx.test_2 = args.t2
    gpx.test_3 = args.t3

    # Fusion, explore and relax switches
    gpx.fusion_on = args.F
    gpx.explore_on = args.E
    gpx.relax = args.L

    # Fusion tests
    gpx.test_1_fusion = args.t1f
    gpx.test_2_fusion = args.t2f
    gpx.test_3_fusion = args.t3f

    # GA Instance
    ga = GA(instance, gpx, args.e)

    # Generate inicial population
    ga.gen_pop(args.p, args.M, args.R, args.l, args.s)

    # Fisrt population evaluation
    ga.evaluate()

    # Begin GA
    while ga.generation < args.g:
        # Update plot
        if args.n == 1 and args.G:
            plt_mgr.add(x=ga.generation,
                        y=ga.counters['avg_fit'][-1],
                        name='Average fitness')
            plt_mgr.add(x=ga.generation,
                        y=ga.counters['best_fit'][-1],
                        name='Best fitness')
            plt_mgr.add(x=ga.generation,
                        y=ga.counters['cross'][-1],
                        name='Crossover')
            plt_mgr.update()

        # Logging
        avg_fitness[ga.generation].append(ga.counters['avg_fit'][-1])
        best_fitness[ga.generation].append(ga.counters['best_fit'][-1])

        # Population restart
        if args.r:
            ga.restart_pop(args.r, args.S)

        # Selection
        if args.k is not None:
            ga.tournament_selection(args.k)
        elif args.K is not None:
            ga.rank_selection(args.K)
        elif args.P:
            ga.pairwise_selection()

        # Recombination
        if args.c:
            ga.recombine(args.c, args.P)

        # Mutation
        if args.m:
            ga.mutate(args.m, args.t)

        # Evaluation
        ga.evaluate()

        # Generation info
        ga.print_info()

    # Final report
    ga.report()

    # Close ploting
    if args.n == 1 and args.G:
        plt_mgr.close()

    # Best solution
    best_solution[id] = ga.best_solution

    # Calc improvement
    parents_dist = float(gpx.counters['parents_dist'])
    children_dist = float(gpx.counters['children_dist'])
    improvement = 0
    if parents_dist != 0:
        improvement = (1 - children_dist / parents_dist) * 100

    # Counters
    counters[id].extend([
        gpx.counters['feasible_1'], gpx.counters['feasible_2'],
        gpx.counters['feasible_3'], gpx.counters['feasible'],
        gpx.counters['infeasible'], gpx.counters['fusion_1'],
        gpx.counters['fusion_2'], gpx.counters['fusion_3'],
        gpx.counters['fusion'], gpx.counters['unsolved'],
        sum(ga.counters['cross']), gpx.counters['improved'],
        gpx.counters['failed_0'], gpx.counters['failed_1'],
        gpx.counters['failed_2'], gpx.counters['failed_3'],
        gpx.counters['failed'], gpx.counters['inf_tour_0'],
        gpx.counters['inf_tour_1'], gpx.counters['inf_tour'], improvement,
        sum(ga.counters['mut'])
    ])

    # Timers
    timers[id].extend([
        sum(ga.timers['total']),
        sum(ga.timers['population']),
        sum(ga.timers['evaluation']),
        sum(ga.timers['tournament']),
        sum(ga.timers['recombination']),
        sum(gpx.timers['g_star']),
        sum(gpx.timers['partitioning']),
        sum(gpx.timers['simple_graph']),
        sum(gpx.timers['simple_graph_f']),
        sum(gpx.timers['classification']),
        sum(gpx.timers['fusion']),
        sum(gpx.timers['build']),
        sum(ga.timers['mutation']),
        sum(ga.timers['restart_pop'])
    ])
    # Return data
    return avg_fitness, best_fitness, best_solution, counters, timers