'RUNTIME_SPEC': { 'id': 1, 'datadir': 'MNIST_data', 'logdir': 'log/', 'validate_each_n_steps': 10, 'max_number_of_iterations': 600, 'max_runtime': 10, 'max_layer': 5, 'fitness_strategy': 'accuracy', 'fitness_power': 3 } } gen = GA(genetic_hyperparamter) for i in range(genetic_hyperparamter['number_of_generation']): gen.mutate() gen.crossover(strategy=genetic_hyperparamter['crossover']) gen.evaluate( calc_diversity=genetic_hyperparamter['calc_diversity']) gen.selection() print("Gen: " + str(gen.generation) + "-Diversity: " + str(round(gen.diversity)) + "- Fitness_avg: " + str(round(gen.fitness_avg, 3)) + "- Fitness_best: " + str(round(gen.best_candidate.get_fitness(), 3))) gen.write_stats() except Exception as e: print(e) os.makedirs(genetic_hyperparamter['RUNTIME_SPEC']['logdir'], exist_ok=True) with open(os.path.join(genetic_hyperparamter['RUNTIME_SPEC']['logdir'],
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