Example #1
0
def main(args):
    # Parameters
    initial_seed = 123456  # Used to generate the set of seeds for repetitions
    n_repetitions = 30
    n_iterations = args.iterations
    initial_pheromone = 0.5
    t_min = 0.001  # Min pheromone level
    t_max = 0.999  # Max pheromone level
    rho = args.rho  # Pheromone decay rate
    alpha = args.alpha
    beta = args.beta

    # Initializations
    random_seeds = utils.generate_seeds(initial_seed, n_repetitions)
    n, p, nodes = utils.read_data(args.dataset)
    world = World(n, p, nodes)
    n_ants = (n - p) if args.ants is None else args.ants
    colony = Colony(n_ants)
    ni = aco.information_heuristic(world)  # Information Heuristic
    dataset_name = args.dataset.split('/')[-1].split('.')[0]
    output = np.zeros((n_repetitions, n_iterations, 3))
    output_dir = "../results/{}it{}rho{}alpha{}beta{}ants{}/".format(
        dataset_name, n_iterations, rho, alpha, beta, n_ants)

    # Main loop
    for repetition in range(n_repetitions):
        np.random.seed(random_seeds[repetition])

        # Reset things for new repetition
        g_best = Solution(distance=np.inf)
        world.reset_pheromones(initial_pheromone)

        print("Repetition {}\n".format(repetition))

        for iteration in tqdm(range(n_iterations)):
            for ant in colony.ants:
                ant.build_solution(world, ni, alpha, beta)

            l_best, l_worst = aco.evaluate_solutions(world, colony)

            world.update_pheromones(rho, g_best, l_best, l_worst)

            # Check algorithm stagnation
            if aco.is_stagnated(world, t_min, t_max):
                world.reset_pheromones(initial_pheromone)

            # Update global solution
            if l_best.distance < g_best.distance:
                g_best = l_best

            # Reset for next iteration
            colony.reset_solutions()

            # Store output data
            output[repetition][iteration][0] = g_best.distance
            output[repetition][iteration][1] = l_best.distance
            output[repetition][iteration][2] = l_worst.distance

        print("\nBest solution\n"
              "-------------\n"
              "Distance: {}\n"
              "Medians: {}\n".format(g_best.distance, g_best.medians))

    utils.write_data(output_dir, output)