Merge branch 'Test' into 'main'

Test

See merge request axok/a3-algorithmique-avancee!3
This commit is contained in:
Louis DUMONT 2023-06-18 10:32:30 +00:00
commit 42240fdab7
166 changed files with 3131 additions and 446 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.pyc

File diff suppressed because one or more lines are too long

610
VRP.ipynb Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,85 @@
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
import random, time
from libs.clustering import split_tour_across_clusters
def generate_cities(nb, max_coords=1000):
return [random.sample(range(max_coords), 2) for _ in range(nb)]
def plot_clusters(cities, clusters):
# Création d'une liste de couleurs pour les différents clusters
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
]
# Création d'un nouveau graphique
plt.figure()
# Pour chaque cluster
for i, cluster in clusters.items():
# Sélection d'une couleur pour le cluster
color = colors[i % len(colors)]
# Pour chaque ville dans le cluster
for city_index in cluster:
# Récupération des coordonnées de la ville
city = cities[city_index]
# Ajout de la ville au graphique
plt.scatter(city[0], city[1], c=color, s=20)
# show first city in black and twice bigger
plt.scatter(cities[0][0], cities[0][1], c='k', s=200)
# Affichage du graphique
plt.show()
nb_ville = 1000
max_coords = 1000
nb_truck = 2
# Define the coordinates of the cities
# And set depot at the first city in the middle of the map
start_time_generate = time.time()
cities = generate_cities(nb_ville, max_coords)
cities[0] = [max_coords/2, max_coords/2]
stop_time_generate = time.time()
# Split the tour across clusters with nb_truck trucks
start_time_split = time.time()
clusters = split_tour_across_clusters(cities, nb_truck)
stop_time_split = time.time()
# show the number of cities in each cluster
for cluster in clusters.values():
print(len(cluster))
# show the time
print("\n---- TIME ----")
print("generate cities time: ", stop_time_generate - start_time_generate)
print("split cities time: ", stop_time_split - start_time_split)
# show the clusters
plot_clusters(cities, clusters)

View File

@ -0,0 +1,101 @@
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
import random, time, math
from libs.clustering import split_tour_across_clusters
from libs.simulated_annealing import total_distance
def generate_cities(nb, max_coords=1000):
return [random.sample(range(max_coords), 2) for _ in range(nb)]
previous_route = None
def draw_cities(cities, previous_route, color='b', title=' '):
plt.title(title)
# If there's a previous route, we remove it.
if previous_route is not None:
previous_route.remove()
x = [city[0] for city in cities]
y = [city[1] for city in cities]
x.append(x[0])
y.append(y[0])
# We plot the route with the specified color and keep a reference to the Line2D object.
previous_route, = plt.plot(x, y, color=color, marker='x', linestyle='-')
plt.draw()
plt.pause(0.005)
# We return the reference so we can remove this route when a new one is found.
return previous_route
def simulated_annealing(cities, color='b', temperature=100000, cooling_rate=0.9999, temperature_ok=0.001):
interration = 0
plt.ion()
current_solution = cities.copy()
best_solution = cities.copy()
previous_route = draw_cities(best_solution, None, color, 'Initial solution')
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
previous_route = draw_cities(best_solution, previous_route, color, 'Current best solution, total distance = ' + str(total_distance(best_solution)) + ', iteration = ' + str(interration))
# Cool down
temperature *= cooling_rate
interration += 1
plt.ioff()
return best_solution
nb_ville = 50
max_coords = 1000
nb_truck = 4
temperature = 10000
cooling_rate = 0.999
temperature_ok = 0.000001
start_time_generate = time.time()
cities = generate_cities(nb_ville, max_coords) # generate 100 cities
cities[0] = [max_coords/2, max_coords/2] # placing depot at the center
stop_time_generate = time.time()
start_time_split = time.time()
clusters = split_tour_across_clusters(cities, nb_truck)
stop_time_split = time.time()
for cluster in clusters.values():
print(len(cluster))
print("\n---- TIME ----")
print("generate cities time: ", stop_time_generate - start_time_generate)
print("split cities time: ", stop_time_split - start_time_split)
# create new figure for annealing paths
plt.figure()
colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k']
for i, cluster_indices in enumerate(clusters.values()):
# Sélection d'une couleur pour le cluster
color = colors[i % len(colors)]
# Récupération des coordonnées de la ville
cluster_cities = [cities[index] for index in cluster_indices]
# Appel de la fonction simulated_annealing avec la couleur choisie
best_route = simulated_annealing(cluster_cities, color, temperature, cooling_rate, temperature_ok)
print("Final solution for cluster ", i, ":", best_route)
print("Total distance: ", total_distance(best_route))
plt.show()

View File

@ -0,0 +1,80 @@
import matplotlib.pyplot as plt
import random, time
from libs.clustering import split_tour_across_clusters
from libs.simulated_annealing import SimulatedAnnealing, total_distance
def generate_cities(nb, max_coords=1000):
return [random.sample(range(max_coords), 2) for _ in range(nb)]
nb_ville = 100
max_coords = 1000
nb_truck = 4
temperature = 10000
cooling_rate = 0.999
temperature_ok = 0.001
start_time_generate = time.time()
cities = generate_cities(nb_ville, max_coords)
cities[0] = [max_coords/2, max_coords/2]
stop_time_generate = time.time()
start_time_split = time.time()
clusters = split_tour_across_clusters(cities, nb_truck)
stop_time_split = time.time()
for cluster in clusters.values():
print(len(cluster))
print("\n---- TIME ----")
print("generate cities time: ", stop_time_generate - start_time_generate)
print("split cities time: ", stop_time_split - start_time_split)
# create new figure for annealing paths
plt.figure()
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
]
best_routes = []
for i, cluster_indices in enumerate(clusters.values()):
# Sélection d'une couleur pour le cluster
color = colors[i % len(colors)]
# Récupération des coordonnées de la ville
cluster_cities = [cities[index] for index in cluster_indices]
# Appel de la fonction simulated_annealing
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)
print("Total distance: ", total_distance(best_route))
for i, (route, color) in enumerate(best_routes):
x = [city[0] for city in route]
y = [city[1] for city in route]
x.append(x[0])
y.append(y[0])
plt.plot(x, y, color=color, marker='x', linestyle='-', label=f"Cluster {i}")
plt.legend(loc="best")
plt.show()

View File

@ -0,0 +1,142 @@
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
import random, time, math
from libs.clustering import split_tour_across_clusters
random.seed(3)
def generate_cities(nb, max_coords=1000):
return [random.sample(range(max_coords), 2) for _ in range(nb)]
def distance(city1, city2):
return math.sqrt((city1[0] - city2[0]) ** 2 + (city1[1] - city2[1]) ** 2) + 1e-10
def total_distance(cities):
return sum([distance(cities[i - 1], cities[i]) for i in range(len(cities))])
class AntColony:
def __init__(self, cities, n_ants, alpha=1, beta=2, evaporation=0.5, intensification=2, max_time=0.1):
self.cities = cities
self.n = len(cities)
self.n_ants = n_ants
self.alpha = alpha
self.beta = beta
self.evaporation = evaporation
self.intensification = intensification
self.max_time = max_time
self.pheromones = [[1 / self.n for _ in range(self.n)] for __ in range(self.n)]
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]
total = sum(probabilities)
if total == 0:
probabilities = [1 / len(unvisited_cities) for _ in unvisited_cities]
else:
probabilities = [p / total for p in probabilities]
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])
for i in range(len(ant) - 1):
self.pheromones[ant[i]][ant[i+1]] += pheromones_delta
def run(self):
best_ant = []
best_distance = float('inf')
start_time = time.time()
while time.time() - start_time < self.max_time:
ants = [[random.randint(0, self.n - 1)] for _ in range(self.n_ants)]
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])
if ant_distance < best_distance:
best_distance = ant_distance
best_ant = ant.copy()
self.update_pheromones(ant)
self.pheromones = [[(1 - self.evaporation) * p for p in row] for row in self.pheromones]
return [self.cities[i] for i in best_ant]
nb_ville = 50
max_coords = 1000
nb_truck = 2
max_time = 3
nb_ants = 10
max_time_per_cluster = max_time / nb_truck
start_time_generate = time.time()
cities = generate_cities(nb_ville, max_coords)
cities[0] = [max_coords/2, max_coords/2]
stop_time_generate = time.time()
start_time_split = time.time()
clusters = split_tour_across_clusters(cities, nb_truck)
stop_time_split = time.time()
for cluster in clusters.values():
print(len(cluster))
print("\n---- TIME ----")
print("generate cities time: ", stop_time_generate - start_time_generate)
print("split cities time: ", stop_time_split - start_time_split)
# create new figure for annealing paths
plt.figure()
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
]
best_routes = []
for i, cluster_indices in enumerate(clusters.values()):
# Sélection d'une couleur pour le cluster
color = colors[i % len(colors)]
# Récupération des coordonnées de la ville
cluster_cities = [cities[index] for index in cluster_indices]
# Appel de la fonction AntColony.run
ant_colony = AntColony(cluster_cities, n_ants=nb_ants, max_time=max_time_per_cluster)
best_route = ant_colony.run()
best_routes.append((best_route, color))
print("Total distance for cluster", i, ": ", total_distance(best_route))
# calculate total distance for all clusters
full_total_distance = 0
for route, color in best_routes:
full_total_distance += total_distance(route)
print("Total distance for all clusters: ", full_total_distance)
for i, (route, color) in enumerate(best_routes):
x = [city[0] for city in route]
y = [city[1] for city in route]
x.append(x[0])
y.append(y[0])
plt.plot(x, y, color=color, marker='x', linestyle='-', label=f"Cluster {i}")
# add title with nb_ville, nb_truck and max_time
plt.title(f"nb_ville = {nb_ville}, nb_truck = {nb_truck}, max_time = {max_time}")
plt.show()

View File

@ -0,0 +1,166 @@
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
import random, time, math
from libs.clustering import split_tour_across_clusters
random.seed(3)
def generate_cities(nb, max_coords=1000):
return [random.sample(range(max_coords), 2) for _ in range(nb)]
def distance(city1, city2):
return math.sqrt((city1[0] - city2[0]) ** 2 + (city1[1] - city2[1]) ** 2) + 1e-10
def total_distance(cities):
return sum([distance(cities[i - 1], cities[i]) for i in range(len(cities))])
class AntColony:
def __init__(self, cities, n_ants, alpha=1, beta=2, evaporation=0.5, intensification=2, max_time=0.1):
self.cities = cities
self.n = len(cities)
self.n_ants = n_ants
self.alpha = alpha
self.beta = beta
self.evaporation = evaporation
self.intensification = intensification
self.max_time = max_time
self.pheromones = [[1 / self.n for _ in range(self.n)] for __ in range(self.n)]
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]
total = sum(probabilities)
if total == 0:
probabilities = [1 / len(unvisited_cities) for _ in unvisited_cities]
else:
probabilities = [p / total for p in probabilities]
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])
for i in range(len(ant) - 1):
self.pheromones[ant[i]][ant[i+1]] += pheromones_delta
def run(self):
best_ant = []
best_distance = float('inf')
start_time = time.time()
while time.time() - start_time < self.max_time:
ants = [[random.randint(0, self.n - 1)] for _ in range(self.n_ants)]
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])
if ant_distance < best_distance:
best_distance = ant_distance
best_ant = ant.copy()
self.update_pheromones(ant)
self.pheromones = [[(1 - self.evaporation) * p for p in row] for row in self.pheromones]
return [self.cities[i] for i in best_ant]
def simulated_annealing(cities, temperature=10000, cooling_rate=0.9999, temperature_ok=0.1):
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
return best_solution
nb_ville = 50
max_coords = 1000
nb_truck = 2
max_time = 3
nb_ants = 10
max_time_per_cluster = max_time / nb_truck
start_time_generate = time.time()
cities = generate_cities(nb_ville, max_coords)
cities[0] = [max_coords/2, max_coords/2]
stop_time_generate = time.time()
start_time_split = time.time()
clusters = split_tour_across_clusters(cities, nb_truck)
stop_time_split = time.time()
for cluster in clusters.values():
print(len(cluster))
print("\n---- TIME ----")
print("generate cities time: ", stop_time_generate - start_time_generate)
print("split cities time: ", stop_time_split - start_time_split)
# create new figure for annealing paths
plt.figure()
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
]
best_routes = []
for i, cluster_indices in enumerate(clusters.values()):
# Sélection d'une couleur pour le cluster
color = colors[i % len(colors)]
# Récupération des coordonnées de la ville
cluster_cities = [cities[index] for index in cluster_indices]
# Appel de la fonction AntColony.run
ant_colony = AntColony(cluster_cities, n_ants=nb_ants, max_time=max_time_per_cluster)
best_route = ant_colony.run()
best_route = simulated_annealing(best_route)
best_routes.append((best_route, color))
print("Total distance for cluster", i, ": ", total_distance(best_route))
# calculate total distance for all clusters
full_total_distance = 0
for route, color in best_routes:
full_total_distance += total_distance(route)
print("Total distance for all clusters: ", full_total_distance)
for i, (route, color) in enumerate(best_routes):
x = [city[0] for city in route]
y = [city[1] for city in route]
x.append(x[0])
y.append(y[0])
plt.plot(x, y, color=color, marker='x', linestyle='-', label=f"Cluster {i}")
# add title with nb_ville, nb_truck and max_time
plt.title(f"nb_ville = {nb_ville}, nb_truck = {nb_truck}, max_time = {max_time}")
plt.show()

81
tests/101_analyse_aco.py Normal file
View File

@ -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()

View File

@ -0,0 +1,75 @@
from matplotlib import pyplot as plt
from libs.simulated_annealing import SimulatedAnnealing, total_distance
cities = [[6734, 1453], [2233, 10], [5530, 1424], [401, 841], [3082, 1644], [7608, 4458], [7573, 3716], [7265, 1268], [6898, 1885], [1112, 2049], [5468, 2606], [5989, 2873], [4706, 2674], [4612, 2035], [6347, 2683], [6107, 669], [7611, 5184], [7462, 3590], [7732, 4723], [5900, 3561], [4483, 3369], [6101, 1110], [5199, 2182], [1633, 2809], [4307, 2322], [675, 1006], [7555, 4819], [7541, 3981], [3177, 756], [7352, 4506], [7545, 2801], [3245, 3305], [6426, 3173], [4608, 1198], [23, 2216], [7248, 3779], [7762, 4595], [7392, 2244], [3484, 2829], [6271, 2135], [4985, 140], [1916, 1569], [7280, 4899], [7509, 3239], [10, 2676], [6807, 2993], [5185, 3258], [3023, 1942]]
optimal = 33523
temperatures = [100000, 1000000, 10000000, 100000000]
cooling_rate = 0.99999
temperature_ok = 0.000001
iterations = 2
best_distances = []
temps = []
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 temperature in temperatures:
for iteration in range(iterations):
simulated_annealing = SimulatedAnnealing(cities, temperature=temperature, cooling_rate=0.999, temperature_ok=0.01)
print("Running iteration number {}/{} ({} temperature)".format(iteration + 1, iterations, temperature))
best_route = simulated_annealing.run()
best_distances.append([total_distance(best_route), colors[temperatures.index(temperature) % len(colors)]])
temps.append(temperature)
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), temps[i]),
rotation=75, ha='center', va='bottom')
plt.xticks(range(len(values)), [str(i+1) for i in range(len(values))])
plt.show()

View File

@ -0,0 +1,3 @@
[[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]]

View File

@ -0,0 +1 @@
[[-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]]

View File

@ -0,0 +1 @@
[['6734', '1453'], ['2233', '10'], ['5530', '1424'], ['401', '841'], ['3082', '1644'], ['7608', '4458'], ['7573', '3716'], ['7265', '1268'], ['6898', '1885'], ['1112', '2049'], ['5468', '2606'], ['5989', '2873'], ['4706', '2674'], ['4612', '2035'], ['6347', '2683'], ['6107', '669'], ['7611', '5184'], ['7462', '3590'], ['7732', '4723'], ['5900', '3561'], ['4483', '3369'], ['6101', '1110'], ['5199', '2182'], ['1633', '2809'], ['4307', '2322'], ['675', '1006'], ['7555', '4819'], ['7541', '3981'], ['3177', '756'], ['7352', '4506'], ['7545', '2801'], ['3245', '3305'], ['6426', '3173'], ['4608', '1198'], ['23', '2216'], ['7248', '3779'], ['7762', '4595'], ['7392', '2244'], ['3484', '2829'], ['6271', '2135'], ['4985', '140'], ['1916', '1569'], ['7280', '4899'], ['7509', '3239'], ['10', '2676'], ['6807', '2993'], ['5185', '3258'], ['3023', '1942']]

View File

@ -0,0 +1,3 @@
[['22', '22'], ['36', '26'], ['21', '45'], ['45', '35'], ['55', '20'], ['33', '34'], ['50', '50'], ['55', '45'], ['26', '59'], ['40', '66'], ['55', '65'], ['35', '51'], ['62', '35'], ['62', '57'], ['62', '24'], ['21', '36'], ['33', '44'], ['9', '56'], ['62', '48'], ['66', '14'],
['44', '13'], ['26', '13'], ['11', '28'], ['7', '43'], ['17', '64'], ['41', '46'], ['55', '34'], ['35', '16'], ['52', '26'], ['43', '26'], ['31', '76'], ['22', '53'], ['26', '29'], ['50', '40'], ['55', '50'], ['54', '10'], ['60', '15'], ['47', '66'], ['30', '60'], ['30', '50'], ['12', '17'], ['15', '14'], ['16', '19'], ['21', '48'], ['50', '30'], ['51', '42'], ['50', '15'], ['48', '21'], ['12', '38'], ['15', '56'], ['29', '39'], ['54', '38'], ['55', '57'], ['67', '41'], ['10', '70'], ['6', '25'], ['65', '27'], ['40', '60'], ['70', '64'], ['64', '4'], ['36', '6'], ['30', '20'], ['20', '30'], ['15', '5'], ['50', '70'], ['57', '72'], ['45', '42'], ['38', '33'], ['50', '4'], ['66', '8'], ['59',
'5'], ['35', '60'], ['27', '24'], ['40', '20'], ['40', '37'], ['40', '40']]

Binary file not shown.

View File

@ -0,0 +1,287 @@
NAME : a280
COMMENT : drilling problem (Ludwig)
TYPE : TSP
DIMENSION: 280
EDGE_WEIGHT_TYPE : EUC_2D
NODE_COORD_SECTION
1 288 149
2 288 129
3 270 133
4 256 141
5 256 157
6 246 157
7 236 169
8 228 169
9 228 161
10 220 169
11 212 169
12 204 169
13 196 169
14 188 169
15 196 161
16 188 145
17 172 145
18 164 145
19 156 145
20 148 145
21 140 145
22 148 169
23 164 169
24 172 169
25 156 169
26 140 169
27 132 169
28 124 169
29 116 161
30 104 153
31 104 161
32 104 169
33 90 165
34 80 157
35 64 157
36 64 165
37 56 169
38 56 161
39 56 153
40 56 145
41 56 137
42 56 129
43 56 121
44 40 121
45 40 129
46 40 137
47 40 145
48 40 153
49 40 161
50 40 169
51 32 169
52 32 161
53 32 153
54 32 145
55 32 137
56 32 129
57 32 121
58 32 113
59 40 113
60 56 113
61 56 105
62 48 99
63 40 99
64 32 97
65 32 89
66 24 89
67 16 97
68 16 109
69 8 109
70 8 97
71 8 89
72 8 81
73 8 73
74 8 65
75 8 57
76 16 57
77 8 49
78 8 41
79 24 45
80 32 41
81 32 49
82 32 57
83 32 65
84 32 73
85 32 81
86 40 83
87 40 73
88 40 63
89 40 51
90 44 43
91 44 35
92 44 27
93 32 25
94 24 25
95 16 25
96 16 17
97 24 17
98 32 17
99 44 11
100 56 9
101 56 17
102 56 25
103 56 33
104 56 41
105 64 41
106 72 41
107 72 49
108 56 49
109 48 51
110 56 57
111 56 65
112 48 63
113 48 73
114 56 73
115 56 81
116 48 83
117 56 89
118 56 97
119 104 97
120 104 105
121 104 113
122 104 121
123 104 129
124 104 137
125 104 145
126 116 145
127 124 145
128 132 145
129 132 137
130 140 137
131 148 137
132 156 137
133 164 137
134 172 125
135 172 117
136 172 109
137 172 101
138 172 93
139 172 85
140 180 85
141 180 77
142 180 69
143 180 61
144 180 53
145 172 53
146 172 61
147 172 69
148 172 77
149 164 81
150 148 85
151 124 85
152 124 93
153 124 109
154 124 125
155 124 117
156 124 101
157 104 89
158 104 81
159 104 73
160 104 65
161 104 49
162 104 41
163 104 33
164 104 25
165 104 17
166 92 9
167 80 9
168 72 9
169 64 21
170 72 25
171 80 25
172 80 25
173 80 41
174 88 49
175 104 57
176 124 69
177 124 77
178 132 81
179 140 65
180 132 61
181 124 61
182 124 53
183 124 45
184 124 37
185 124 29
186 132 21
187 124 21
188 120 9
189 128 9
190 136 9
191 148 9
192 162 9
193 156 25
194 172 21
195 180 21
196 180 29
197 172 29
198 172 37
199 172 45
200 180 45
201 180 37
202 188 41
203 196 49
204 204 57
205 212 65
206 220 73
207 228 69
208 228 77
209 236 77
210 236 69
211 236 61
212 228 61
213 228 53
214 236 53
215 236 45
216 228 45
217 228 37
218 236 37
219 236 29
220 228 29
221 228 21
222 236 21
223 252 21
224 260 29
225 260 37
226 260 45
227 260 53
228 260 61
229 260 69
230 260 77
231 276 77
232 276 69
233 276 61
234 276 53
235 284 53
236 284 61
237 284 69
238 284 77
239 284 85
240 284 93
241 284 101
242 288 109
243 280 109
244 276 101
245 276 93
246 276 85
247 268 97
248 260 109
249 252 101
250 260 93
251 260 85
252 236 85
253 228 85
254 228 93
255 236 93
256 236 101
257 228 101
258 228 109
259 228 117
260 228 125
261 220 125
262 212 117
263 204 109
264 196 101
265 188 93
266 180 93
267 180 101
268 180 109
269 180 117
270 180 125
271 196 145
272 204 145
273 212 145
274 220 145
275 228 145
276 236 145
277 246 141
278 252 125
279 260 129
280 280 133
EOF

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,58 @@
NAME : berlin52.opt.tour
TYPE : TOUR
DIMENSION : 52
TOUR_SECTION
1
49
32
45
19
41
8
9
10
43
33
51
11
52
14
13
47
26
27
28
12
25
4
6
15
5
24
48
38
37
40
39
36
35
34
44
46
16
29
50
20
23
30
2
7
42
21
17
3
18
31
22
-1
EOF

Binary file not shown.

View File

@ -0,0 +1,60 @@
NAME: berlin52
TYPE: TSP
COMMENT: 52 locations in Berlin (Groetschel)
DIMENSION: 52
EDGE_WEIGHT_TYPE: EUC_2D
NODE_COORD_SECTION
1 565.0 575.0
2 25.0 185.0
3 345.0 750.0
4 945.0 685.0
5 845.0 655.0
6 880.0 660.0
7 25.0 230.0
8 525.0 1000.0
9 580.0 1175.0
10 650.0 1130.0
11 1605.0 620.0
12 1220.0 580.0
13 1465.0 200.0
14 1530.0 5.0
15 845.0 680.0
16 725.0 370.0
17 145.0 665.0
18 415.0 635.0
19 510.0 875.0
20 560.0 365.0
21 300.0 465.0
22 520.0 585.0
23 480.0 415.0
24 835.0 625.0
25 975.0 580.0
26 1215.0 245.0
27 1320.0 315.0
28 1250.0 400.0
29 660.0 180.0
30 410.0 250.0
31 420.0 555.0
32 575.0 665.0
33 1150.0 1160.0
34 700.0 580.0
35 685.0 595.0
36 685.0 610.0
37 770.0 610.0
38 795.0 645.0
39 720.0 635.0
40 760.0 650.0
41 475.0 960.0
42 95.0 260.0
43 875.0 920.0
44 700.0 500.0
45 555.0 815.0
46 830.0 485.0
47 1170.0 65.0
48 830.0 610.0
49 605.0 625.0
50 595.0 360.0
51 1340.0 725.0
52 1740.0 245.0
EOF

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,157 @@
NAME: ch150
TYPE: TSP
COMMENT: 150 city Problem (churritz)
DIMENSION: 150
EDGE_WEIGHT_TYPE: EUC_2D
NODE_COORD_SECTION
1 37.4393516691 541.2090699418
2 612.1759508571 494.3166877396
3 38.1312338227 353.1484581781
4 53.4418081065 131.4849013650
5 143.0606355347 631.7200953923
6 689.9451267256 468.5354998742
7 112.7478815786 529.4177578260
8 141.4875865042 504.8184855710
9 661.0513901702 445.9375182115
10 98.7899036592 384.5926031158
11 697.3881696597 180.3962284275
12 536.4894189738 287.2279085051
13 192.4067320507 20.4394059310
14 282.7865258765 229.8001556189
15 240.8251726391 281.5141437200
16 246.9281323057 322.4613321160
17 649.7313216456 62.3331575282
18 352.9658562600 666.7873101942
19 633.3923676580 534.9398453712
20 488.3117994040 437.4869439948
21 141.4039286509 228.4325551488
22 17.3632612602 240.2407068508
23 397.5586451389 231.3591208928
24 565.7853781464 282.3858748974
25 475.8975387047 468.5392706317
26 322.4224566559 550.3165478233
27 397.5586634023 74.7588387765
28 672.8618339396 432.8826409630
29 571.2189680147 530.2616991530
30 104.6531165914 482.8224768783
31 356.7098388794 67.6477131712
32 400.4070255527 253.6794479997
33 282.3036243109 426.8380500923
34 58.7766988363 507.1712386832
35 189.7506224400 460.3815233617
36 659.9124120147 226.6284156239
37 639.0307636033 467.2302300719
38 415.0258357432 233.3045376118
39 547.2662016307 161.6589278401
40 616.6547902644 339.3409309407
41 494.8592427417 148.1217856389
42 629.9980812186 433.4548164038
43 471.1014312410 314.2219307579
44 138.2440514421 137.1679919735
45 91.5847556724 110.0203007516
46 390.6972811808 423.9774318385
47 565.1617825137 429.1598152874
48 54.5248980387 438.5515408431
49 334.3508329710 153.7969238040
50 531.0291024509 612.3874827889
51 475.7345905802 385.7844618897
52 228.8325218994 410.4461939615
53 578.3805347586 321.3303494537
54 358.9170574485 404.4670352898
55 486.4648554867 593.0429937016
56 343.1693707670 509.3123571315
57 530.3626972076 137.6881275684
58 498.8065475299 576.2102674608
59 224.3182715500 312.4677490415
60 595.8360732590 81.8130051356
61 661.5588724308 217.0456944477
62 43.6892045516 305.4722789165
63 79.4653452530 445.9641737689
64 210.4163247004 130.7151137038
65 432.2642292251 629.4092661116
66 623.2487161301 69.1892850840
67 436.5194739944 282.9356456070
68 59.4163265482 40.1280234442
69 630.9230074073 230.3429888130
70 579.3265539688 601.0359410602
71 117.8624507480 112.9796833705
72 297.7912565664 166.3131886803
73 22.7642703744 455.5340094037
74 259.7095810385 10.6199925885
75 342.3579873647 599.3880182608
76 10.0260950143 488.9310558282
77 315.2926064118 273.2275475579
78 220.7044919297 270.0819745721
79 192.1186059948 314.1839922798
80 271.5042718992 225.2921989972
81 530.7320005441 504.0670155337
82 42.5331441666 656.3645162886
83 396.1274792588 539.4648066027
84 118.6631474021 508.7129103929
85 395.6913876595 699.5376048429
86 559.0157105844 560.8866941411
87 22.6471035906 526.2470392816
88 135.6377085256 325.8409901555
89 141.4507014379 485.2477927763
90 396.7741299332 460.7557115283
91 87.7494562765 19.6170129082
92 350.4245639661 420.6531186835
93 216.7010817133 466.4816410995
94 130.9237737024 351.1491733079
95 72.6329856671 645.7852219213
96 144.6002949996 457.4224283926
97 212.3725077442 594.9216893413
98 49.9186786455 541.4350825349
99 656.6943525585 558.1109593509
100 176.5941623792 648.5239953299
101 500.3825200226 198.7428378322
102 634.3178678420 612.8291643194
103 59.7537372726 551.6321886765
104 15.2145765106 143.0441928532
105 283.0054378872 376.4439530184
106 146.5389000907 39.4231794338
107 101.8685605377 635.0986850180
108 588.1968537448 580.5946976921
109 457.2628632528 350.0164047376
110 537.4663680494 472.5842276692
111 269.3669098585 367.4763636538
112 239.9045383695 102.6297653390
113 88.4677500396 384.0507209275
114 658.9133693395 583.9575181023
115 97.7359146347 157.4558657632
116 506.6191384007 233.0022156094
117 500.2566898239 64.9136393489
118 594.4048565021 275.8741868990
119 66.2308146610 24.1317387604
120 598.4162993909 414.5557574275
121 172.3088330830 344.3963466366
122 299.4812851800 251.8295121320
123 303.8379894831 21.0526063790
124 197.8969269840 512.3888960980
125 56.0199567669 243.0663818382
126 255.5566183121 448.8651882442
127 608.4256112402 222.5421309272
128 70.2722703273 77.9227026433
129 398.2298999899 119.5576573860
130 635.4970237093 133.3225902609
131 378.3484559418 272.2907677147
132 484.8029663388 677.0730379436
133 278.8710882619 299.9308770828
134 381.6537300653 360.3337602785
135 557.6070707573 595.3185092281
136 249.0589749342 76.6595112599
137 562.9048787838 670.0382113114
138 398.5504365580 392.6493259144
139 590.8939720560 370.7414913742
140 558.2008003726 0.4198814512
141 461.4114714423 530.5254969413
142 354.7242881504 685.4045361900
143 193.6611295657 669.7432521028
144 352.3140807211 140.3273323662
145 308.4345709740 115.2054269847
146 299.5881370080 530.5889619020
147 334.2748764383 152.1494569394
148 690.9658585947 134.5793307203
149 48.0798124069 270.9680673720
150 91.6467647724 166.3541158474
EOF

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,83 @@
NAME : eil76
COMMENT : 76-city problem (Christofides/Eilon)
TYPE : TSP
DIMENSION : 76
EDGE_WEIGHT_TYPE : EUC_2D
NODE_COORD_SECTION
1 22 22
2 36 26
3 21 45
4 45 35
5 55 20
6 33 34
7 50 50
8 55 45
9 26 59
10 40 66
11 55 65
12 35 51
13 62 35
14 62 57
15 62 24
16 21 36
17 33 44
18 9 56
19 62 48
20 66 14
21 44 13
22 26 13
23 11 28
24 7 43
25 17 64
26 41 46
27 55 34
28 35 16
29 52 26
30 43 26
31 31 76
32 22 53
33 26 29
34 50 40
35 55 50
36 54 10
37 60 15
38 47 66
39 30 60
40 30 50
41 12 17
42 15 14
43 16 19
44 21 48
45 50 30
46 51 42
47 50 15
48 48 21
49 12 38
50 15 56
51 29 39
52 54 38
53 55 57
54 67 41
55 10 70
56 6 25
57 65 27
58 40 60
59 70 64
60 64 4
61 36 6
62 30 20
63 20 30
64 15 5
65 50 70
66 57 72
67 45 42
68 38 33
69 50 4
70 66 8
71 59 5
72 35 60
73 27 24
74 40 20
75 40 37
76 40 40
EOF

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,362 @@
NAME: fri26
TYPE: TSP
COMMENT: 26 Staedte (Fricker)
DIMENSION: 26
EDGE_WEIGHT_TYPE: EXPLICIT
EDGE_WEIGHT_FORMAT: LOWER_DIAG_ROW
EDGE_WEIGHT_SECTION
0
83
0
93
40
0
129
53
42
0
133
62
42
11
0
139
64
49
11
9
0
151
91
59
46
35
39
0
169
116
81
72
61
65
26
0
135
93
54
65
55
63
34
37
0
114
84
44
70
62
71
52
59
22
0
110
95
58
88
82
90
71
75
39
20
0
98
98
64
100
95
103
88
92
56
36
18
0
99
89
54
89
84
92
77
83
47
26
11
11
0
95
68
31
66
62
71
63
76
40
20
27
34
23
0
81
67
36
76
74
82
78
91
55
34
32
31
24
15
0
152
127
86
102
93
100
66
54
37
43
42
56
53
62
73
0
159
156
117
142
133
141
110
98
78
74
61
63
68
87
92
44
0
181
175
135
156
146
153
119
103
91
91
80
85
89
106
112
54
22
0
172
152
112
127
117
124
88
70
62
68
64
75
74
87
96
26
34
33
0
185
165
125
139
128
135
98
78
74
82
77
87
87
100
109
39
38
29
13
0
147
160
124
155
148
156
130
122
96
86
68
62
71
93
93
68
30
46
63
68
0
157
180
147
180
173
181
156
148
122
111
92
83
93
116
113
94
53
64
87
90
26
0
185
223
193
228
222
230
206
198
172
160
140
129
140
163
158
144
102
107
135
136
77
50
0
220
268
241
278
272
280
257
250
223
210
190
178
189
212
205
196
154
157
186
186
128
102
51
0
127
179
157
197
194
202
188
188
155
136
116
100
111
132
122
139
109
125
141
148
80
65
64
93
0
181
197
161
190
182
190
160
148
128
121
103
99
107
130
130
95
51
51
81
79
37
27
58
107
90
0
EOF

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,21 @@
NAME: gr17
TYPE: TSP
COMMENT: 17-city problem (Groetschel)
DIMENSION: 17
EDGE_WEIGHT_TYPE: EXPLICIT
EDGE_WEIGHT_FORMAT: LOWER_DIAG_ROW
EDGE_WEIGHT_SECTION
0 633 0 257 390 0 91 661 228 0 412 227
169 383 0 150 488 112 120 267 0 80 572 196
77 351 63 0 134 530 154 105 309 34 29 0
259 555 372 175 338 264 232 249 0 505 289 262
476 196 360 444 402 495 0 353 282 110 324 61
208 292 250 352 154 0 324 638 437 240 421 329
297 314 95 578 435 0 70 567 191 27 346 83
47 68 189 439 287 254 0 211 466 74 182 243
105 150 108 326 336 184 391 145 0 268 420 53
239 199 123 207 165 383 240 140 448 202 57 0
246 745 472 237 528 364 332 349 202 685 542 157
289 426 483 0 121 518 142 84 297 35 29 36
236 390 238 301 55 96 153 336 0
EOF

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,33 @@
NAME: gr24
TYPE: TSP
COMMENT: 24-city problem (Groetschel)
DIMENSION: 24
EDGE_WEIGHT_TYPE: EXPLICIT
EDGE_WEIGHT_FORMAT: LOWER_DIAG_ROW
EDGE_WEIGHT_SECTION
0 257 0 187 196 0 91 228 158 0 150 112
96 120 0 80 196 88 77 63 0 130 167 59
101 56 25 0 134 154 63 105 34 29 22 0
243 209 286 159 190 216 229 225 0 185 86 124
156 40 124 95 82 207 0 214 223 49 185 123
115 86 90 313 151 0 70 191 121 27 83 47
64 68 173 119 148 0 272 180 315 188 193 245
258 228 29 159 342 209 0 219 83 172 149 79
139 134 112 126 62 199 153 97 0 293 50 232
264 148 232 203 190 248 122 259 227 219 134 0
54 219 92 82 119 31 43 58 238 147 84 53
267 170 255 0 211 74 81 182 105 150 121 108
310 37 160 145 196 99 125 173 0 290 139 98
261 144 176 164 136 389 116 147 224 275 178 154
190 79 0 268 53 138 239 123 207 178 165 367
86 187 202 227 130 68 230 57 86 0 261 43
200 232 98 200 171 131 166 90 227 195 137 69
82 223 90 176 90 0 175 128 76 146 32 76
47 30 222 56 103 109 225 104 164 99 57 112
114 134 0 250 99 89 221 105 189 160 147 349
76 138 184 235 138 114 212 39 40 46 136 96
0 192 228 235 108 119 165 178 154 71 136 262
110 74 96 264 187 182 261 239 165 151 221 0
121 142 99 84 35 29 42 36 220 70 126 55
249 104 178 60 96 175 153 146 47 135 169 0
EOF

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More