From e1ae299313b35b0c2208df4261e7980cf238439f Mon Sep 17 00:00:00 2001 From: Louis Date: Sun, 18 Jun 2023 11:15:34 +0200 Subject: [PATCH] making libs and python program to test algorithms. Updating 01 to 05 to use libs --- .../stats_52berlin_aco_0.1_to_120_secs.png | Bin 0 -> 84264 bytes tests/01_cluster_splitter.py | 2 +- tests/02_cluster_recuit_live_animation.py | 11 +-- tests/03_cluster_recuit_no_animation.py | 45 ++-------- tests/101_analyse_aco.py | 81 ++++++++++++++++++ tests/102_analyse_simulated_annealing.py | 76 ++++++++++++++++ tests/clustering.py | 0 tests/data_sample/15_cities_minimum_293.txt | 1 - tests/libs/aco.py | 6 +- tests/libs/simulated_annealing.py | 58 +++++++------ 10 files changed, 201 insertions(+), 79 deletions(-) create mode 100644 .assets/images/stats_52berlin_aco_0.1_to_120_secs.png create mode 100644 tests/101_analyse_aco.py create mode 100644 tests/102_analyse_simulated_annealing.py delete mode 100644 tests/clustering.py delete mode 100644 tests/data_sample/15_cities_minimum_293.txt diff --git a/.assets/images/stats_52berlin_aco_0.1_to_120_secs.png b/.assets/images/stats_52berlin_aco_0.1_to_120_secs.png new file mode 100644 index 0000000000000000000000000000000000000000..398db0ceeca41e6917e3dfd7d5874c74bae12e67 GIT binary patch literal 84264 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 k#^?VRyv^VIM;s20|Iq%0 temperature_ok: - new_solution = current_solution.copy() - # Swap two cities in the route - i = random.randint(0, len(new_solution) - 1) - j = random.randint(0, len(new_solution) - 1) - new_solution[i], new_solution[j] = new_solution[j], new_solution[i] - # Calculate the acceptance probability - current_energy = total_distance(current_solution) - new_energy = total_distance(new_solution) - delta = new_energy - current_energy - if delta < 0 or random.random() < math.exp(-delta / temperature): - current_solution = new_solution - if total_distance(current_solution) < total_distance(best_solution): - best_solution = current_solution - # Cool down - temperature *= cooling_rate - interration += 1 - # Print every 1000 iterations - if interration % 1000 == 0: - print("Cluster", cluster_index, ": iteration", interration, "with current total distance", total_distance(current_solution)) - return best_solution - - -nb_ville = 20 +nb_ville = 100 max_coords = 1000 nb_truck = 4 temperature = 10000 @@ -99,7 +63,8 @@ for i, cluster_indices in enumerate(clusters.values()): cluster_cities = [cities[index] for index in cluster_indices] # Appel de la fonction simulated_annealing - best_route = simulated_annealing(cluster_cities, temperature, cooling_rate, temperature_ok) + simulated_annealing = SimulatedAnnealing(cluster_cities, temperature=10000, cooling_rate=0.999, temperature_ok=0.01) + best_route = simulated_annealing.run() best_routes.append((best_route, color)) print("Final solution for cluster ", i, ":", best_route) diff --git a/tests/101_analyse_aco.py b/tests/101_analyse_aco.py new file mode 100644 index 0000000..1368928 --- /dev/null +++ b/tests/101_analyse_aco.py @@ -0,0 +1,81 @@ +from matplotlib import pyplot as plt +from libs.aco import AntColony, total_distance + +cities = [[37.4393516691, 541.2090699418], [612.1759508571, 494.3166877396], [38.1312338227, 353.1484581781], [53.4418081065, 131.484901365], [143.0606355347, 631.7200953923], [689.9451267256, 468.5354998742], [112.7478815786, 529.417757826], [141.4875865042, 504.818485571], [661.0513901702, 445.9375182115], [98.7899036592, 384.5926031158], [697.3881696597, 180.3962284275], [536.4894189738, 287.2279085051], [192.4067320507, 20.439405931], [282.7865258765, 229.8001556189], [240.8251726391, 281.51414372], [246.9281323057, 322.461332116], [649.7313216456, 62.3331575282], [352.96585626, 666.7873101942], [633.392367658, 534.9398453712], [488.311799404, 437.4869439948], [141.4039286509, 228.4325551488], [17.3632612602, 240.2407068508], [397.5586451389, 231.3591208928], [565.7853781464, 282.3858748974], [475.8975387047, 468.5392706317], [322.4224566559, 550.3165478233], [397.5586634023, 74.7588387765], [672.8618339396, 432.882640963], [571.2189680147, 530.261699153], [104.6531165914, 482.8224768783], [356.7098388794, 67.6477131712], [400.4070255527, 253.6794479997], [282.3036243109, 426.8380500923], [58.7766988363, 507.1712386832], [189.75062244, 460.3815233617], [659.9124120147, 226.6284156239], [639.0307636033, 467.2302300719], [415.0258357432, 233.3045376118], [547.2662016307, 161.6589278401], [616.6547902644, 339.3409309407], [494.8592427417, 148.1217856389], [629.9980812186, 433.4548164038], [471.101431241, 314.2219307579], [138.2440514421, 137.1679919735], [91.5847556724, 110.0203007516], [390.6972811808, 423.9774318385], [565.1617825137, 429.1598152874], [54.5248980387, 438.5515408431], [334.350832971, 153.796923804], [531.0291024509, 612.3874827889], [475.7345905802, 385.7844618897], [228.8325218994, 410.4461939615], [578.3805347586, 321.3303494537], [358.9170574485, 404.4670352898], [486.4648554867, 593.0429937016], [343.169370767, 509.3123571315], [530.3626972076, 137.6881275684], [498.8065475299, 576.2102674608], [224.31827155, 312.4677490415], [595.836073259, 81.8130051356], [661.5588724308, 217.0456944477], [43.6892045516, 305.4722789165], [79.465345253, 445.9641737689], [210.4163247004, 130.7151137038], [432.2642292251, 629.4092661116], [623.2487161301, 69.189285084], [436.5194739944, 282.935645607], [59.4163265482, 40.1280234442], [630.9230074073, 230.342988813], [579.3265539688, 601.0359410602], [117.862450748, 112.9796833705], [297.7912565664, 166.3131886803], [22.7642703744, 455.5340094037], [259.7095810385, 10.6199925885], [342.3579873647, 599.3880182608], [10.0260950143, +488.9310558282], [315.2926064118, 273.2275475579], [220.7044919297, 270.0819745721], [192.1186059948, 314.1839922798], [271.5042718992, 225.2921989972], [530.7320005441, 504.0670155337], [42.5331441666, 656.3645162886], [396.1274792588, 539.4648066027], [118.6631474021, 508.7129103929], [395.6913876595, 699.5376048429], [559.0157105844, 560.8866941411], [22.6471035906, 526.2470392816], [135.6377085256, 325.8409901555], [141.4507014379, 485.2477927763], [396.7741299332, 460.7557115283], [87.7494562765, 19.6170129082], [350.4245639661, 420.6531186835], [216.7010817133, 466.4816410995], [130.9237737024, 351.1491733079], [72.6329856671, 645.7852219213], [144.6002949996, 457.4224283926], [212.3725077442, 594.9216893413], [49.9186786455, 541.4350825349], [656.6943525585, 558.1109593509], [176.5941623792, 648.5239953299], [500.3825200226, 198.7428378322], [634.317867842, 612.8291643194], [59.7537372726, 551.6321886765], [15.2145765106, 143.0441928532], [283.0054378872, 376.4439530184], [146.5389000907, 39.4231794338], [101.8685605377, 635.098685018], [588.1968537448, 580.5946976921], [457.2628632528, 350.0164047376], [537.4663680494, 472.5842276692], [269.3669098585, 367.4763636538], [239.9045383695, 102.629765339], [88.4677500396, 384.0507209275], [658.9133693395, 583.9575181023], [97.7359146347, 157.4558657632], [506.6191384007, 233.0022156094], [500.2566898239, 64.9136393489], [594.4048565021, 275.874186899], [66.230814661, 24.1317387604], [598.4162993909, 414.5557574275], [172.308833083, 344.3963466366], [299.48128518, 251.829512132], [303.8379894831, 21.052606379], [197.896926984, 512.388896098], [56.0199567669, 243.0663818382], [255.5566183121, 448.8651882442], [608.4256112402, 222.5421309272], [70.2722703273, 77.9227026433], [398.2298999899, 119.557657386], [635.4970237093, 133.3225902609], [378.3484559418, 272.2907677147], [484.8029663388, 677.0730379436], [278.8710882619, 299.9308770828], [381.6537300653, 360.3337602785], [557.6070707573, 595.3185092281], [249.0589749342, 76.6595112599], [562.9048787838, 670.0382113114], [398.550436558, 392.6493259144], [590.893972056, 370.7414913742], [558.2008003726, 0.4198814512], [461.4114714423, 530.5254969413], [354.7242881504, 685.40453619], [193.6611295657, +669.7432521028], [352.3140807211, 140.3273323662], [308.434570974, 115.2054269847], [299.588137008, 530.588961902], [334.2748764383, 152.1494569394], [690.9658585947, 134.5793307203], [48.0798124069, 270.968067372], [91.6467647724, 166.3541158474]] +optimal = 6528 + +n_ants = 10 +alpha = 1 +beta = 2 +evaporation = 0.5 +intensification = 2 +max_times = [1, 2, 5] +iterations = 2 + +best_distances = [] +times = [] +colors = [ + '#1f77b4', # Bleu moyen + '#ff7f0e', # Orange + '#2ca02c', # Vert + '#d62728', # Rouge + '#9467bd', # Violet + '#8c564b', # Marron + '#e377c2', # Rose + '#7f7f7f', # Gris + '#bcbd22', # Vert olive + '#17becf', # Turquoise + '#1b9e77', # Vert Teal + '#d95f02', # Orange foncé + '#7570b3', # Violet moyen + '#e7298a', # Fuchsia + '#66a61e', # Vert pomme + '#e6ab02', # Jaune or + '#a6761d', # Bronze + '#666666', # Gris foncé + '#f781bf', # Rose clair + '#999999', # Gris moyen +] + +for max_time in max_times: + for iteration in range(iterations): + ant_colony = AntColony(cities, n_ants, alpha, beta, evaporation, intensification, max_time) + print("Running iteration number {}/{} ({} sec)".format(iteration + 1, iterations, max_time)) + best_route = ant_colony.run() + best_distances.append([total_distance(best_route), colors[max_times.index(max_time) % len(colors)]]) + times.append(max_time) + +title = "" +title += "Best distance per iterations\n" +title += "Ants: " + str(n_ants) + " " +title += "Alpja: " + str(alpha) + " " +title += "Beta: " + str(beta) + " " +title += "Evaporation: " + str(evaporation) + " " +title += "Intensification: " + str(intensification) + " " +title += "Max time: " + str(max_time) +plt.title(title) +plt.xlabel('Iteration') +plt.ylabel('Distance') +plt.axhline(y=optimal, color='r') + +distances = [x[0] for x in best_distances] # Extractions des valeurs + +max_dist = max(distances) +plt.ylim(0, max_dist+max_dist*0.2) + +values = [item[0] for item in best_distances] +colors = [item[1] for item in best_distances] + +bars = plt.bar(range(len(values)), values, color=colors) + +for i, bar in enumerate(bars): + yval = bar.get_height() + plt.text(bar.get_x() + bar.get_width()/2, yval + 0.05, + "dist: {}\ntime: {}s".format(int(yval), times[i]), + rotation=75, ha='center', va='bottom') + +plt.xticks(range(len(values)), [str(i+1) for i in range(len(values))]) + +plt.show() \ No newline at end of file diff --git a/tests/102_analyse_simulated_annealing.py b/tests/102_analyse_simulated_annealing.py new file mode 100644 index 0000000..3565bff --- /dev/null +++ b/tests/102_analyse_simulated_annealing.py @@ -0,0 +1,76 @@ +from matplotlib import pyplot as plt +from libs.simulated_annealing import SimulatedAnnealing, distance, total_distance + +cities = [[565, 575], [25, 185], [345, 750], [945, 685], [845, 655], [880, 660], [25, 230], [525, 1000], [580, 1175], [650, 1130], [1605, 620], [1220, 580], [1465, 200], [1530, 5], [845, 680], [725, 370], [145, 665], [415, 635], [510, 875], [560, 365], [300, 465], [520, 585], [480, 415], [835, 625], [975, 580], [1215, 245], [1320, 315], [1250, 400], [660, 180], [410, 250], [420, 555], [575, 665], [1150, 1160], [700, 580], [685, 595], [685, 610], [770, 610], [795, 645], [720, 635], [760, 650], [475, 960], [95, 260], [875, 920], [700, 500], [555, 815], [830, 485], [1170, 65], [830, 610], [605, 625], [595, 360], [1340, 725], [1740, 245]] +optimal = 7542 + +temperature = 10000 +cooling_rate = 0.999 +temperature_ok = 0.01 +max_times = [1, 2, 5] +iterations = 2 + +best_distances = [] +times = [] +colors = [ + '#1f77b4', # Bleu moyen + '#ff7f0e', # Orange + '#2ca02c', # Vert + '#d62728', # Rouge + '#9467bd', # Violet + '#8c564b', # Marron + '#e377c2', # Rose + '#7f7f7f', # Gris + '#bcbd22', # Vert olive + '#17becf', # Turquoise + '#1b9e77', # Vert Teal + '#d95f02', # Orange foncé + '#7570b3', # Violet moyen + '#e7298a', # Fuchsia + '#66a61e', # Vert pomme + '#e6ab02', # Jaune or + '#a6761d', # Bronze + '#666666', # Gris foncé + '#f781bf', # Rose clair + '#999999', # Gris moyen +] + +for max_time in max_times: + for iteration in range(iterations): + simulated_annealing = SimulatedAnnealing(cities, temperature=10000, cooling_rate=0.999, temperature_ok=0.01) + print("Running iteration number {}/{} ({} sec)".format(iteration + 1, iterations, max_time)) + best_distance, best_route = SimulatedAnnealing.run() + best_distances.append([best_distance, colors[max_times.index(max_time) % len(colors)]]) + times.append(max_time) + +title = "" +title += "Best distance per iterations\n" +title += "Temperature: " + str(temperature) + " " +title += "Cooling rate: " + str(cooling_rate) + " " +title += "Temperature ok: " + str(temperature_ok) + " " +plt.title(title) +plt.xlabel('Iteration') +plt.ylabel('Distance') +plt.axhline(y=optimal, color='r') + +distances = [x[0] for x in best_distances] # Extractions des valeurs + +for best_distance in best_distances: + print(best_distance) +max_dist = max(distances) +plt.ylim(0, max_dist+max_dist*0.2) + +values = [item[0] for item in best_distances] +colors = [item[1] for item in best_distances] + +bars = plt.bar(range(len(values)), values, color=colors) + +for i, bar in enumerate(bars): + yval = bar.get_height() + plt.text(bar.get_x() + bar.get_width()/2, yval + 0.05, + "dist: {}\ntime: {}s".format(int(yval), times[i]), + rotation=75, ha='center', va='bottom') + +plt.xticks(range(len(values)), [str(i+1) for i in range(len(values))]) + +plt.show() \ No newline at end of file diff --git a/tests/clustering.py b/tests/clustering.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/data_sample/15_cities_minimum_293.txt b/tests/data_sample/15_cities_minimum_293.txt deleted file mode 100644 index 9e077dd..0000000 --- a/tests/data_sample/15_cities_minimum_293.txt +++ /dev/null @@ -1 +0,0 @@ -[[-0.0, 0.0], [-21.5, -7.3], [-28.9, -0.0], [-43.1, -14.6], [-50.5, -7.4], [-64.7, -21.9], [-72.1, -0.2], [-79.3, 21.4], [-65.1, 36.1], [-57.6, 43.3], [-50.6, 21.6], [-36.0, 21.6], [-29.1, 43.2], [-14.7, 43.4], [-0.1, 28.7], [-0.0, 0.0]] \ No newline at end of file diff --git a/tests/libs/aco.py b/tests/libs/aco.py index 6fb6f8c..f233665 100644 --- a/tests/libs/aco.py +++ b/tests/libs/aco.py @@ -20,7 +20,7 @@ class AntColony: def choose_next_city(self, ant): unvisited_cities = [i for i in range(self.n) if i not in ant] - probabilities = [self.pheromones[ant[-1]][i] ** self.alpha * ((1 / distance(self.cities[ant[-1]], self.cities[i])) ** self.beta) for i in unvisited_cities] + probabilities = [self.pheromones[ant[-1]][i] ** self.alpha * ((1 / self.distance(self.cities[ant[-1]], self.cities[i])) ** self.beta) for i in unvisited_cities] total = sum(probabilities) if total == 0: probabilities = [1 / len(unvisited_cities) for _ in unvisited_cities] @@ -29,7 +29,7 @@ class AntColony: return np.random.choice(unvisited_cities, p=probabilities) def update_pheromones(self, ant): - pheromones_delta = self.intensification / total_distance([self.cities[i] for i in ant]) + pheromones_delta = self.intensification / self.total_distance([self.cities[i] for i in ant]) for i in range(len(ant) - 1): self.pheromones[ant[i]][ant[i+1]] += pheromones_delta @@ -42,7 +42,7 @@ class AntColony: for ant in ants: for _ in range(self.n - 1): ant.append(self.choose_next_city(ant)) - ant_distance = total_distance([self.cities[i] for i in ant]) + ant_distance = self.total_distance([self.cities[i] for i in ant]) if ant_distance < best_distance: best_distance = ant_distance best_ant = ant.copy() diff --git a/tests/libs/simulated_annealing.py b/tests/libs/simulated_annealing.py index 827d442..70752ba 100644 --- a/tests/libs/simulated_annealing.py +++ b/tests/libs/simulated_annealing.py @@ -6,28 +6,36 @@ def distance(city1, city2): def total_distance(cities): return sum([distance(cities[i - 1], cities[i]) for i in range(len(cities))]) -def simulated_annealing(cities, temperature=10000, cooling_rate=0.9999, temperature_ok=0.001, cluster_index=0): - interration = 0 - current_solution = cities.copy() - best_solution = cities.copy() - while temperature > temperature_ok: - new_solution = current_solution.copy() - # Swap two cities in the route - i = random.randint(0, len(new_solution) - 1) - j = random.randint(0, len(new_solution) - 1) - new_solution[i], new_solution[j] = new_solution[j], new_solution[i] - # Calculate the acceptance probability - current_energy = total_distance(current_solution) - new_energy = total_distance(new_solution) - delta = new_energy - current_energy - if delta < 0 or random.random() < math.exp(-delta / temperature): - current_solution = new_solution - if total_distance(current_solution) < total_distance(best_solution): - best_solution = current_solution - # Cool down - temperature *= cooling_rate - interration += 1 - # Print every 1000 iterations - if interration % 1000 == 0: - print("Cluster", cluster_index, ": iteration", interration, "with current total distance", total_distance(current_solution)) - return best_solution \ No newline at end of file +class SimulatedAnnealing: + def __init__(self, cities, temperature=10000, cooling_rate=0.9999, temperature_ok=0.001, cluster_index=0): + self.cities = cities + self.temperature = temperature + self.cooling_rate = cooling_rate + self.temperature_ok = temperature_ok + self.cluster_index = cluster_index + + def run(self): + interration = 0 + current_solution = self.cities.copy() + best_solution = self.cities.copy() + while self.temperature > self.temperature_ok: + new_solution = current_solution.copy() + # Swap two cities in the route + i = random.randint(0, len(new_solution) - 1) + j = random.randint(0, len(new_solution) - 1) + new_solution[i], new_solution[j] = new_solution[j], new_solution[i] + # Calculate the acceptance probability + current_energy = total_distance(current_solution) + new_energy = total_distance(new_solution) + delta = new_energy - current_energy + if delta < 0 or random.random() < math.exp(-delta / self.temperature): + current_solution = new_solution + if total_distance(current_solution) < total_distance(best_solution): + best_solution = current_solution + # Cool down + self.temperature *= self.cooling_rate + interration += 1 + # Print every 1000 iterations + if interration % 1000 == 0: + print("Cluster", self.cluster_index, ": iteration", interration, "with current total distance", total_distance(current_solution)) + return best_solution \ No newline at end of file