diff --git a/AI_cup_2020_ClaudioMaggioni.xls b/AI_cup_2020_ClaudioMaggioni.xls index 869e54a..31fa45b 100644 Binary files a/AI_cup_2020_ClaudioMaggioni.xls and b/AI_cup_2020_ClaudioMaggioni.xls differ diff --git a/claudio.maggioni.zip b/claudio.maggioni.zip new file mode 100644 index 0000000..629f39a Binary files /dev/null and b/claudio.maggioni.zip differ diff --git a/code/aco.cc b/code/aco.cc index dfff53e..a03e3e7 100644 --- a/code/aco.cc +++ b/code/aco.cc @@ -1,7 +1,7 @@ // vim: set ts=2 sw=2 et tw=80: // compile with -// g++ -lpthread --std=c++11 -o c_prob/aco aco.cc +// c++ -O2 -lpthread --std=c++11 -o c_prob/aco aco.cc opt.cc #include #include @@ -104,7 +104,7 @@ struct ant { attractiveness[loc] = pow(pheromone_amount, alpha) * pow(1 / distance, beta); - //cerr << "ant " << idx << " attr[loc]=" << attractiveness[loc] << endl; + sum_total += attractiveness[loc]; if (isnan(sum_total)) { cerr << "nanalert " << attractiveness[loc] << " " << pheromone_amount << " " << distance << endl; } @@ -126,7 +126,7 @@ struct ant { double cumulative = 0.0; for (uint loc : idxs) { double weight = (attractiveness[loc] / sum_total); - //cerr << "ant " << idx << " w: " << weight + cumulative << endl; + if (toss <= (weight + cumulative)) { return loc; } @@ -206,7 +206,6 @@ void update_pheromone_map() { double mainloop(size_t i) { - //cerr << "starting ants" << endl; #if SINGLE_CORE for (uint j = 0; j < n_ants; j++) { ant_thread(&(ants[j])); @@ -215,17 +214,19 @@ double mainloop(size_t i) { for (uint j = 0; j < n_ants; j++) { pthread_create(&(ants[j].t_handle), NULL, ant_thread, &(ants[j])); } - // cerr << "joining ants" << endl; for (uint j = 0; j < n_ants; j++) { pthread_join(ants[j].t_handle, NULL); } #endif - //cerr << "summing ants" << endl; + unsigned long sum = 0L; for (uint j = 0; j < n_ants; j++) { populate_ant_updated_pheromone_map(ants[j]); sum += ants[j].distance_travelled; + if (ants[j].iter > 200 && n_nodes == 76) { // eil76 after 200th iteration + three_opt(ants[j].route, dist_matrix, ants[j].distance_travelled); + } if (sh_dist < 0 || ants[j].distance_travelled < sh_dist) { sh_dist = ants[j].distance_travelled; @@ -244,45 +245,6 @@ double mainloop(size_t i) { memset(ant_updated_pheromone_map, 0, sizeof(ant_updated_pheromone_map)); return (double) sum / (double) n_ants; - - /*double real = 0; - for (uint k = 0; k < n_nodes; k++) { - real += dist_matrix[sh_route[k]][sh_route[(k + 1) % n_nodes]]; - }*/ - - //cerr << "iteration " << i << ": dist " << sh_dist << endl;// << " os " << os << " rdist " << real << endl; - /* - uint nnz = 0; - double sum = 0, min = 1.0/0.0, max = -1.0/0.0; - for (int i = 0; i < n_nodes; i++) { - for (int j = 0; j < n_nodes - 1; j++) { - if (pheromone_map[i][j] != 0.0) nnz++; - sum += pheromone_map[i][j]; - if (min > pheromone_map[i][j]) min = pheromone_map[i][j]; - if (max < pheromone_map[i][j]) max = pheromone_map[i][j]; - } - } - cerr << "phmap: avg " << sum / (double) (n_nodes * n_nodes) << " min " << min << " max " << max << " nnz " << nnz << endl;*/ -} - -uint two_opt() { - uint swaps = 0; - for (int i = 0; i < n_nodes - 1; i++) { - for (int j = i+2; j < n_nodes; j++) { - size_t ip = i == 0 ? (n_nodes - 1) : (i - 1); - size_t ei = sh_route[i], ej = sh_route[j], eii = sh_route[ip], - ejj = sh_route[j]; - double new_dist = sh_dist - dist_matrix[eii][ei] - dist_matrix[ejj][ej] - + dist_matrix[ei][ej] + dist_matrix[ejj][eii]; - if (new_dist < sh_dist) { - //cerr << "2opt " << i << " " << j << ": " << new_dist << endl; - sh_dist = new_dist; - reverse(sh_route.begin() + i, sh_route.begin() + j); - swaps++; - } - } - } - return swaps; } uint two_five_opt() { diff --git a/code/aco/ant_colony.py b/code/aco/ant_colony.py index 119c43b..83821c3 100644 --- a/code/aco/ant_colony.py +++ b/code/aco/ant_colony.py @@ -1,6 +1,8 @@ import os dir = "c_prob/" + + def ant_colony_opt(instance): fname = dir + instance.name + ".txt" @@ -11,24 +13,24 @@ def ant_colony_opt(instance): # single core params params = { - "eil76": (0.9, 8, 0.4, 1000, 500, 200, 30), # 543 - "d198": (0.9, 8, 0.4, 1000, 250, 125, 5), # 15871 - "ch130": (0.9, 8, 0.4, 1000, 1750, 25, 30), # 6212 - "kroA100": (0.9, 8, 0.4, 1000, 750, 100, 30), # 21378 - "lin318": (0.9, 8, 0.4, 1000, 500, 32, 30), # 43171 - "pcb442": (0.9, 8, 0.4, 1000, 450, 24, 3), # 52466 - "pr439": (0.9, 8, 0.4, 1000, 1000, 15, 3), # 109721 - "rat783": (0.9, 8, 0.4, 1000, 300, 28, 4), # 9218 - "u1060": (0.9, 8, 0.4, 1000, 350, 8, 10), # 235506 - "fl1577": (0.9, 8, 0.4, 1000, 50, 10, 7), # 23020 + "eil76": (0.75, 5, 0.5, 1000, 500, 217, 0), # 538 + "d198": (0.9, 8, 0.4, 1000, 250, 125, 5), # 15871 + "ch130": (0.9, 8, 0.4, 1000, 1750, 25, 30), # 6212 + "kroA100": (0.9, 8, 0.4, 1000, 750, 100, 30), # 21378 + "lin318": (0.9, 8, 0.4, 1000, 500, 32, 30), # 43171 + "pcb442": (0.9, 8, 0.4, 1000, 450, 24, 3), # 52466 + "pr439": (0.9, 8, 0.4, 1000, 1000, 15, 3), # 109721 + "rat783": (0.9, 8, 0.4, 1000, 300, 28, 4), # 9218 + "u1060": (0.9, 8, 0.4, 1000, 350, 8, 10), # 235506 + "fl1577": (0.9, 8, 0.4, 1000, 50, 10, 7), # 23020 } alpha, beta, evap, weight, ants, loops, optruns = params[instance.name] # Call C++ program cmd = dir + "aco " + str(instance.nPoints) + " " + str(loops) + " " + str(ants) + \ - " " + str(alpha) + " " + str(beta) + " " + str(evap) + " " + str(weight) + \ - " " + str(optruns) + " < " + fname + " &2>/dev/null" + " " + str(alpha) + " " + str(beta) + " " + str(evap) + " " + str(weight) + \ + " " + str(optruns) + " < " + fname + " &2>/dev/null" print(cmd) solution = eval(os.popen(cmd).read()) solution.append(solution[0]) diff --git a/code/results.csv b/code/results.csv index 0dcc30d..54ccdee 100644 --- a/code/results.csv +++ b/code/results.csv @@ -1,11 +1,11 @@ ,tour length,optimal solution,gap,time to solve -"('./problems/pr439.tsp', ""'C++ ant colony optimization'"")",109721.0,107217.0,2.34,67.09 -"('./problems/pcb442.tsp', ""'C++ ant colony optimization'"")",52466.0,50778.0,3.32,51.523 -"('./problems/d198.tsp', ""'C++ ant colony optimization'"")",15871.0,15780.0,0.58,33.43 -"('./problems/fl1577.tsp', ""'C++ ant colony optimization'"")",23020.0,22249.0,3.47,112.319 -"('./problems/ch130.tsp', ""'C++ ant colony optimization'"")",6212.0,6110.0,1.67,21.834 -"('./problems/u1060.tsp', ""'C++ ant colony optimization'"")",235506.0,224094.0,5.09,104.112 -"('./problems/kroA100.tsp', ""'C++ ant colony optimization'"")",21378.0,21282.0,0.45,24.245 -"('./problems/eil76.tsp', ""'C++ ant colony optimization'"")",543.0,538.0,0.93,20.232 -"('./problems/rat783.tsp', ""'C++ ant colony optimization'"")",9218.0,8806.0,4.68,124.22 -"('./problems/lin318.tsp', ""'C++ ant colony optimization'"")",43171.0,42029.0,2.72,42.92 +"('./problems/pr439.tsp', ""'C++ ant colony optimization'"")",109721.0,107217.0,2.34,73.964 +"('./problems/pcb442.tsp', ""'C++ ant colony optimization'"")",52466.0,50778.0,3.32,55.061 +"('./problems/d198.tsp', ""'C++ ant colony optimization'"")",15871.0,15780.0,0.58,40.628 +"('./problems/fl1577.tsp', ""'C++ ant colony optimization'"")",23020.0,22249.0,3.47,117.572 +"('./problems/ch130.tsp', ""'C++ ant colony optimization'"")",6212.0,6110.0,1.67,22.515 +"('./problems/u1060.tsp', ""'C++ ant colony optimization'"")",235506.0,224094.0,5.09,106.849 +"('./problems/kroA100.tsp', ""'C++ ant colony optimization'"")",21378.0,21282.0,0.45,24.607 +"('./problems/eil76.tsp', ""'C++ ant colony optimization'"")",538.0,538.0,0.0,29.083 +"('./problems/rat783.tsp', ""'C++ ant colony optimization'"")",9218.0,8806.0,4.68,129.275 +"('./problems/lin318.tsp', ""'C++ ant colony optimization'"")",43171.0,42029.0,2.72,49.496 diff --git a/code/run.py b/code/run.py index fbc8666..d7bdb8f 100644 --- a/code/run.py +++ b/code/run.py @@ -6,9 +6,11 @@ import os import sys def run(show_plots=False, verbose=False): - os.system("rm -f " + " ".join(glob.glob("sol/*.sol") + glob.glob("c_prob/*.txt"))) if sys.argv[1] == "all": + os.system("rm -f " + " ".join(glob.glob("sol/*.sol") + glob.glob("c_prob/*.txt"))) os.system("c++ -O2 -lpthread --std=c++11 -o c_prob/aco aco.cc opt.cc") + else: + os.system("rm -f " + " ".join(glob.glob("c_prob/*.txt"))) problems = glob.glob('./problems/*.tsp') if sys.argv[1] == "all" else ["./problems/"+sys.argv[1]+".tsp"] results = [] @@ -34,7 +36,7 @@ def run(show_plots=False, verbose=False): solver.duration]) with open("sol/" + prob_instance.name + ".sol", "w") as f: - print(solution, file=f) + print(list(map(lambda x: x + 1, solution)), file=f) if show_plots: solver.plot_solution()