Merge remote-tracking branch 'origin/Test' into Test
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 126 KiB |
BIN
.assets/images/stats_aco_alpha1-2_beta2-5.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
@ -264,7 +264,7 @@
|
||||
"id": "7670fdf4-884c-4352-83fa-eed0c8b50074",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## <u>Resolution algorithm </u>"
|
||||
"## <u>Resolution algorithm (with coordinates)</u>"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -287,809 +287,7 @@
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import numpy as np\n",
|
||||
"import random, time, math\n",
|
||||
"from tests.clustering import split_tour_across_clusters"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"id": "c177ac22",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "AttributeError",
|
||||
"evalue": "module 'networkx.linalg.graphmatrix' has no attribute 'to_numpy_matrix'",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
|
||||
"Cell \u001b[1;32mIn[17], line 41\u001b[0m\n\u001b[0;32m 38\u001b[0m \u001b[39mreturn\u001b[39;00m adjacency_matrix\n\u001b[0;32m 40\u001b[0m \u001b[39m# Générer la matrice d'adjacence pondérée\u001b[39;00m\n\u001b[1;32m---> 41\u001b[0m weighted_adjacency_matrix \u001b[39m=\u001b[39m generate_weighted_adjacency_matrix(graph)\n\u001b[0;32m 43\u001b[0m \u001b[39m# Afficher la matrice d'adjacence pondérée\u001b[39;00m\n\u001b[0;32m 44\u001b[0m \u001b[39mprint\u001b[39m(weighted_adjacency_matrix)\n",
|
||||
"Cell \u001b[1;32mIn[17], line 36\u001b[0m, in \u001b[0;36mgenerate_weighted_adjacency_matrix\u001b[1;34m(graph)\u001b[0m\n\u001b[0;32m 34\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mgenerate_weighted_adjacency_matrix\u001b[39m(graph):\n\u001b[0;32m 35\u001b[0m \u001b[39m# Créer une matrice d'adjacence pondérée à partir du graphe\u001b[39;00m\n\u001b[1;32m---> 36\u001b[0m adjacency_matrix \u001b[39m=\u001b[39m graphmatrix\u001b[39m.\u001b[39;49mto_numpy_matrix(graph, weight\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mdistance\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[0;32m 38\u001b[0m \u001b[39mreturn\u001b[39;00m adjacency_matrix\n",
|
||||
"\u001b[1;31mAttributeError\u001b[0m: module 'networkx.linalg.graphmatrix' has no attribute 'to_numpy_matrix'"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"\n",
|
||||
"import random\n",
|
||||
"import numpy as np\n",
|
||||
"import networkx as nx\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import time as time\n",
|
||||
"\n",
|
||||
"from networkx.linalg import graphmatrix\n",
|
||||
"\n",
|
||||
"def generate_graph(num_nodes):\n",
|
||||
" G = nx.Graph()\n",
|
||||
" G.add_nodes_from(range(num_nodes + 1))\n",
|
||||
" \n",
|
||||
" for node in G.nodes():\n",
|
||||
" connected_nodes = sorted(set(G.nodes()) - {node})\n",
|
||||
" if len(connected_nodes) < 2:\n",
|
||||
" continue\n",
|
||||
" distance1 = random.randint(1, 10)\n",
|
||||
" distance2 = random.randint(1, 10)\n",
|
||||
" random_nodes = random.sample(connected_nodes, 2)\n",
|
||||
" G.add_edges_from([(node, random_nodes[0], {'distance': distance1}),\n",
|
||||
" (node, random_nodes[1], {'distance': distance2})])\n",
|
||||
"\n",
|
||||
" while not nx.is_connected(G):\n",
|
||||
" node1, node2 = random.sample(G.nodes(), 2)\n",
|
||||
" if not G.has_edge(node1, node2):\n",
|
||||
" distance = random.randint(1, 10)\n",
|
||||
" G.add_edge(node1, node2, distance=distance)\n",
|
||||
"\n",
|
||||
" return G\n",
|
||||
"\n",
|
||||
"graph = generate_graph(12)\n",
|
||||
"A = nx.adjacency_matrix(graph)\n",
|
||||
"\n",
|
||||
"def generate_weighted_adjacency_matrix(graph):\n",
|
||||
" # Créer une matrice d'adjacence pondérée à partir du graphe\n",
|
||||
" adjacency_matrix = graphmatrix.to_numpy_matrix(graph, weight='distance')\n",
|
||||
"\n",
|
||||
" return adjacency_matrix\n",
|
||||
"\n",
|
||||
"# Générer la matrice d'adjacence pondérée\n",
|
||||
"weighted_adjacency_matrix = generate_weighted_adjacency_matrix(graph)\n",
|
||||
"\n",
|
||||
"# Afficher la matrice d'adjacence pondérée\n",
|
||||
"print(weighted_adjacency_matrix)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def generate_distance_matrix(graph):\n",
|
||||
" num_nodes = graph.number_of_nodes()\n",
|
||||
" distance_array = np.full((num_nodes, num_nodes), float('inf')) # Initialiser avec l'infini\n",
|
||||
" for edge in graph.edges(data=True):\n",
|
||||
" i, j, data = edge\n",
|
||||
" distance_array[i][j] = data['distance']\n",
|
||||
" distance_array[j][i] = data['distance'] # Pour un graphe non orienté\n",
|
||||
" np.fill_diagonal(distance_array, 0) # Remplir la diagonale avec des zéros\n",
|
||||
" return distance_array\n",
|
||||
"\n",
|
||||
"# Générer la matrice de distances\n",
|
||||
"distance_matrix = generate_distance_matrix(graph)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Afficher la matrice de distances\n",
|
||||
"print(distance_matrix)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Dessiner le graphe\n",
|
||||
"nx.draw(graph, with_labels=True)\n",
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "9aac4453",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# On applique l'algorithme des fourmis (ACO) sur notre graphe\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"id": "23e32e2a",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Meilleure solution : [[6, 5, 4, 8, 1, 11, 0], [9, 3, 7, 12, 10, 2, 0]]\n",
|
||||
"Distance totale : 81.0\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import concurrent.futures\n",
|
||||
"num_trucks = 2 # Nombre de camions disponibles\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Fonction d'évaluation de la qualité d'une solution (ici, la distance totale)\n",
|
||||
"def evaluate_solution(solution, distances):\n",
|
||||
" total_distance = 0\n",
|
||||
" num_nodes = len(solution)\n",
|
||||
"\n",
|
||||
" for i in range(num_nodes - 1):\n",
|
||||
" current_node = solution[i]\n",
|
||||
" next_node = solution[i + 1]\n",
|
||||
" total_distance += distances[current_node][next_node]\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" # Ajouter la distance de retour au dépôt\n",
|
||||
" total_distance += distances[solution[-1]][solution[0]]\n",
|
||||
"\n",
|
||||
" return total_distance\n",
|
||||
"\n",
|
||||
" \n",
|
||||
"def ant_colony_optimization(distances, num_ants, num_iterations, evaporation_rate, alpha, beta, num_trucks):\n",
|
||||
" num_nodes = len(distances)\n",
|
||||
" \n",
|
||||
" pheromone = np.ones((num_nodes, num_nodes)) # Matrice de phéromones initiale\n",
|
||||
" best_solution = None\n",
|
||||
" best_distance = float('inf')\n",
|
||||
"\n",
|
||||
" start_time = time.time()\n",
|
||||
"\n",
|
||||
" for iteration in range(num_iterations):\n",
|
||||
" # Construction de solutions par les fourmis\n",
|
||||
" solutions = []\n",
|
||||
"\n",
|
||||
" for ant in range(num_ants):\n",
|
||||
" visited = set()\n",
|
||||
" current_node = random.randint(0, num_nodes - 1)\n",
|
||||
" visited.add(current_node)\n",
|
||||
" solution = [current_node]\n",
|
||||
"\n",
|
||||
" while len(visited) < num_nodes:\n",
|
||||
" next_node = None\n",
|
||||
" probabilities = []\n",
|
||||
"\n",
|
||||
" # Calcul des probabilités de choisir chaque prochain nœud\n",
|
||||
" for node in range(num_nodes):\n",
|
||||
" if node not in visited and (node !=0 or len(visited) == num_nodes - 1):\n",
|
||||
" pheromone_value = pheromone[current_node][node]\n",
|
||||
" distance_value = distances[current_node][node]\n",
|
||||
" probability = (pheromone_value ** alpha) * ((1 / distance_value) ** beta)\n",
|
||||
" probabilities.append((node, probability))\n",
|
||||
"\n",
|
||||
" total_probability = sum(prob for _, prob in probabilities)\n",
|
||||
" probabilities = [(node, prob / total_probability) for node, prob in probabilities]\n",
|
||||
"\n",
|
||||
" \n",
|
||||
" roulette_wheel = random.random()\n",
|
||||
" probability_sum = 0\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" for node, probability in probabilities:\n",
|
||||
" \n",
|
||||
" probability_sum += probability\n",
|
||||
" if probability_sum >= roulette_wheel:\n",
|
||||
" next_node = node\n",
|
||||
" break\n",
|
||||
"\n",
|
||||
" visited.add(next_node)\n",
|
||||
" solution.append(next_node)\n",
|
||||
" current_node = next_node\n",
|
||||
"\n",
|
||||
" # Ajouter le retour au dépôt central à la fin du trajet\n",
|
||||
" solution.append(0)\n",
|
||||
"\n",
|
||||
" solutions.append(solution)\n",
|
||||
"\n",
|
||||
" # Évaluation des solutions et mise à jour de la meilleure solution\n",
|
||||
" for solution in solutions:\n",
|
||||
" distance = evaluate_solution(solution, distances)\n",
|
||||
" if distance < best_distance:\n",
|
||||
" best_solution = solution\n",
|
||||
" best_distance = distance\n",
|
||||
"\n",
|
||||
" # Mise à jour des phéromones\n",
|
||||
" pheromone *= evaporation_rate # Évaporation des phéromones existantes\n",
|
||||
"\n",
|
||||
" for solution in solutions:\n",
|
||||
" delta_pheromone = 1 / evaluate_solution(solution, distances)\n",
|
||||
" for i in range(num_nodes - 1):\n",
|
||||
" node1 = solution[i]\n",
|
||||
" node2 = solution[i + 1]\n",
|
||||
" pheromone[node1][node2] += delta_pheromone\n",
|
||||
" pheromone[node2][node1] += delta_pheromone\n",
|
||||
"\n",
|
||||
" # Séparer la meilleure solution en trajets pour chaque camion\n",
|
||||
" truck_solutions = []\n",
|
||||
" num_nodes_per_truck = num_nodes // num_trucks\n",
|
||||
"\n",
|
||||
" for i in range(num_trucks):\n",
|
||||
" start_index = i * num_nodes_per_truck\n",
|
||||
" end_index = start_index + num_nodes_per_truck\n",
|
||||
" truck_solution = best_solution[start_index:end_index]\n",
|
||||
" truck_solutions.append(truck_solution + [0])\n",
|
||||
" \n",
|
||||
"\n",
|
||||
" return truck_solutions, best_distance\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def trucks_thread(i, num_nodes_per_truck, best_solution, truck_solutions):\n",
|
||||
" start_index = i * num_nodes_per_truck\n",
|
||||
" end_index = start_index + num_nodes_per_truck\n",
|
||||
" truck_solution = best_solution[start_index:end_index]\n",
|
||||
" truck_solutions.append(truck_solution)\n",
|
||||
" return truck_solutions\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"num_ants = 10\n",
|
||||
"num_iterations = 100\n",
|
||||
"evaporation_rate = 0.5\n",
|
||||
"alpha = 1\n",
|
||||
"beta = 1\n",
|
||||
"\n",
|
||||
"best_truck_solutions, best_distance = ant_colony_optimization(distance_matrix, num_ants, num_iterations, evaporation_rate, alpha, beta, num_trucks)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"print(\"Meilleure solution :\", best_truck_solutions)\n",
|
||||
"print(\"Distance totale :\", best_distance)\n",
|
||||
" "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"id": "6928bbbd",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "AttributeError",
|
||||
"evalue": "module 'networkx' has no attribute 'from_numpy_matrix'",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
|
||||
"Cell \u001b[1;32mIn[11], line 114\u001b[0m\n\u001b[0;32m 111\u001b[0m \u001b[39m# Pour chaque solution de camion, nous devons trouver le chemin le plus court du dépôt au premier nœud du chemin\u001b[39;00m\n\u001b[0;32m 112\u001b[0m \u001b[39mfor\u001b[39;00m i, truck_solution \u001b[39min\u001b[39;00m \u001b[39menumerate\u001b[39m(best_truck_solutions):\n\u001b[0;32m 113\u001b[0m \u001b[39m# Créer un graphe à partir de la matrice de distance\u001b[39;00m\n\u001b[1;32m--> 114\u001b[0m G \u001b[39m=\u001b[39m nx\u001b[39m.\u001b[39;49mfrom_numpy_matrix(distance_matrix)\n\u001b[0;32m 116\u001b[0m \u001b[39m# Utiliser l'algorithme de Dijkstra pour trouver le chemin le plus court du dépôt (nœud 0) au premier nœud du chemin du camion\u001b[39;00m\n\u001b[0;32m 117\u001b[0m shortest_path \u001b[39m=\u001b[39m nx\u001b[39m.\u001b[39mdijkstra_path(G, \u001b[39m0\u001b[39m, truck_solution[\u001b[39m1\u001b[39m])\n",
|
||||
"\u001b[1;31mAttributeError\u001b[0m: module 'networkx' has no attribute 'from_numpy_matrix'"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"num_trucks = 2 # Nombre de camions disponibles\n",
|
||||
"\n",
|
||||
"def evaluate_solution(solution, distances):\n",
|
||||
" total_distance = 0\n",
|
||||
" num_nodes = len(solution)\n",
|
||||
"\n",
|
||||
" # Calculer la distance entre chaque paire consécutive de nœuds dans la solution\n",
|
||||
" for i in range(num_nodes - 1):\n",
|
||||
" current_node = solution[i]\n",
|
||||
" next_node = solution[i + 1]\n",
|
||||
" total_distance += distances[current_node][next_node]\n",
|
||||
"\n",
|
||||
" # Ajouter la distance de retour au dépôt\n",
|
||||
" total_distance += distances[solution[-1]][solution[0]]\n",
|
||||
"\n",
|
||||
" return total_distance\n",
|
||||
"\n",
|
||||
"def ant_colony_optimization(distances, num_ants, num_iterations, evaporation_rate, alpha, beta, num_trucks):\n",
|
||||
" num_nodes = len(distances)\n",
|
||||
" \n",
|
||||
" pheromone = np.ones((num_nodes, num_nodes)) # Matrice de phéromones initiale\n",
|
||||
" best_solution = None\n",
|
||||
" best_distance = float('inf')\n",
|
||||
"\n",
|
||||
" for iteration in range(num_iterations):\n",
|
||||
" # Construction de solutions par les fourmis\n",
|
||||
" solutions = []\n",
|
||||
"\n",
|
||||
" for ant in range(num_ants):\n",
|
||||
" visited = set()\n",
|
||||
" current_node = 0 # Initialiser current_node à 0\n",
|
||||
" visited.add(current_node)\n",
|
||||
" solution = [current_node]\n",
|
||||
"\n",
|
||||
" while len(visited) < num_nodes:\n",
|
||||
" next_node = None\n",
|
||||
" probabilities = []\n",
|
||||
"\n",
|
||||
" # Calcul des probabilités de choisir chaque prochain nœud\n",
|
||||
" for node in range(num_nodes):\n",
|
||||
" if node not in visited and node < len(pheromone) and current_node < len(pheromone):\n",
|
||||
" pheromone_value = pheromone[current_node][node]\n",
|
||||
" distance_value = distances[current_node][node]\n",
|
||||
" probability = (pheromone_value ** alpha) * ((1 / distance_value) ** beta)\n",
|
||||
" probabilities.append((node, probability))\n",
|
||||
"\n",
|
||||
" total_probability = sum(prob for _, prob in probabilities)\n",
|
||||
" probabilities = [(node, prob / total_probability) for node, prob in probabilities]\n",
|
||||
"\n",
|
||||
" roulette_wheel = random.random()\n",
|
||||
" probability_sum = 0\n",
|
||||
"\n",
|
||||
" for node, probability in probabilities:\n",
|
||||
" probability_sum += probability\n",
|
||||
" if probability_sum >= roulette_wheel:\n",
|
||||
" next_node = node\n",
|
||||
" break\n",
|
||||
"\n",
|
||||
" visited.add(next_node)\n",
|
||||
" solution.append(next_node)\n",
|
||||
" current_node = next_node\n",
|
||||
"\n",
|
||||
" # Ajouter le retour au dépôt central à la fin du trajet\n",
|
||||
" solution.append(0)\n",
|
||||
"\n",
|
||||
" solutions.append(solution)\n",
|
||||
"\n",
|
||||
" # Évaluation des solutions et mise à jour de la meilleure solution\n",
|
||||
" for solution in solutions:\n",
|
||||
" distance = evaluate_solution(solution, distances)\n",
|
||||
" if distance < best_distance:\n",
|
||||
" best_solution = solution\n",
|
||||
" best_distance = distance\n",
|
||||
"\n",
|
||||
" # Mise à jour des phéromones\n",
|
||||
" pheromone *= evaporation_rate # Évaporation des phéromones existantes\n",
|
||||
"\n",
|
||||
" for solution in solutions:\n",
|
||||
" delta_pheromone = 1 / evaluate_solution(solution, distances)\n",
|
||||
" for i in range(num_nodes - 1):\n",
|
||||
" node1 = solution[i]\n",
|
||||
" node2 = solution[i + 1]\n",
|
||||
" pheromone[node1][node2] += delta_pheromone\n",
|
||||
" pheromone[node2][node1] += delta_pheromone\n",
|
||||
"\n",
|
||||
" # Séparer la meilleure solution en trajets pour chaque camion\n",
|
||||
" truck_solutions = []\n",
|
||||
" num_nodes_per_truck = num_nodes // num_trucks\n",
|
||||
"\n",
|
||||
" for i in range(num_trucks):\n",
|
||||
" start_index = i * num_nodes_per_truck\n",
|
||||
" end_index = start_index + num_nodes_per_truck\n",
|
||||
" truck_solution = best_solution[start_index:end_index]\n",
|
||||
" truck_solutions.append(truck_solution + [0])\n",
|
||||
" \n",
|
||||
"\n",
|
||||
" return truck_solutions, best_distance\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"num_ants = 10\n",
|
||||
"num_iterations = 100\n",
|
||||
"evaporation_rate = 0.5\n",
|
||||
"alpha = 1\n",
|
||||
"beta = 1\n",
|
||||
"\n",
|
||||
"best_truck_solutions,best_distance = ant_colony_optimization(distance_matrix, num_ants, num_iterations, evaporation_rate, alpha, beta, num_trucks)\n",
|
||||
"\n",
|
||||
"# Pour chaque solution de camion, nous devons trouver le chemin le plus court du dépôt au premier nœud du chemin\n",
|
||||
"for i, truck_solution in enumerate(best_truck_solutions):\n",
|
||||
" # Créer un graphe à partir de la matrice de distance\n",
|
||||
" G = nx.from_numpy_matrix(distance_matrix)\n",
|
||||
" \n",
|
||||
" # Utiliser l'algorithme de Dijkstra pour trouver le chemin le plus court du dépôt (nœud 0) au premier nœud du chemin du camion\n",
|
||||
" shortest_path = nx.dijkstra_path(G, 0, truck_solution[1])\n",
|
||||
" \n",
|
||||
" # Remplacer le premier nœud du chemin du camion par le chemin le plus court trouvé\n",
|
||||
" best_truck_solutions[i] = [0] + shortest_path + truck_solution[2:]\n",
|
||||
"\n",
|
||||
"# Calculer la distance totale pour chaque solution de camion\n",
|
||||
"total_distances = [evaluate_solution(truck_solution, distance_matrix) for truck_solution in best_truck_solutions]\n",
|
||||
"\n",
|
||||
"# Afficher les solutions et les distances totales pour chaque camion\n",
|
||||
"for i, (truck_solution, total_distance) in enumerate(zip(best_truck_solutions, total_distances)):\n",
|
||||
" print(f\"Camion {i+1} :\")\n",
|
||||
" print(\"Solution :\", truck_solution)\n",
|
||||
" print(\"Distance totale :\", total_distance)\n",
|
||||
" print()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "421c05e1",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "a6ffa6c9",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"def ant_colony_optimization(distances, num_ants, num_iterations, evaporation_rate, alpha, beta, num_trucks):\n",
|
||||
" num_nodes = len(distances)\n",
|
||||
" \n",
|
||||
" pheromone = np.ones((num_nodes, num_nodes)) # Matrice de phéromones initiale\n",
|
||||
" best_solution = None\n",
|
||||
" best_distance = float('inf')\n",
|
||||
"\n",
|
||||
" for iteration in range(num_iterations):\n",
|
||||
" # Construction de solutions par les fourmis\n",
|
||||
" solutions = []\n",
|
||||
"\n",
|
||||
" for ant in range(num_ants):\n",
|
||||
" visited = set()\n",
|
||||
" current_node = 0 # Tous les camions partent du dépôt\n",
|
||||
" visited.add(current_node)\n",
|
||||
" solution = [current_node]\n",
|
||||
"\n",
|
||||
" while len(visited) < num_nodes:\n",
|
||||
" next_node = None\n",
|
||||
" probabilities = []\n",
|
||||
"\n",
|
||||
" # Calcul des probabilités de choisir chaque prochain nœud\n",
|
||||
" for node in range(num_nodes):\n",
|
||||
" if node not in visited:\n",
|
||||
" pheromone_value = pheromone[current_node][node]\n",
|
||||
" distance_value = distances[current_node][node]\n",
|
||||
" probability = (pheromone_value ** alpha) * ((1 / distance_value) ** beta)\n",
|
||||
" probabilities.append((node, probability))\n",
|
||||
"\n",
|
||||
" total_probability = sum(prob for _, prob in probabilities)\n",
|
||||
" probabilities = [(node, prob / total_probability) for node, prob in probabilities]\n",
|
||||
"\n",
|
||||
" roulette_wheel = random.random()\n",
|
||||
" probability_sum = 0\n",
|
||||
"\n",
|
||||
" for node, probability in probabilities:\n",
|
||||
" probability_sum += probability\n",
|
||||
" if probability_sum >= roulette_wheel:\n",
|
||||
" next_node = node\n",
|
||||
" break\n",
|
||||
"\n",
|
||||
" visited.add(next_node)\n",
|
||||
" solution.append(next_node)\n",
|
||||
" current_node = next_node\n",
|
||||
"\n",
|
||||
" # Ajouter le retour au dépôt central à la fin du trajet\n",
|
||||
" solution.append(0)\n",
|
||||
"\n",
|
||||
" solutions.append(solution)\n",
|
||||
"\n",
|
||||
" # Évaluation des solutions et mise à jour de la meilleure solution\n",
|
||||
" for solution in solutions:\n",
|
||||
" distance = evaluate_solution(solution, distances)\n",
|
||||
" if distance < best_distance:\n",
|
||||
" best_solution = solution\n",
|
||||
" best_distance = distance\n",
|
||||
"\n",
|
||||
" # Mise à jour des phéromones\n",
|
||||
" pheromone *= evaporation_rate # Évaporation des phéromones existantes\n",
|
||||
"\n",
|
||||
" for solution in solutions:\n",
|
||||
" delta_pheromone = 1 / evaluate_solution(solution, distances)\n",
|
||||
" for i in range(num_nodes - 1):\n",
|
||||
" node1 = solution[i]\n",
|
||||
" node2 = solution[i + 1]\n",
|
||||
" pheromone[node1][node2] += delta_pheromone\n",
|
||||
" pheromone[node2][node1] += delta_pheromone\n",
|
||||
"\n",
|
||||
" # Séparer la meilleure solution en trajets pour chaque camion\n",
|
||||
" truck_solutions = []\n",
|
||||
" num_nodes_per_truck = num_nodes // num_trucks\n",
|
||||
"\n",
|
||||
" for i in range(num_trucks):\n",
|
||||
" start_index = i * num_nodes_per_truck\n",
|
||||
" end_index = start_index + num_nodes_per_truck\n",
|
||||
" truck_solution = best_solution[start_index:end_index]\n",
|
||||
" truck_solutions.append(truck_solution + [0])\n",
|
||||
" \n",
|
||||
"\n",
|
||||
" return truck_solutions, best_distance\n",
|
||||
"\n",
|
||||
"num_ants = 10\n",
|
||||
"num_iterations = 100\n",
|
||||
"evaporation_rate = 0.5\n",
|
||||
"alpha = 1\n",
|
||||
"beta = 1\n",
|
||||
"\n",
|
||||
"best_truck_solutions,best_distance = ant_colony_optimization(distance_matrix, num_ants, num_iterations, evaporation_rate, alpha, beta, num_trucks)\n",
|
||||
"\n",
|
||||
"# Pour chaque solution de camion, nous devons trouver le chemin le plus court du dépôt au premier nœud du chemin\n",
|
||||
"for i, truck_solution in enumerate(best_truck_solutions):\n",
|
||||
" # Créer un graphe à partir de la matrice de distance\n",
|
||||
" G = nx.from_numpy_matrix(distance_matrix)\n",
|
||||
" \n",
|
||||
" # Utiliser l'algorithme de Dijkstra pour trouver le chemin le plus court du dépôt (nœud 0) au premier nœud du chemin du camion\n",
|
||||
" shortest_path = nx.dijkstra_path(G, 0, truck_solution[1])\n",
|
||||
" \n",
|
||||
" # Remplacer le premier nœud du chemin du camion par le chemin le plus court trouvé\n",
|
||||
" best_truck_solutions[i] = [0] + shortest_path + truck_solution[2:]\n",
|
||||
"\n",
|
||||
"# Calculer la distance totale pour chaque solution de camion\n",
|
||||
"total_distances = [evaluate_solution(truck_solution, distance_matrix) for truck_solution in best_truck_solutions]\n",
|
||||
"\n",
|
||||
"# Afficher les solutions et les distances totales pour chaque camion\n",
|
||||
"for i, (truck_solution, total_distance) in enumerate(zip(best_truck_solutions, total_distances)):\n",
|
||||
" print(f\"Camion {i+1} :\")\n",
|
||||
" print(\"Solution :\", truck_solution)\n",
|
||||
" print(\"Distance totale :\", total_distance)\n",
|
||||
" print()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "29df0137",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# En rajoutant la contrainte de Time Window pour une instance de VRPTW\n",
|
||||
"\n",
|
||||
"Dans un premier temps on va attribuer des fenêtres de temps pour chaque clients (ville dans notre graphe)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"id": "8266e414-d350-4101-8f15-9cc05ee02934",
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"20\n",
|
||||
"Client 0 : (0, inf)\n",
|
||||
"Client 1 : (44, 94)\n",
|
||||
"Client 2 : (99, 111)\n",
|
||||
"Client 3 : (80, 125)\n",
|
||||
"Client 4 : (85, 96)\n",
|
||||
"Client 5 : (71, 85)\n",
|
||||
"Client 6 : (34, 69)\n",
|
||||
"Client 7 : (20, 30)\n",
|
||||
"Client 8 : (46, 56)\n",
|
||||
"Client 9 : (90, 109)\n",
|
||||
"Client 10 : (74, 116)\n",
|
||||
"Client 11 : (95, 112)\n",
|
||||
"Client 12 : (93, 131)\n",
|
||||
"Client 13 : (46, 82)\n",
|
||||
"Client 14 : (86, 124)\n",
|
||||
"Client 15 : (87, 129)\n",
|
||||
"Client 16 : (13, 23)\n",
|
||||
"Client 17 : (0, 28)\n",
|
||||
"Client 18 : (77, 108)\n",
|
||||
"Client 19 : (76, 105)\n",
|
||||
"Client 20 : (78, 94)\n",
|
||||
"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]\n",
|
||||
"[(0, 19), (0, 16), (0, 5), (0, 10), (1, 18), (1, 8), (1, 11), (2, 18), (2, 6), (2, 3), (2, 9), (2, 10), (2, 14), (2, 17), (3, 7), (3, 8), (3, 16), (4, 15), (4, 5), (4, 13), (5, 8), (5, 7), (6, 16), (6, 19), (7, 15), (7, 19), (8, 13), (9, 20), (10, 15), (11, 14), (11, 18), (12, 15), (12, 17), (12, 16), (13, 19), (13, 17), (13, 20), (14, 20), (14, 15), (15, 18), (15, 20)]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"\n",
|
||||
"def assign_time_windows(graph):\n",
|
||||
" # Créer un dictionnaire pour stocker les fenêtres de temps des clients\n",
|
||||
" time_windows = {}\n",
|
||||
"\n",
|
||||
" # Définir la fenêtre de temps pour le dépôt central (nœud 0)\n",
|
||||
" time_windows[0] = (0, float('inf'))\n",
|
||||
"\n",
|
||||
" # Assigner une fenêtre de temps à chaque client\n",
|
||||
" for node in graph.nodes():\n",
|
||||
" if node !=0 and node != graph.number_of_nodes() :\n",
|
||||
" # Générer une fenêtre de temps aléatoire pour chaque client\n",
|
||||
" start_time = random.randint(0, 100)\n",
|
||||
" end_time = start_time + random.randint(10, 50)\n",
|
||||
" time_windows[node] = (start_time, end_time)\n",
|
||||
" \n",
|
||||
"\n",
|
||||
" return time_windows\n",
|
||||
"\n",
|
||||
"# Attribuer les fenêtres de temps aux clients\n",
|
||||
"time_windows = assign_time_windows(graph)\n",
|
||||
"\n",
|
||||
"print(max(graph.nodes()))\n",
|
||||
"# Afficher les fenêtres de temps assignées\n",
|
||||
"for node, window in time_windows.items():\n",
|
||||
" print(\"Client\", node, \":\", window)\n",
|
||||
" \n",
|
||||
"#paramètres ACO\n",
|
||||
"\n",
|
||||
"print(graph.nodes())\n",
|
||||
"print(graph.edges())\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "747541f5",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# On va ensuite réadapter l'algorithme pour prendre en compte les time Windows "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"id": "901e6b93",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import concurrent.futures\n",
|
||||
"import random\n",
|
||||
"import numpy as np\n",
|
||||
"import time\n",
|
||||
"import heapq\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Fonction d'évaluation de la qualité d'une solution (ici, la distance totale)\n",
|
||||
"def evaluate_solution(solution, distances, time_windows, dijkstra_distances):\n",
|
||||
" total_distance = 0\n",
|
||||
" total_delay = 0\n",
|
||||
" arrival_time = 0\n",
|
||||
" num_nodes = len(solution)\n",
|
||||
" waiting_times = []\n",
|
||||
"\n",
|
||||
" total_distance += dijkstra_distances[solution[1]]\n",
|
||||
"\n",
|
||||
" for i in range(num_nodes - 1):\n",
|
||||
" current_node = solution[i]\n",
|
||||
" next_node = solution[i + 1]\n",
|
||||
" total_distance += distances[current_node][next_node]\n",
|
||||
" arrival_time += distances[current_node][next_node]\n",
|
||||
"\n",
|
||||
" if arrival_time < time_windows[next_node][0]:\n",
|
||||
" waiting_time = time_windows[next_node][0] - arrival_time\n",
|
||||
" waiting_times.append((next_node, waiting_time))\n",
|
||||
" arrival_time = time_windows[next_node][0]\n",
|
||||
" elif arrival_time > time_windows[next_node][1]:\n",
|
||||
" total_delay += arrival_time - time_windows[next_node][1]\n",
|
||||
"\n",
|
||||
" # Ajouter la distance de retour au dépôt\n",
|
||||
" total_distance += distances[solution[-1]][solution[0]]\n",
|
||||
"\n",
|
||||
" return total_distance, total_delay, waiting_times\n",
|
||||
"\n",
|
||||
" \n",
|
||||
"# Fonction pour l'algorithme de Dijkstra\n",
|
||||
"def calculate_dijkstra(start_node, distances):\n",
|
||||
" num_nodes = len(distances)\n",
|
||||
" shortest_distances = [float('inf')] * num_nodes\n",
|
||||
" shortest_distances[start_node] = 0\n",
|
||||
" shortest_paths = [[] for _ in range(num_nodes)]\n",
|
||||
" shortest_paths[start_node] = [start_node]\n",
|
||||
" priority_queue = [(0, start_node)]\n",
|
||||
" while priority_queue:\n",
|
||||
" current_distance, current_node = heapq.heappop(priority_queue)\n",
|
||||
" if current_distance == shortest_distances[current_node]:\n",
|
||||
" for neighbor, distance in enumerate(distances[current_node]):\n",
|
||||
" new_distance = current_distance + distance\n",
|
||||
" if new_distance < shortest_distances[neighbor]:\n",
|
||||
" shortest_distances[neighbor] = new_distance\n",
|
||||
" shortest_paths[neighbor] = shortest_paths[current_node] + [neighbor]\n",
|
||||
" heapq.heappush(priority_queue, (new_distance, neighbor))\n",
|
||||
" return shortest_distances, shortest_paths\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"dijkstra_distances, dijkstra_paths = calculate_dijkstra(0, distance_matrix)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def ant_colony_optimization(distances, num_ants, num_iterations, evaporation_rate, alpha, beta, num_trucks):\n",
|
||||
" num_nodes = len(distances)\n",
|
||||
" pheromone = np.ones((num_nodes, num_nodes)) \n",
|
||||
" best_solution = None\n",
|
||||
" best_distance = float('inf')\n",
|
||||
" best_delay = float('inf')\n",
|
||||
" best_score = float('inf') \n",
|
||||
" best_waiting_times = None\n",
|
||||
"\n",
|
||||
" for iteration in range(num_iterations):\n",
|
||||
" solutions = []\n",
|
||||
" for ant in range(num_ants):\n",
|
||||
" visited = set()\n",
|
||||
" current_node = random.randint(0, num_nodes - 1)\n",
|
||||
" visited.add(current_node)\n",
|
||||
" solution = [current_node]\n",
|
||||
" while len(visited) < num_nodes:\n",
|
||||
" next_node = None\n",
|
||||
" probabilities = []\n",
|
||||
" arrival_time = 0\n",
|
||||
" for node in range(num_nodes):\n",
|
||||
" if node not in visited and (node !=0 or len(visited) == num_nodes - 1):\n",
|
||||
" pheromone_value = pheromone[current_node][node]\n",
|
||||
" distance_value = distances[current_node][node]\n",
|
||||
" wait_time = max(0, time_windows[node][0]- (arrival_time + distance_value))\n",
|
||||
" probability = (pheromone_value ** alpha) * ((1 / (distance_value + wait_time)) ** beta)\n",
|
||||
" probabilities.append((node, probability))\n",
|
||||
" total_probability = sum(prob for _, prob in probabilities)\n",
|
||||
" probabilities = [(node, prob / total_probability) for node, prob in probabilities]\n",
|
||||
" roulette_wheel = random.random()\n",
|
||||
" probability_sum = 0\n",
|
||||
" for node, probability in probabilities:\n",
|
||||
" probability_sum += probability\n",
|
||||
" if probability_sum >= roulette_wheel:\n",
|
||||
" next_node = node\n",
|
||||
" break\n",
|
||||
" visited.add(next_node)\n",
|
||||
" solution.append(next_node)\n",
|
||||
" current_node = next_node\n",
|
||||
" solution.append(0)\n",
|
||||
" solutions.append(solution)\n",
|
||||
"\n",
|
||||
" for solution in solutions:\n",
|
||||
" distance, delay, waiting_times = evaluate_solution(solution, distances, time_windows, dijkstra_distances)\n",
|
||||
" score = distance + delay\n",
|
||||
" if score < best_score:\n",
|
||||
" best_solution = solution\n",
|
||||
" best_distance = distance\n",
|
||||
" best_delay = delay\n",
|
||||
" best_waiting_times = waiting_times\n",
|
||||
" pheromone *= evaporation_rate\n",
|
||||
" for solution in solutions:\n",
|
||||
" delta_pheromone = 1 / (evaluate_solution(solution, distances, time_windows, dijkstra_distances)[0] + 0.01)\n",
|
||||
" for i in range(num_nodes - 1):\n",
|
||||
" node1 = solution[i]\n",
|
||||
" node2 = solution[i + 1]\n",
|
||||
" pheromone[node1][node2] += delta_pheromone\n",
|
||||
" pheromone[node2][node1] += delta_pheromone\n",
|
||||
" truck_solutions = []\n",
|
||||
" num_nodes_per_truck = num_nodes // num_trucks\n",
|
||||
" for i in range(num_trucks):\n",
|
||||
" start_index = i * num_nodes_per_truck\n",
|
||||
" end_index = start_index + num_nodes_per_truck\n",
|
||||
" truck_solution = best_solution[start_index:end_index]\n",
|
||||
" \n",
|
||||
" # Ajoutez le chemin le plus court entre le nœud 0 et le premier nœud du chemin\n",
|
||||
" dijkstra_path_to_first_node = dijkstra_paths[truck_solution[0]]\n",
|
||||
" truck_solution = dijkstra_path_to_first_node + truck_solution\n",
|
||||
" \n",
|
||||
" # Ajoutez le chemin le plus court entre le dernier nœud du chemin et le dépôt (nœud 0)\n",
|
||||
" dijkstra_path_to_depot = dijkstra_paths[truck_solution[-1]]\n",
|
||||
" truck_solution = truck_solution + dijkstra_path_to_depot\n",
|
||||
"\n",
|
||||
" truck_solutions.append(truck_solution)\n",
|
||||
" return truck_solutions, best_distance, best_waiting_times\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"id": "f24a5980",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Meilleures solutions :\n",
|
||||
"Camion 1 : [0, 9, 9, 8, 17, 7, 1, 13, 14, 0, 14]\n",
|
||||
"Camion 2 : [0, 12, 12, 18, 4, 5, 20, 19, 15, 0, 15]\n",
|
||||
"Camion 3 : [0, 10, 10, 3, 2, 16, 6, 11, 0, 0]\n",
|
||||
"Distance totale : 48.0\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"num_thread = 1\n",
|
||||
"num_ants = 10\n",
|
||||
"num_iterations = 100\n",
|
||||
"evaporation_rate = 0.5\n",
|
||||
"alpha = 1\n",
|
||||
"beta = 1\n",
|
||||
"\n",
|
||||
"num_trucks = 3 # Nombre de camions disponibles\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"with concurrent.futures.ThreadPoolExecutor(max_workers=num_thread) as executor:\n",
|
||||
" futures = [executor.submit(ant_colony_optimization, distance_matrix, num_ants, num_iterations, evaporation_rate, alpha, beta, num_trucks) for _ in range(num_thread)]\n",
|
||||
"\n",
|
||||
" for future in concurrent.futures.as_completed(futures):\n",
|
||||
" best_truck_solutions, best_distance, best_waiting_times = future.result()\n",
|
||||
" print(\"Meilleures solutions :\")\n",
|
||||
" for i, truck_solution in enumerate(best_truck_solutions):\n",
|
||||
" print(f\"Camion {i+1} : {truck_solution}\")\n",
|
||||
" print(\"Distance totale :\", best_distance)"
|
||||
"from tests.libs.clustering import split_tour_across_clusters"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
@ -4,8 +4,6 @@ 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)]
|
||||
|
||||
@ -16,7 +14,7 @@ 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):
|
||||
def __init__(self, cities, n_ants, alpha=1, beta=4, evaporation=0.5, intensification=2, max_time=0.1):
|
||||
self.cities = cities
|
||||
self.n = len(cities)
|
||||
self.n_ants = n_ants
|
||||
@ -68,8 +66,30 @@ 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]
|
||||
cities = [[0.0, 0.0], [1224.3, 945.6], [1325.9, 945.6], [1325.9, 971.0], [1224.3, 971.0], [1224.3, 996.4], [1325.9, 996.4], [1325.9, 1021.8], [1224.3, 1021.8], [1186.2, 1034.5], [1084.6, 1034.5], [1052.8, 1034.5], [1027.4, 1034.5], [1224.3, 1047.2], [1325.9, 1047.2], [1186.2, 1059.9], [1084.6, 1059.9], [1052.8, 1059.9], [1027.4, 1059.9], [1224.3, 1072.6], [1325.9, 1072.6], [1186.2, 1085.3], [1084.6, 1085.3], [1052.8, 1085.3], [1027.4, 1085.3], [1224.3, 1098.0], [1325.9, 1098.0], [1186.2, 1110.7], [1084.6, 1110.7], [1052.8, 1110.7], [1027.4, 1110.7], [1224.3, 1123.4], [1325.9, 1123.4], [1186.2, 1136.1], [1084.6, 1136.1], [1052.8, 1136.1], [1027.4, 1136.1], [1224.3, 1148.8], [1325.9, 1148.8], [1186.2,
|
||||
1161.5], [1084.6, 1161.5], [1052.8, 1161.5], [1027.4, 1161.5], [1224.3, 1174.2], [1325.9, 1174.2], [1186.2, 1186.9], [1084.6, 1186.9], [1052.8, 1186.9], [1027.4, 1186.9], [1224.3, 1199.6], [1325.9, 1199.6], [1186.2, 1212.3], [1084.6, 1212.3], [1052.8, 1212.3], [1027.4, 1212.3], [1224.3, 1225.0], [1325.9, 1225.0], [1186.2, 1237.7], [1084.6, 1237.7], [1052.8, 1237.7], [1027.4, 1237.7], [1224.3, 1250.4], [1325.9, 1250.4], [1186.2, 1263.1], [1084.6, 1263.1], [1052.8, 1263.1], [1027.4, 1263.1], [1224.3, 1275.8], [1325.9, 1275.8], [1186.2, 1288.5], [1084.6, 1288.5], [1052.8, 1288.5], [1027.4, 1288.5], [1027.4, 1313.9], [1052.8, 1313.9], [1084.6, 1313.9], [1186.2, 1313.9], [1287.8, 1339.3], [1262.4, 1339.3], [1186.2, 1339.3], [1084.6, 1339.3], [1052.8, 1339.3], [1027.4, 1339.3], [1027.4, 1364.7], [1052.8, 1364.7], [1084.6, 1364.7], [1186.2, 1364.7], [1186.2, 1390.1], [1084.6, 1390.1], [1052.8, 1390.1], [1027.4, 1390.1], [1224.3, 1402.8], [1325.9, 1402.8], [1186.2, 1415.5], [1084.6, 1415.5], [1052.8, 1415.5], [1027.4, 1415.5], [1224.3, 1428.2], [1325.9, 1428.2], [1325.9, 1453.6], [1224.3, 1453.6], [1224.3, 1479.0], [1325.9, 1479.0], [1186.2, 1491.7], [1084.6, 1491.7], [1052.8, 1491.7], [1027.4, 1504.4], [1224.3, 1504.4], [1325.9, 1504.4], [1052.8,
|
||||
1517.1], [1224.3, 1529.8], [1325.9, 1529.8], [1325.9, 1555.2], [1224.3, 1555.2], [1224.3, 1580.6], [1325.9, 1580.6], [1325.9, 1606.0], [1224.3, 1606.0], [1224.3, 1631.4], [1325.9, 1631.4], [1325.9, 1656.8], [1224.3, 1656.8], [1224.3, 1682.2], [1325.9, 1682.2], [1325.9, 1707.6], [1224.3, 1707.6], [1224.3, 1733.0], [1325.9, 1733.0], [1097.3, 1948.9], [1071.9, 1948.9], [1224.3, 2152.1], [1325.9, 2152.1], [1325.9, 2177.5], [1224.3, 2177.5], [1224.3, 2202.9], [1325.9, 2202.9], [1325.9, 2228.3], [1224.3, 2228.3], [1224.3, 2253.7], [1325.9, 2253.7], [1325.9, 2279.1], [1224.3, 2279.1], [1224.3, 2304.5], [1325.9, 2304.5], [1325.9, 2329.9], [1224.3, 2329.9], [1224.3, 2355.3], [1325.9, 2355.3], [1325.9, 2380.7], [1224.3, 2380.7], [1224.3, 2406.1], [1325.9, 2406.1], [1325.9, 2431.5], [1224.3, 2431.5], [1224.3, 2456.9], [1325.9, 2456.9], [1325.9, 2482.3], [1224.3, 2482.3], [1262.4, 2545.8], [1287.8, 2545.8], [1325.9, 2609.3], [1224.3, 2609.3], [1224.3, 2634.7], [1325.9, 2634.7], [1186.2, 2647.4], [1084.6, 2647.4], [1052.8, 2647.4], [1027.4, 2660.1], [1224.3, 2660.1], [1325.9, 2660.1], [1052.8, 2672.8], [1224.3, 2685.5], [1325.9, 2685.5], [1325.9, 2710.9], [1224.3, 2710.9], [1224.3, 2736.3], [1325.9, 2736.3], [1325.9, 2761.7], [1224.3, 2761.7], [1224.3,
|
||||
2787.1], [1325.9, 2787.1], [1325.9, 2812.5], [1224.3, 2812.5], [1325.9, 2837.9], [1224.3, 2837.9], [1186.2, 2837.9], [1084.6, 2837.9], [1224.3, 2863.3], [1325.9, 2863.3], [1325.9, 2888.7], [1224.3, 2888.7], [1224.3, 2914.1], [1325.9, 2914.1], [1325.9, 2939.5], [1224.3, 2939.5], [1579.9, 3028.4], [1605.3, 3028.4], [1630.7, 3028.4], [1656.1, 3028.4], [1681.5, 3028.4], [1706.9, 3028.4], [1732.3, 3028.4], [1757.7, 3028.4], [1783.1, 3028.4], [1808.5, 3028.4], [1833.9, 3028.4], [1859.3, 3028.4], [1884.7, 3028.4], [1910.1, 3028.4], [1935.5, 3028.4], [1973.6, 3015.7], [1999.0, 3015.7], [2024.4, 3015.7], [1922.8, 2984.0], [1821.2, 2984.0], [1618.0, 2971.3], [1681.5, 2964.9], [1783.1, 2964.9], [1821.2, 2958.6], [1922.8, 2958.6], [1643.4, 2945.9], [1681.5, 2939.5], [1783.1, 2939.5], [1973.6, 2939.5], [1999.0, 2939.5], [2024.4, 2939.5], [2075.2, 2939.5], [2176.8, 2939.5], [1948.2, 2920.5], [1872.0, 2920.5], [1618.0, 2920.5], [1681.5, 2914.1], [1783.1, 2914.1], [1973.6, 2914.1], [1999.0, 2914.1], [2024.4, 2914.1], [2075.2, 2914.1], [2176.8, 2914.1], [2176.8, 2888.7], [2075.2, 2888.7], [1783.1, 2888.7], [1681.5, 2888.7], [1618.0, 2869.7], [1872.0, 2869.7], [1948.2, 2869.7], [2176.8, 2863.3], [2075.2, 2863.3], [1783.1, 2863.3], [1681.5, 2863.3], [1643.4,
|
||||
2844.3], [1681.5, 2837.9], [1783.1, 2837.9], [1878.3, 2837.9], [1903.7, 2837.9], [1929.1, 2837.9], [1973.6, 2837.9], [1999.0, 2837.9], [2024.4, 2837.9], [2075.2, 2837.9], [2176.8, 2837.9], [1618.0, 2818.9], [1681.5, 2812.5], [1783.1, 2812.5], [2075.2, 2812.5], [2176.8, 2812.5], [2176.8, 2787.1], [2075.2, 2787.1], [2024.4, 2787.1], [1999.0, 2787.1], [1973.6, 2787.1], [1783.1, 2787.1], [1681.5, 2787.1], [1618.0, 2768.1], [1681.5, 2761.7], [1783.1, 2761.7], [2075.2, 2761.7], [2176.8, 2761.7], [1643.4, 2742.7], [1681.5, 2736.3], [1783.1, 2736.3], [1878.3, 2736.3], [1903.7, 2736.3], [1929.1, 2736.3], [2075.2, 2736.3], [2176.8, 2736.3], [1618.0, 2717.3], [1681.5, 2710.9], [1783.1, 2710.9], [1821.2, 2710.9], [1922.8, 2710.9], [1973.6, 2710.9], [1999.0, 2710.9], [2024.4, 2710.9], [2075.2, 2710.9], [2176.8, 2710.9], [2176.8, 2685.5], [2075.2, 2685.5], [2024.4, 2685.5], [1999.0, 2685.5], [1973.6, 2685.5], [1922.8, 2685.5], [1821.2, 2685.5], [1783.1, 2685.5], [1757.7, 2685.5], [1732.3, 2685.5], [1706.9, 2685.5], [1681.5, 2685.5], [1656.1, 2685.5], [1618.0, 2666.5], [1821.2, 2660.1], [1922.8, 2660.1], [2075.2, 2660.1], [2176.8, 2660.1], [1643.4, 2641.1], [1681.5, 2634.7], [1783.1, 2634.7], [1821.2, 2634.7], [1922.8, 2634.7], [2075.2, 2634.7], [2176.8,
|
||||
2634.7], [1618.0, 2615.7], [1681.5, 2609.3], [1783.1, 2609.3], [1821.2, 2609.3], [1922.8, 2609.3], [1973.6, 2609.3], [1999.0, 2609.3], [2024.4, 2609.3], [2075.2, 2609.3], [2176.8, 2609.3], [1935.5, 2571.2], [1910.1, 2571.2], [1884.7, 2571.2], [1859.3, 2571.2], [1833.9, 2571.2], [1808.5, 2571.2], [1783.1, 2571.2], [1757.7, 2571.2], [1732.3, 2571.2], [1706.9, 2571.2], [1681.5, 2571.2], [1656.1, 2571.2], [1630.7, 2571.2], [1605.3, 2571.2], [1579.9, 2571.2], [1973.6, 2558.5], [1999.0, 2558.5], [2024.4, 2558.5], [2113.3, 2545.8], [2138.7, 2545.8], [1922.8, 2526.8], [1821.2, 2526.8], [1618.0, 2514.1], [1681.5, 2507.7], [1783.1, 2507.7], [1821.2, 2501.4], [1922.8, 2501.4], [1643.4, 2488.7], [1681.5, 2482.3], [1783.1, 2482.3], [1973.6, 2482.3], [1999.0, 2482.3], [2024.4, 2482.3], [2075.2, 2482.3], [2176.8, 2482.3], [1948.2, 2463.3], [1872.0, 2463.3], [1618.0, 2463.3], [1681.5, 2456.9], [1783.1, 2456.9], [1973.6, 2456.9], [1999.0, 2456.9], [2024.4, 2456.9], [2075.2, 2456.9], [2176.8, 2456.9], [2176.8, 2431.5], [2075.2, 2431.5], [1783.1, 2431.5], [1681.5, 2431.5], [1618.0, 2412.5], [1872.0, 2412.5], [1948.2, 2412.5], [2176.8, 2406.1], [2075.2, 2406.1], [1783.1, 2406.1], [1681.5, 2406.1], [1643.4, 2387.1], [1681.5, 2380.7], [1783.1, 2380.7], [1878.3,
|
||||
2380.7], [1903.7, 2380.7], [1929.1, 2380.7], [1973.6, 2380.7], [1999.0, 2380.7], [2024.4, 2380.7], [2075.2, 2380.7], [2176.8, 2380.7], [1618.0, 2361.7], [1681.5, 2355.3], [1783.1, 2355.3], [2075.2, 2355.3], [2176.8, 2355.3], [2176.8, 2329.9], [2075.2, 2329.9], [2024.4, 2329.9], [1999.0, 2329.9], [1973.6, 2329.9], [1783.1, 2329.9], [1681.5, 2329.9], [1618.0, 2310.9], [1681.5, 2304.5], [1783.1, 2304.5], [2075.2, 2304.5], [2176.8, 2304.5], [1643.4, 2285.5], [1681.5, 2279.1], [1783.1, 2279.1], [1878.3, 2279.1], [1903.7, 2279.1], [1929.1, 2279.1], [2075.2, 2279.1], [2176.8, 2279.1], [1618.0, 2260.1], [1681.5, 2253.7], [1783.1, 2253.7], [1821.2, 2253.7], [1922.8, 2253.7], [1973.6, 2253.7], [1999.0, 2253.7], [2024.4, 2253.7], [2075.2, 2253.7], [2176.8, 2253.7], [2176.8, 2228.3], [2075.2, 2228.3], [2024.4, 2228.3], [1999.0, 2228.3], [1973.6, 2228.3], [1922.8, 2228.3], [1821.2, 2228.3], [1783.1, 2228.3], [1757.7, 2228.3], [1732.3, 2228.3], [1706.9, 2228.3], [1681.5, 2228.3], [1656.1, 2228.3], [1618.0, 2209.3], [1821.2, 2202.9], [1922.8, 2202.9], [2075.2, 2202.9], [2176.8, 2202.9], [1643.4, 2183.9], [1681.5, 2177.5], [1783.1, 2177.5], [1821.2, 2177.5], [1922.8, 2177.5], [2075.2, 2177.5], [2176.8, 2177.5], [1618.0, 2158.5], [1681.5, 2152.1], [1783.1,
|
||||
2152.1], [1821.2, 2152.1], [1922.8, 2152.1], [1973.6, 2152.1], [1999.0, 2152.1], [2024.4, 2152.1], [2075.2, 2152.1], [2176.8, 2152.1], [2113.3, 1948.9], [2138.7, 1948.9], [1935.5, 1745.7], [1910.1, 1745.7], [1884.7, 1745.7], [1859.3, 1745.7], [1833.9, 1745.7], [1808.5, 1745.7], [1783.1, 1745.7], [1757.7, 1745.7], [1732.3, 1745.7], [1706.9, 1745.7], [1681.5, 1745.7], [1656.1, 1745.7], [1630.7, 1745.7], [1605.3, 1745.7], [1579.9, 1745.7], [1973.6, 1733.0], [1999.0, 1733.0], [2024.4, 1733.0], [2075.2, 1733.0], [2176.8, 1733.0], [2176.8, 1707.6], [2075.2, 1707.6], [1922.8, 1701.3], [1821.2, 1701.3], [1618.0, 1688.6], [1681.5, 1682.2], [1783.1, 1682.2], [2075.2, 1682.2], [2176.8, 1682.2], [1922.8, 1675.9], [1821.2, 1675.9], [1643.4, 1663.2], [1681.5, 1656.8], [1783.1, 1656.8], [1973.6, 1656.8], [1999.0, 1656.8], [2024.4, 1656.8], [2075.2, 1656.8], [2176.8, 1656.8], [1948.2, 1637.8], [1872.0, 1637.8], [1618.0, 1637.8], [1681.5, 1631.4], [1783.1, 1631.4], [1973.6, 1631.4], [1999.0, 1631.4], [2024.4, 1631.4], [2075.2, 1631.4], [2176.8, 1631.4], [2176.8, 1606.0], [2075.2, 1606.0], [1783.1, 1606.0], [1681.5, 1606.0], [1618.0, 1587.0], [1872.0, 1587.0], [1948.2, 1587.0], [2176.8, 1580.6], [2075.2, 1580.6], [1783.1, 1580.6], [1681.5, 1580.6], [1643.4,
|
||||
1561.6], [1681.5, 1555.2], [1783.1, 1555.2], [1872.0, 1555.2], [1903.7, 1555.2], [1929.1, 1555.2], [1973.6, 1555.2], [1999.0, 1555.2], [2024.4, 1555.2], [2075.2, 1555.2], [2176.8, 1555.2], [1618.0, 1536.2], [1681.5, 1529.8], [1783.1, 1529.8], [2075.2, 1529.8], [2176.8, 1529.8], [2176.8, 1504.4], [2075.2, 1504.4], [2024.4, 1504.4], [1999.0, 1504.4], [1973.6, 1504.4], [1783.1, 1504.4], [1681.5, 1504.4], [1618.0, 1485.4], [1681.5, 1479.0], [1783.1, 1479.0], [2075.2, 1479.0], [2176.8, 1479.0], [1643.4, 1460.0], [1681.5, 1453.6], [1783.1, 1453.6], [1872.0, 1453.6], [1903.7, 1453.6], [1929.1, 1453.6], [2075.2, 1453.6], [2176.8, 1453.6], [1618.0, 1434.6], [1681.5, 1428.2], [1783.1, 1428.2], [1821.2, 1428.2], [1922.8, 1428.2], [1973.6, 1428.2], [1999.0, 1428.2], [2024.4, 1428.2], [2075.2, 1428.2], [2176.8, 1428.2], [2176.8, 1402.8], [2075.2, 1402.8], [2024.4, 1402.8], [1999.0, 1402.8], [1973.6, 1402.8], [1922.8, 1402.8], [1821.2, 1402.8], [1783.1, 1402.8], [1757.7, 1402.8], [1732.3, 1402.8], [1706.9, 1402.8], [1681.5, 1402.8], [1656.1, 1402.8], [1618.0, 1383.8], [1821.2, 1377.4], [1922.8, 1377.4], [1643.4, 1358.4], [1681.5, 1352.0], [1783.1, 1352.0], [1821.2, 1352.0], [1922.8, 1352.0], [2113.3, 1352.0], [2138.7, 1352.0], [1618.0, 1333.0], [1681.5,
|
||||
1326.6], [1783.1, 1326.6], [1821.2, 1326.6], [1922.8, 1326.6], [1973.6, 1326.6], [1999.0, 1326.6], [2024.4, 1326.6], [1935.5, 1288.5], [1910.1, 1288.5], [1884.7, 1288.5], [1859.3, 1288.5], [1833.9, 1288.5], [1808.5, 1288.5], [1783.1, 1288.5], [1757.7, 1288.5], [1732.3, 1288.5], [1706.9, 1288.5], [1681.5, 1288.5], [1656.1, 1288.5], [1630.7, 1288.5], [1605.3, 1288.5], [1579.9, 1288.5], [1973.6, 1275.8], [1999.0, 1275.8], [2024.4, 1275.8], [2075.2, 1275.8], [2176.8, 1275.8], [2176.8, 1250.4], [2075.2, 1250.4], [1922.8, 1244.1], [1821.2, 1244.1], [1618.0, 1231.4], [1681.5, 1225.0], [1783.1, 1225.0], [2075.2, 1225.0], [2176.8, 1225.0], [1922.8, 1218.7], [1821.2, 1218.7], [1643.4, 1206.0], [1681.5, 1199.6], [1783.1, 1199.6], [1973.6, 1199.6], [1999.0, 1199.6], [2024.4, 1199.6], [2075.2, 1199.6], [2176.8, 1199.6], [1948.2, 1180.6], [1872.0, 1180.6], [1618.0, 1180.6], [1681.5, 1174.2], [1783.1, 1174.2], [1973.6, 1174.2], [1999.0, 1174.2], [2024.4, 1174.2], [2075.2, 1174.2], [2176.8, 1174.2], [2176.8, 1148.8], [2075.2, 1148.8], [1783.1, 1148.8], [1681.5, 1148.8], [1618.0, 1129.8], [1872.0, 1129.8], [1948.2, 1129.8], [2176.8, 1123.4], [2075.2, 1123.4], [1783.1, 1123.4], [1681.5, 1123.4], [1643.4, 1104.4], [1681.5, 1098.0], [1783.1, 1098.0], [1878.3,
|
||||
1098.0], [1903.7, 1098.0], [1929.1, 1098.0], [1973.6, 1098.0], [1999.0, 1098.0], [2024.4, 1098.0], [2075.2, 1098.0], [2176.8, 1098.0], [1618.0, 1079.0], [1681.5, 1072.6], [1783.1, 1072.6], [2075.2, 1072.6], [2176.8, 1072.6], [2176.8, 1047.2], [2075.2, 1047.2], [2024.4, 1047.2], [1999.0, 1047.2], [1973.6, 1047.2], [1783.1, 1047.2], [1681.5, 1047.2], [1618.0, 1028.2], [1681.5, 1021.8], [1783.1, 1021.8], [2075.2, 1021.8], [2176.8, 1021.8], [1643.4, 1002.8], [1681.5, 996.4], [1783.1, 996.4], [1878.3, 996.4], [1903.7, 996.4], [1929.1, 996.4], [2075.2, 996.4], [2176.8, 996.4], [1618.0, 977.4], [1681.5, 971.0], [1783.1, 971.0], [1821.2, 971.0], [1922.8, 971.0], [1973.6, 971.0], [1999.0, 971.0], [2024.4, 971.0], [2075.2, 971.0], [2176.8, 971.0], [2176.8, 945.6], [2075.2, 945.6], [2024.4, 945.6], [1999.0, 945.6], [1973.6, 945.6], [1922.8, 945.6], [1821.2, 945.6], [1783.1, 945.6], [1757.7, 945.6], [1732.3, 945.6], [1706.9, 945.6], [1681.5, 945.6], [1656.1, 945.6], [1618.0, 926.6], [1821.2, 920.2], [1922.8, 920.2], [1643.4, 901.2], [1681.5, 894.8], [1783.1, 894.8], [1821.2, 894.8], [1922.8, 894.8], [1618.0, 875.8], [1681.5, 869.4], [1783.1, 869.4], [1821.2, 869.4], [1922.8, 869.4], [1973.6, 869.4], [1999.0, 869.4], [2024.4, 869.4], [2449.8, 2037.8], [2475.2, 2037.8], [2500.6, 2037.8], [2526.0, 2037.8], [2551.4, 2037.8], [2576.8, 2037.8], [2602.2, 2037.8], [2627.6, 2037.8], [2672.1, 2037.8], [2697.5, 2037.8], [2722.9, 2037.8], [2748.3, 2037.8], [2773.7, 2037.8], [2799.1, 2037.8], [2824.5, 2037.8], [2849.9, 2037.8], [2926.1, 2075.9], [3002.3, 2075.9], [3053.1, 2075.9], [3103.9, 2075.9], [3167.4, 2075.9], [3243.6, 2075.9], [3294.4, 2075.9], [3345.2, 2075.9], [3383.3, 2088.6], [3459.5, 2088.6], [3497.6, 2088.6], [3599.2, 2088.6], [3650.0, 2088.6], [3675.4, 2088.6], [3700.8, 2088.6], [2849.9, 2114.0], [2824.5, 2114.0], [2799.1, 2114.0], [2773.7, 2114.0], [2748.3, 2114.0], [2722.9, 2114.0], [2697.5, 2114.0], [2672.1, 2114.0], [2627.6, 2114.0], [2602.2, 2114.0], [2576.8, 2114.0], [2551.4, 2114.0], [2526.0, 2114.0], [2500.6, 2114.0], [2475.2, 2114.0], [2449.8, 2114.0], [3497.6, 2126.7], [3599.2, 2126.7], [3459.5, 2139.4], [3383.3, 2139.4], [3345.2, 2152.1], [3294.4, 2152.1], [3243.6, 2152.1], [3167.4, 2152.1], [3103.9,
|
||||
2152.1], [3053.1, 2152.1], [3002.3, 2152.1], [2926.1, 2152.1], [2875.3, 2152.1], [2849.9, 2152.1], [2824.5, 2152.1], [2773.7, 2152.1], [2672.1, 2152.1], [2634.0, 2152.1], [2532.4, 2152.1], [2468.9, 2158.5], [2532.4, 2177.5], [2634.0, 2177.5], [2672.1, 2177.5], [2773.7, 2177.5], [2494.3, 2183.9], [2672.1, 2202.9], [2773.7, 2202.9], [2926.1, 2202.9], [3002.3, 2202.9], [3053.1, 2202.9], [3103.9, 2202.9], [3167.4, 2202.9], [3243.6, 2202.9], [3294.4, 2202.9], [3345.2, 2202.9], [2468.9, 2209.3], [3383.3, 2215.6], [3459.5, 2215.6], [3497.6, 2215.6], [3599.2, 2215.6], [3675.4, 2215.6], [3726.2, 2215.6], [2875.3, 2228.3], [2849.9, 2228.3], [2824.5, 2228.3], [2773.7, 2228.3], [2672.1, 2228.3], [2634.0, 2228.3], [2608.6, 2228.3], [2583.2, 2228.3], [2557.8, 2228.3], [2532.4, 2228.3], [2507.0, 2228.3], [3675.4, 2241.0], [3726.2, 2241.0], [3599.2, 2253.7], [3497.6, 2253.7], [2875.3, 2253.7], [2849.9, 2253.7], [2824.5, 2253.7], [2773.7, 2253.7], [2672.1, 2253.7], [2634.0, 2253.7], [2532.4, 2253.7], [2468.9, 2260.1], [3383.3, 2266.4], [3459.5, 2266.4], [3675.4, 2266.4], [3726.2, 2266.4], [3345.2, 2279.1], [3294.4, 2279.1], [3243.6, 2279.1], [3167.4, 2279.1], [3103.9, 2279.1], [3053.1, 2279.1], [3002.3, 2279.1], [2926.1, 2279.1], [2780.0, 2279.1], [2754.6,
|
||||
2279.1], [2729.2, 2279.1], [2634.0, 2279.1], [2532.4, 2279.1], [2494.3, 2285.5], [3675.4, 2291.8], [3726.2, 2291.8], [2634.0, 2304.5], [2532.4, 2304.5], [2468.9, 2310.9], [3675.4, 2317.2], [3726.2, 2317.2], [3345.2, 2329.9], [3294.4, 2329.9], [3243.6, 2329.9], [3167.4, 2329.9], [3103.9, 2329.9], [3053.1, 2329.9], [3002.3, 2329.9], [2926.1, 2329.9], [2875.3, 2329.9], [2849.9, 2329.9], [2824.5, 2329.9], [2634.0, 2329.9], [2532.4, 2329.9], [3383.3, 2342.6], [3459.5, 2342.6], [3497.6, 2342.6], [3599.2, 2342.6], [3675.4, 2342.6], [3726.2, 2342.6], [2634.0, 2355.3], [2532.4, 2355.3], [2468.9, 2361.7], [3675.4, 2368.0], [3726.2, 2368.0], [3599.2, 2380.7], [3497.6, 2380.7], [2875.3, 2380.7], [2849.9, 2380.7], [2824.5, 2380.7], [2780.0, 2380.7], [2754.6, 2380.7], [2729.2, 2380.7], [2634.0, 2380.7], [2532.4, 2380.7], [2494.3, 2387.1], [3383.3, 2393.4], [3459.5, 2393.4], [3675.4, 2393.4], [3726.2, 2393.4], [3345.2, 2406.1], [3294.4, 2406.1], [3243.6, 2406.1], [3167.4, 2406.1], [3103.9, 2406.1], [3053.1, 2406.1], [3002.3, 2406.1], [2926.1, 2406.1], [2634.0, 2406.1], [2532.4, 2406.1], [2468.9, 2412.5], [2722.9, 2412.5], [2799.1, 2412.5], [3675.4, 2418.8], [3726.2, 2418.8], [2634.0, 2431.5], [2532.4, 2431.5], [3675.4, 2444.2], [3726.2, 2444.2], [3345.2,
|
||||
2456.9], [3294.4, 2456.9], [3243.6, 2456.9], [3167.4, 2456.9], [3103.9, 2456.9], [3053.1, 2456.9], [3002.3, 2456.9], [2926.1, 2456.9], [2875.3, 2456.9], [2849.9, 2456.9], [2824.5, 2456.9], [2634.0, 2456.9], [2532.4, 2456.9], [2468.9, 2463.3], [2722.9, 2463.3], [2799.1, 2463.3], [3383.3, 2469.6], [3459.5, 2469.6], [3497.6, 2469.6], [3599.2, 2469.6], [3675.4, 2469.6], [3726.2, 2469.6], [2875.3, 2482.3], [2849.9, 2482.3], [2824.5, 2482.3], [2634.0, 2482.3], [2532.4, 2482.3], [2494.3, 2488.7], [3675.4, 2495.0], [3726.2, 2495.0], [2773.7, 2501.4], [2672.1, 2501.4], [2532.4, 2507.7], [2634.0, 2507.7], [3497.6, 2507.7], [3599.2, 2507.7], [2468.9, 2514.1], [3383.3, 2520.4], [3459.5, 2520.4], [3675.4, 2520.4], [3726.2, 2520.4], [2773.7, 2526.8], [2672.1, 2526.8], [2926.1, 2533.1], [3002.3, 2533.1], [3053.1, 2533.1], [3103.9, 2533.1], [3167.4, 2533.1], [3243.6, 2533.1], [3294.4, 2533.1], [3345.2, 2533.1], [3675.4, 2545.8], [3726.2, 2545.8], [2875.3, 2558.5], [2849.9, 2558.5], [2824.5, 2558.5], [2430.8, 2571.2], [2456.2, 2571.2], [2481.6, 2571.2], [2507.0, 2571.2], [2532.4, 2571.2], [2557.8, 2571.2], [2583.2, 2571.2], [2608.6, 2571.2], [2634.0, 2571.2], [2659.4, 2571.2], [2684.8, 2571.2], [2710.2, 2571.2], [2735.6, 2571.2], [2761.0, 2571.2], [2786.4,
|
||||
2571.2], [3675.4, 2571.2], [3726.2, 2571.2], [3345.2, 2583.9], [3294.4, 2583.9], [3243.6, 2583.9], [3167.4, 2583.9], [3103.9, 2583.9], [3053.1, 2583.9], [3002.3, 2583.9], [2926.1, 2583.9], [3383.3, 2596.6], [3459.5, 2596.6], [3497.6, 2596.6], [3599.2, 2596.6], [3675.4, 2596.6], [3726.2, 2596.6], [2875.3, 2609.3], [2849.9, 2609.3], [2824.5, 2609.3], [2773.7, 2609.3], [2672.1, 2609.3], [2634.0, 2609.3], [2532.4, 2609.3], [2468.9, 2615.7], [3675.4, 2622.0], [3726.2, 2622.0], [3599.2, 2634.7], [3497.6, 2634.7], [2773.7, 2634.7], [2672.1, 2634.7], [2634.0, 2634.7], [2532.4, 2634.7], [2494.3, 2641.1], [3383.3, 2647.4], [3459.5, 2647.4], [3675.4, 2647.4], [3726.2, 2647.4], [3345.2, 2660.1], [3294.4, 2660.1], [3243.6, 2660.1], [3167.4, 2660.1], [3103.9, 2660.1], [3053.1, 2660.1], [3002.3, 2660.1], [2926.1, 2660.1], [2773.7, 2660.1], [2672.1, 2660.1], [2468.9, 2666.5], [3675.4, 2672.8], [3726.2, 2672.8], [2634.0, 2679.2], [2608.6, 2679.2], [2583.2, 2679.2], [2507.0, 2685.5], [2532.4, 2685.5], [2557.8, 2685.5], [2672.1, 2685.5], [2773.7, 2685.5], [2824.5, 2685.5], [2849.9, 2685.5], [2875.3, 2685.5], [3675.4, 2698.2], [3726.2, 2698.2], [3345.2, 2710.9], [3294.4, 2710.9], [3243.6, 2710.9], [3167.4, 2710.9], [3103.9, 2710.9], [3053.1, 2710.9], [3002.3,
|
||||
2710.9], [2926.1, 2710.9], [2875.3, 2710.9], [2849.9, 2710.9], [2824.5, 2710.9], [2773.7, 2710.9], [2672.1, 2710.9], [2634.0, 2710.9], [2532.4, 2710.9], [2468.9, 2717.3], [3383.3, 2723.6], [3459.5, 2723.6], [3497.6, 2723.6], [3599.2, 2723.6], [3675.4, 2723.6], [3726.2, 2723.6], [2780.0, 2736.3], [2754.6, 2736.3], [2729.2, 2736.3], [2634.0, 2736.3], [2532.4, 2736.3], [2494.3, 2742.7], [3675.4, 2749.0], [3726.2, 2749.0], [3599.2, 2761.7], [3497.6, 2761.7], [2634.0, 2761.7], [2532.4, 2761.7], [2468.9, 2768.1], [3383.3, 2774.4], [3459.5, 2774.4], [3675.4, 2774.4], [3726.2, 2774.4], [3345.2, 2787.1], [3294.4, 2787.1], [3243.6, 2787.1], [3167.4, 2787.1], [3103.9, 2787.1], [3053.1, 2787.1], [3002.3, 2787.1], [2926.1, 2787.1], [2875.3, 2787.1], [2849.9, 2787.1], [2824.5, 2787.1], [2634.0, 2787.1], [2532.4, 2787.1], [3675.4, 2799.8], [3726.2, 2799.8], [2634.0, 2812.5], [2532.4, 2812.5], [2468.9, 2818.9], [3675.4, 2825.2], [3726.2, 2825.2], [3345.2, 2837.9], [3294.4, 2837.9], [3243.6, 2837.9], [3167.4, 2837.9], [3103.9, 2837.9], [3053.1, 2837.9], [3002.3, 2837.9], [2926.1, 2837.9], [2875.3, 2837.9], [2849.9, 2837.9], [2824.5, 2837.9], [2780.0, 2837.9], [2754.6, 2837.9], [2729.2, 2837.9], [2634.0, 2837.9], [2532.4, 2837.9], [2494.3, 2844.3], [3383.3,
|
||||
2850.6], [3459.5, 2850.6], [3497.6, 2850.6], [3599.2, 2850.6], [3675.4, 2850.6], [3726.2, 2850.6], [2634.0, 2863.3], [2532.4, 2863.3], [2468.9, 2869.7], [2722.9, 2869.7], [2799.1, 2869.7], [3675.4, 2876.0], [3726.2, 2876.0], [3599.2, 2888.7], [3497.6, 2888.7], [2634.0, 2888.7], [2532.4, 2888.7], [3383.3, 2901.4], [3459.5, 2901.4], [3675.4, 2901.4], [3726.2, 2901.4], [3345.2, 2914.1], [3294.4, 2914.1], [3243.6, 2914.1], [3167.4, 2914.1], [3103.9, 2914.1], [3053.1, 2914.1], [3002.3, 2914.1], [2926.1, 2914.1], [2875.3, 2914.1], [2849.9, 2914.1], [2824.5, 2914.1], [2634.0, 2914.1], [2532.4, 2914.1], [2468.9, 2920.5], [2722.9, 2920.5], [2799.1, 2920.5], [3675.4, 2926.8], [3726.2, 2926.8], [2875.3, 2939.5], [2849.9, 2939.5], [2824.5, 2939.5], [2634.0, 2939.5], [2532.4, 2939.5], [2494.3, 2945.9], [3675.4, 2952.2], [3726.2, 2952.2], [2773.7, 2958.6], [2672.1, 2958.6], [2532.4, 2964.9], [2634.0, 2964.9], [2926.1, 2964.9], [3002.3, 2964.9], [3053.1, 2964.9], [3103.9, 2964.9], [3167.4, 2964.9], [3243.6, 2964.9], [3294.4, 2964.9], [3345.2, 2964.9], [2468.9, 2971.3], [3383.3, 2977.6], [3459.5, 2977.6], [3497.6, 2977.6], [3599.2, 2977.6], [3675.4, 2977.6], [3726.2, 2977.6], [2773.7, 2984.0], [2672.1, 2984.0], [3675.4, 3003.0], [3726.2, 3003.0], [3599.2,
|
||||
3015.7], [3497.6, 3015.7], [2875.3, 3015.7], [2849.9, 3015.7], [2824.5, 3015.7], [2430.8, 3028.4], [2456.2, 3028.4], [2481.6, 3028.4], [2507.0, 3028.4], [2532.4, 3028.4], [2557.8, 3028.4], [2583.2, 3028.4], [2608.6, 3028.4], [2634.0, 3028.4], [2659.4, 3028.4], [2684.8, 3028.4], [2710.2, 3028.4], [2735.6, 3028.4], [2761.0, 3028.4], [2786.4, 3028.4], [3383.3, 3028.4], [3459.5, 3028.4], [3345.2, 3041.1], [3294.4, 3041.1], [3243.6, 3041.1], [3167.4, 3041.1], [3103.9, 3041.1], [3053.1, 3041.1], [3002.3, 3041.1], [2926.1, 3041.1], [3535.7, 3066.5], [3561.1, 3066.5], [3586.5, 3066.5], [3586.5, 2012.4], [3535.7, 2012.4], [3484.9, 2012.4], [3408.7, 2012.4], [3345.2, 2012.4], [3294.4, 2012.4], [3243.6, 2012.4], [3167.4, 2012.4], [3103.9, 2012.4], [3053.1, 2012.4], [3002.3, 2012.4], [2926.1, 2012.4], [2926.1, 1936.2], [3002.3, 1936.2], [3053.1, 1936.2], [3103.9, 1936.2], [3167.4, 1936.2], [3243.6, 1936.2], [3294.4, 1936.2], [3345.2, 1936.2], [3408.7, 1936.2], [3484.9, 1936.2], [3535.7, 1936.2], [3586.5, 1936.2], [3446.8, 1796.5], [3421.4, 1796.5], [3396.0, 1796.5], [2786.4, 1745.7], [2761.0, 1745.7], [2735.6, 1745.7], [2710.2, 1745.7], [2684.8, 1745.7], [2659.4, 1745.7], [2634.0, 1745.7], [2608.6, 1745.7], [2583.2, 1745.7], [2557.8, 1745.7], [2532.4,
|
||||
1745.7], [2507.0, 1745.7], [2481.6, 1745.7], [2456.2, 1745.7], [2430.8, 1745.7], [2824.5, 1733.0], [2849.9, 1733.0], [2875.3, 1733.0], [2773.7, 1701.3], [2672.1, 1701.3], [2468.9, 1688.6], [2532.4, 1682.2], [2634.0, 1682.2], [3249.9, 1682.2], [3351.5, 1682.2], [2773.7, 1675.9], [2672.1, 1675.9], [2494.3, 1663.2], [2532.4, 1656.8], [2634.0, 1656.8], [2824.5, 1656.8], [2849.9, 1656.8], [2875.3, 1656.8], [3249.9, 1656.8], [3351.5, 1656.8], [2799.1, 1637.8], [2722.9, 1637.8], [2468.9, 1637.8], [2532.4, 1631.4], [2634.0, 1631.4], [2824.5, 1631.4], [2849.9, 1631.4], [2875.3, 1631.4], [3249.9, 1631.4], [3351.5, 1631.4], [3351.5, 1606.0], [3249.9, 1606.0], [2634.0, 1606.0], [2532.4, 1606.0], [2468.9, 1587.0], [2722.9, 1587.0], [2799.1, 1587.0], [2532.4, 1580.6], [2634.0, 1580.6], [3249.9, 1580.6], [3351.5, 1580.6], [2494.3, 1561.6], [2532.4, 1555.2], [2634.0, 1555.2], [2729.2, 1555.2], [2754.6, 1555.2], [2780.0, 1555.2], [2824.5, 1555.2], [2849.9, 1555.2], [2875.3, 1555.2], [2468.9, 1536.2], [2532.4, 1529.8], [2634.0, 1529.8], [2532.4, 1504.4], [2634.0, 1504.4], [2824.5, 1504.4], [2849.9, 1504.4], [2875.3, 1504.4], [2468.9, 1485.4], [2532.4, 1479.0], [2634.0, 1479.0], [2964.2, 1479.0], [2494.3, 1460.0], [2532.4, 1453.6], [2634.0, 1453.6], [2729.2,
|
||||
1453.6], [2754.6, 1453.6], [2780.0, 1453.6], [2468.9, 1434.6], [2532.4, 1428.2], [2634.0, 1428.2], [2672.1, 1428.2], [2773.7, 1428.2], [2824.5, 1428.2], [2849.9, 1428.2], [2875.3, 1428.2], [2875.3, 1402.8], [2849.9, 1402.8], [2824.5, 1402.8], [2773.7, 1402.8], [2672.1, 1402.8], [2634.0, 1402.8], [2608.6, 1402.8], [2583.2, 1402.8], [2557.8, 1402.8], [2532.4, 1402.8], [2507.0, 1402.8], [2468.9, 1383.8], [2672.1, 1377.4], [2773.7, 1377.4], [2964.2, 1377.4], [2494.3, 1358.4], [2532.4, 1352.0], [2634.0, 1352.0], [2672.1, 1352.0], [2773.7, 1352.0], [2468.9, 1333.0], [2532.4, 1326.6], [2634.0, 1326.6], [2672.1, 1326.6], [2773.7, 1326.6], [2824.5, 1326.6], [2849.9, 1326.6], [2875.3, 1326.6], [2786.4, 1288.5], [2761.0, 1288.5], [2735.6, 1288.5], [2710.2, 1288.5], [2684.8, 1288.5], [2659.4, 1288.5], [2634.0, 1288.5], [2608.6, 1288.5], [2583.2, 1288.5], [2557.8, 1288.5], [2532.4, 1288.5], [2507.0, 1288.5], [2481.6, 1288.5], [2456.2, 1288.5], [2430.8, 1288.5], [2824.5, 1275.8], [2849.9, 1275.8], [2875.3, 1275.8], [2773.7, 1244.1], [2672.1, 1244.1], [2468.9, 1231.4], [2532.4, 1225.0], [2634.0, 1225.0], [2672.1, 1218.7], [2773.7, 1218.7], [2494.3, 1206.0], [2532.4, 1199.6], [2634.0, 1199.6], [2824.5, 1199.6], [2849.9, 1199.6], [2875.3, 1199.6], [2799.1,
|
||||
1180.6], [2722.9, 1180.6], [2468.9, 1180.6], [2532.4, 1174.2], [2634.0, 1174.2], [2824.5, 1174.2], [2849.9, 1174.2], [2875.3, 1174.2], [2634.0, 1148.8], [2532.4, 1148.8], [2468.9, 1129.8], [2722.9, 1129.8], [2799.1, 1129.8], [2634.0, 1123.4], [2532.4, 1123.4], [2494.3, 1104.4], [2532.4, 1098.0], [2634.0, 1098.0], [2729.2, 1098.0], [2754.6, 1098.0], [2780.0, 1098.0], [2824.5, 1098.0], [2849.9, 1098.0], [2875.3, 1098.0], [2468.9, 1079.0], [2532.4, 1072.6], [2634.0, 1072.6], [2919.7, 1066.3], [3021.3, 1066.3], [3091.2, 1066.3], [3192.8, 1066.3], [3243.6, 1066.3], [3345.2, 1066.3], [2875.3, 1047.2], [2849.9, 1047.2], [2824.5, 1047.2], [2634.0, 1047.2], [2532.4, 1047.2], [2919.7, 1040.9], [3021.3, 1040.9], [3091.2, 1040.9], [3192.8, 1040.9], [3243.6, 1040.9], [3345.2, 1040.9], [2468.9, 1028.2], [2532.4, 1021.8], [2634.0, 1021.8], [2919.7, 1015.5], [3021.3, 1015.5], [3091.2, 1015.5], [3192.8, 1015.5], [3243.6, 1015.5], [3345.2, 1015.5], [2494.3, 1002.8], [2532.4, 996.4],
|
||||
[2634.0, 996.4], [2729.2, 996.4], [2754.6, 996.4], [2780.0, 996.4], [2919.7, 990.1], [3021.3, 990.1], [2468.9, 977.4], [2532.4, 971.0], [2634.0, 971.0], [2672.1, 971.0], [2773.7, 971.0], [2824.5, 971.0], [2849.9, 971.0], [2875.3, 971.0], [2875.3, 945.6], [2849.9, 945.6], [2824.5, 945.6], [2773.7, 945.6], [2672.1, 945.6], [2634.0, 945.6], [2608.6, 945.6], [2583.2, 945.6], [2557.8, 945.6], [2532.4, 945.6], [2507.0, 945.6], [2468.9, 926.6], [2672.1, 920.2], [2773.7, 920.2], [2494.3, 901.2], [2532.4, 894.8], [2634.0, 894.8], [2672.1, 894.8], [2773.7, 894.8], [2468.9, 875.8], [2532.4, 869.4], [2634.0, 869.4], [2672.1, 869.4], [2773.7, 869.4], [2824.5, 869.4], [2849.9, 869.4], [2875.3, 869.4], [3091.2, 958.3], [3116.6, 958.3], [3142.0, 958.3], [3167.4, 958.3], [3192.8, 958.3], [3218.2, 958.3], [3243.6, 958.3], [3269.0, 958.3], [3294.4, 958.3], [3319.8, 958.3], [3319.8, 882.1], [3294.4, 882.1], [3269.0, 882.1], [3243.6, 882.1], [3218.2, 882.1], [3192.8, 882.1], [3167.4, 882.1], [3142.0, 882.1], [3116.6, 882.1], [3091.2, 882.1], [3116.6, 844.0], [3218.2, 844.0], [3535.7, 831.3], [3561.1, 831.3], [3586.5, 831.3], [3650.0, 882.1], [3675.4, 882.1], [3726.2, 882.1], [3726.2, 907.5], [3675.4, 907.5], [3650.0, 907.5], [3650.0, 932.9], [3675.4, 932.9], [3726.2, 932.9], [3726.2, 958.3], [3675.4, 958.3], [3650.0, 958.3], [3650.0, 983.7], [3675.4, 983.7], [3726.2, 983.7], [3726.2, 1009.1], [3675.4, 1009.1], [3650.0, 1009.1], [3650.0, 1034.5], [3675.4, 1034.5], [3726.2, 1034.5], [3726.2, 1059.9], [3675.4, 1059.9], [3650.0, 1059.9], [3650.0, 1085.3], [3675.4, 1085.3], [3726.2, 1085.3], [3726.2, 1110.7], [3675.4, 1110.7], [3650.0, 1110.7], [3650.0, 1136.1], [3675.4, 1136.1], [3726.2, 1136.1], [3726.2, 1161.5], [3675.4, 1161.5], [3650.0, 1161.5], [3650.0, 1186.9], [3675.4, 1186.9], [3726.2, 1186.9], [3586.5, 1199.6], [3561.1, 1199.6], [3650.0, 1212.3], [3675.4, 1212.3], [3726.2, 1212.3], [3726.2, 1237.7], [3675.4, 1237.7], [3650.0, 1237.7], [3650.0, 1263.1], [3675.4, 1263.1], [3726.2, 1263.1], [3726.2, 1288.5], [3675.4, 1288.5], [3650.0, 1288.5], [3586.5, 1301.2], [3561.1, 1301.2], [3650.0, 1313.9], [3675.4, 1313.9], [3726.2, 1313.9], [3726.2, 1339.3], [3675.4, 1339.3], [3650.0, 1339.3], [3650.0, 1364.7], [3675.4, 1364.7], [3726.2, 1364.7], [3726.2, 1390.1], [3675.4, 1390.1], [3650.0, 1390.1], [3650.0, 1415.5], [3675.4, 1415.5], [3726.2, 1415.5], [3726.2, 1440.9], [3675.4, 1440.9], [3650.0, 1440.9], [3650.0, 1466.3], [3675.4, 1466.3], [3726.2, 1466.3], [3726.2, 1491.7], [3675.4, 1491.7], [3650.0,
|
||||
1491.7], [3650.0, 1517.1], [3675.4, 1517.1], [3726.2, 1517.1], [3726.2, 1542.5], [3675.4, 1542.5], [3650.0, 1542.5], [3573.8, 1548.9], [3548.4, 1548.9], [3650.0, 1567.9], [3675.4, 1567.9], [3726.2, 1567.9], [3726.2, 1593.3], [3675.4, 1593.3], [3650.0, 1593.3], [3650.0, 1618.7], [3675.4, 1618.7], [3726.2, 1618.7], [3726.2, 1644.1], [3675.4, 1644.1], [3650.0, 1644.1], [3726.2, 1669.5], [3675.4, 1669.5], [3650.0, 1669.5], [3599.2, 1669.5], [3497.6, 1669.5], [3497.6, 1694.9], [3599.2, 1694.9], [3599.2, 1720.3], [3497.6, 1720.3]]
|
||||
#cities[0] = [max_coords/2, max_coords/2]
|
||||
stop_time_generate = time.time()
|
||||
|
||||
start_time_split = time.time()
|
||||
@ -117,7 +137,7 @@ for i, cluster_indices in enumerate(clusters.values()):
|
||||
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)
|
||||
ant_colony = AntColony(cluster_cities, n_ants=nb_ants, max_time=max_time_per_cluster, alpha=1, beta=5)
|
||||
best_route = ant_colony.run()
|
||||
best_routes.append((best_route, color))
|
||||
|
||||
@ -139,4 +159,4 @@ for i, (route, color) in enumerate(best_routes):
|
||||
# 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()
|
||||
plt.show()
|
||||
|
||||
@ -1,9 +1,11 @@
|
||||
from matplotlib import pyplot as plt
|
||||
from libs.aco import AntColony, total_distance
|
||||
|
||||
name = "att48"
|
||||
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
|
||||
name = "berlin52"
|
||||
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
|
||||
|
||||
n_ants = 10
|
||||
alpha = 1
|
||||
|
||||
@ -1,13 +1,14 @@
|
||||
from matplotlib import pyplot as plt
|
||||
from libs.simulated_annealing import SimulatedAnnealing, total_distance
|
||||
|
||||
name = "att48"
|
||||
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
|
||||
temperatures = [100.0, 1000.0, 10000.0, 100000.0]
|
||||
cooling_rate = 0.9995
|
||||
temperature_ok = 0.1
|
||||
iterations = 5
|
||||
|
||||
best_distances = []
|
||||
temps = []
|
||||
@ -36,17 +37,18 @@ colors = [
|
||||
|
||||
for temperature in temperatures:
|
||||
for iteration in range(iterations):
|
||||
simulated_annealing = SimulatedAnnealing(cities, temperature=temperature, cooling_rate=0.999, temperature_ok=0.01)
|
||||
simulated_annealing = SimulatedAnnealing(cities, temperature=temperature, cooling_rate=cooling_rate, temperature_ok=0.0000001)
|
||||
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) + " "
|
||||
title += "Best distance per iterations ({})\n".format(name)
|
||||
title += "Nb cities: " + str(len(cities)) + " / "
|
||||
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')
|
||||
|
||||
@ -2,16 +2,18 @@ import numpy as np
|
||||
from matplotlib import pyplot as plt
|
||||
from libs.aco import AntColony, total_distance
|
||||
|
||||
name = "att48"
|
||||
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
|
||||
name = "berlin52"
|
||||
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
|
||||
|
||||
n_ants = 10
|
||||
alpha = [1, 2]
|
||||
beta = [1, 2]
|
||||
beta = [2, 3, 4, 5]
|
||||
evaporation = 0.5
|
||||
intensification = 2
|
||||
max_times = [0.5, 1, 1, 1, 1, 2]
|
||||
max_times = [1]
|
||||
iterations = 1
|
||||
|
||||
bar_width = 0.15
|
||||
@ -21,6 +23,31 @@ x = np.arange(len(max_times))
|
||||
|
||||
fig, ax = plt.subplots()
|
||||
|
||||
# Preparing the colormap
|
||||
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
|
||||
]
|
||||
color_dict = {}
|
||||
|
||||
for i in range(len(alpha)):
|
||||
for j in range(len(beta)):
|
||||
best_distances = []
|
||||
@ -30,12 +57,18 @@ for i in range(len(alpha)):
|
||||
print("Running iteration number {}/{} ({} sec)".format(iteration + 1, iterations, max_time))
|
||||
best_route = ant_colony.run()
|
||||
best_distances.append(total_distance(best_route))
|
||||
ax.bar(x + (i * len(beta) + j) * bar_width, best_distances, bar_width, alpha=opacity, label='alpha={} beta={}'.format(alpha[i], beta[j]))
|
||||
|
||||
# Defining a unique key for each alpha-beta pair
|
||||
key = f"alpha={alpha[i]}_beta={beta[j]}"
|
||||
if key not in color_dict:
|
||||
color_dict[key] = colors[i * len(beta) + j]
|
||||
|
||||
ax.bar(x + (i * len(beta) + j) * bar_width, best_distances, bar_width, alpha=opacity, color=color_dict[key], label='alpha={} beta={}'.format(alpha[i], beta[j]))
|
||||
|
||||
ax.set_xlabel('Max Time')
|
||||
ax.set_ylabel('Best Distance')
|
||||
ax.set_title('Best distances per max time for each alpha and beta')
|
||||
ax.set_xticks(x + bar_width / 2)
|
||||
ax.set_xticks(x + bar_width / 3)
|
||||
ax.set_xticklabels(max_times)
|
||||
ax.legend()
|
||||
|
||||
|
||||
1662
tests/data_sample/ALL_tsp/d1655.tsp
Normal file
2
tests/data_sample/a280_cities_minimum_2579.txt
Normal file
@ -0,0 +1,2 @@
|
||||
[[288, 149], [288, 129], [270, 133], [256, 141], [256, 157], [246, 157], [236, 169], [228, 169], [228, 161], [220, 169], [212, 169], [204, 169], [196, 169], [188, 169], [196, 161], [188, 145], [172, 145], [164, 145], [156, 145], [148, 145], [140, 145], [148, 169], [164, 169], [172, 169], [156, 169], [140, 169], [132, 169], [124, 169], [116, 161], [104, 153], [104, 161], [104, 169], [90, 165], [80, 157], [64, 157], [64, 165], [56, 169], [56, 161], [56, 153], [56, 145], [56, 137], [56, 129], [56, 121], [40, 121], [40, 129], [40, 137], [40, 145], [40, 153], [40, 161], [40, 169], [32, 169], [32, 161], [32, 153], [32, 145], [32, 137], [32, 129], [32, 121], [32, 113], [40, 113], [56, 113], [56, 105], [48, 99], [40, 99], [32, 97], [32, 89], [24, 89], [16, 97], [16, 109], [8, 109], [8, 97], [8, 89], [8, 81], [8, 73], [8, 65], [8, 57], [16, 57], [8, 49], [8, 41], [24, 45], [32, 41], [32, 49], [32, 57], [32, 65], [32, 73], [32, 81], [40, 83], [40, 73], [40, 63], [40, 51], [44, 43], [44, 35], [44, 27], [32, 25], [24, 25], [16, 25], [16, 17], [24, 17], [32, 17], [44, 11], [56, 9], [56, 17], [56, 25], [56, 33], [56, 41], [64, 41], [72, 41], [72, 49], [56, 49], [48, 51], [56, 57], [56, 65], [48, 63], [48, 73], [56, 73], [56, 81], [48, 83], [56, 89], [56, 97], [104, 97], [104, 105], [104, 113], [104, 121], [104, 129], [104, 137], [104, 145], [116, 145], [124, 145], [132, 145], [132, 137], [140, 137], [148, 137], [156, 137], [164, 137], [172, 125], [172, 117], [172, 109], [172, 101], [172, 93], [172, 85], [180, 85], [180, 77], [180, 69], [180, 61], [180, 53], [172, 53], [172, 61], [172, 69], [172, 77], [164, 81], [148, 85], [124, 85], [124, 93], [124, 109], [124, 125], [124, 117], [124, 101], [104, 89], [104, 81], [104, 73], [104, 65], [104, 49], [104, 41], [104, 33], [104, 25], [104, 17], [92, 9], [80, 9], [72, 9], [64, 21], [72, 25], [80, 25], [80, 25], [80, 41], [88, 49], [104, 57], [124, 69], [124, 77], [132, 81], [140, 65], [132, 61], [124, 61], [124, 53], [124, 45], [124, 37], [124, 29], [132, 21], [124, 21], [120, 9], [128, 9], [136, 9], [148, 9], [162, 9], [156, 25], [172, 21], [180, 21], [180, 29], [172, 29], [172, 37], [172, 45], [180, 45], [180, 37], [188, 41], [196, 49], [204, 57], [212, 65], [220, 73], [228, 69], [228, 77], [236, 77], [236, 69], [236, 61], [228, 61], [228, 53], [236, 53], [236, 45], [228, 45], [228, 37], [236, 37], [236, 29], [228, 29], [228, 21], [236, 21], [252, 21], [260, 29], [260, 37], [260, 45], [260, 53], [260, 61], [260, 69], [260, 77], [276, 77], [276,
|
||||
69], [276, 61], [276, 53], [284, 53], [284, 61], [284, 69], [284, 77], [284, 85], [284, 93], [284, 101], [288, 109], [280, 109], [276, 101], [276, 93], [276, 85], [268, 97], [260, 109], [252, 101], [260, 93], [260, 85], [236, 85], [228, 85], [228, 93], [236, 93], [236, 101], [228, 101], [228, 109], [228, 117], [228, 125], [220, 125], [212, 117], [204, 109], [196, 101], [188, 93], [180, 93], [180, 101], [180, 109], [180, 117], [180, 125], [196, 145], [204, 145], [212, 145], [220, 145], [228, 145], [236, 145], [246, 141], [252, 125], [260, 129], [280, 133]]
|
||||
23
tests/data_sample/d1655_cities_minimum_62128.txt
Normal file
@ -0,0 +1,23 @@
|
||||
[[0.0, 0.0], [1224.3, 945.6], [1325.9, 945.6], [1325.9, 971.0], [1224.3, 971.0], [1224.3, 996.4], [1325.9, 996.4], [1325.9, 1021.8], [1224.3, 1021.8], [1186.2, 1034.5], [1084.6, 1034.5], [1052.8, 1034.5], [1027.4, 1034.5], [1224.3, 1047.2], [1325.9, 1047.2], [1186.2, 1059.9], [1084.6, 1059.9], [1052.8, 1059.9], [1027.4, 1059.9], [1224.3, 1072.6], [1325.9, 1072.6], [1186.2, 1085.3], [1084.6, 1085.3], [1052.8, 1085.3], [1027.4, 1085.3], [1224.3, 1098.0], [1325.9, 1098.0], [1186.2, 1110.7], [1084.6, 1110.7], [1052.8, 1110.7], [1027.4, 1110.7], [1224.3, 1123.4], [1325.9, 1123.4], [1186.2, 1136.1], [1084.6, 1136.1], [1052.8, 1136.1], [1027.4, 1136.1], [1224.3, 1148.8], [1325.9, 1148.8], [1186.2,
|
||||
1161.5], [1084.6, 1161.5], [1052.8, 1161.5], [1027.4, 1161.5], [1224.3, 1174.2], [1325.9, 1174.2], [1186.2, 1186.9], [1084.6, 1186.9], [1052.8, 1186.9], [1027.4, 1186.9], [1224.3, 1199.6], [1325.9, 1199.6], [1186.2, 1212.3], [1084.6, 1212.3], [1052.8, 1212.3], [1027.4, 1212.3], [1224.3, 1225.0], [1325.9, 1225.0], [1186.2, 1237.7], [1084.6, 1237.7], [1052.8, 1237.7], [1027.4, 1237.7], [1224.3, 1250.4], [1325.9, 1250.4], [1186.2, 1263.1], [1084.6, 1263.1], [1052.8, 1263.1], [1027.4, 1263.1], [1224.3, 1275.8], [1325.9, 1275.8], [1186.2, 1288.5], [1084.6, 1288.5], [1052.8, 1288.5], [1027.4, 1288.5], [1027.4, 1313.9], [1052.8, 1313.9], [1084.6, 1313.9], [1186.2, 1313.9], [1287.8, 1339.3], [1262.4, 1339.3], [1186.2, 1339.3], [1084.6, 1339.3], [1052.8, 1339.3], [1027.4, 1339.3], [1027.4, 1364.7], [1052.8, 1364.7], [1084.6, 1364.7], [1186.2, 1364.7], [1186.2, 1390.1], [1084.6, 1390.1], [1052.8, 1390.1], [1027.4, 1390.1], [1224.3, 1402.8], [1325.9, 1402.8], [1186.2, 1415.5], [1084.6, 1415.5], [1052.8, 1415.5], [1027.4, 1415.5], [1224.3, 1428.2], [1325.9, 1428.2], [1325.9, 1453.6], [1224.3, 1453.6], [1224.3, 1479.0], [1325.9, 1479.0], [1186.2, 1491.7], [1084.6, 1491.7], [1052.8, 1491.7], [1027.4, 1504.4], [1224.3, 1504.4], [1325.9, 1504.4], [1052.8,
|
||||
1517.1], [1224.3, 1529.8], [1325.9, 1529.8], [1325.9, 1555.2], [1224.3, 1555.2], [1224.3, 1580.6], [1325.9, 1580.6], [1325.9, 1606.0], [1224.3, 1606.0], [1224.3, 1631.4], [1325.9, 1631.4], [1325.9, 1656.8], [1224.3, 1656.8], [1224.3, 1682.2], [1325.9, 1682.2], [1325.9, 1707.6], [1224.3, 1707.6], [1224.3, 1733.0], [1325.9, 1733.0], [1097.3, 1948.9], [1071.9, 1948.9], [1224.3, 2152.1], [1325.9, 2152.1], [1325.9, 2177.5], [1224.3, 2177.5], [1224.3, 2202.9], [1325.9, 2202.9], [1325.9, 2228.3], [1224.3, 2228.3], [1224.3, 2253.7], [1325.9, 2253.7], [1325.9, 2279.1], [1224.3, 2279.1], [1224.3, 2304.5], [1325.9, 2304.5], [1325.9, 2329.9], [1224.3, 2329.9], [1224.3, 2355.3], [1325.9, 2355.3], [1325.9, 2380.7], [1224.3, 2380.7], [1224.3, 2406.1], [1325.9, 2406.1], [1325.9, 2431.5], [1224.3, 2431.5], [1224.3, 2456.9], [1325.9, 2456.9], [1325.9, 2482.3], [1224.3, 2482.3], [1262.4, 2545.8], [1287.8, 2545.8], [1325.9, 2609.3], [1224.3, 2609.3], [1224.3, 2634.7], [1325.9, 2634.7], [1186.2, 2647.4], [1084.6, 2647.4], [1052.8, 2647.4], [1027.4, 2660.1], [1224.3, 2660.1], [1325.9, 2660.1], [1052.8, 2672.8], [1224.3, 2685.5], [1325.9, 2685.5], [1325.9, 2710.9], [1224.3, 2710.9], [1224.3, 2736.3], [1325.9, 2736.3], [1325.9, 2761.7], [1224.3, 2761.7], [1224.3,
|
||||
2787.1], [1325.9, 2787.1], [1325.9, 2812.5], [1224.3, 2812.5], [1325.9, 2837.9], [1224.3, 2837.9], [1186.2, 2837.9], [1084.6, 2837.9], [1224.3, 2863.3], [1325.9, 2863.3], [1325.9, 2888.7], [1224.3, 2888.7], [1224.3, 2914.1], [1325.9, 2914.1], [1325.9, 2939.5], [1224.3, 2939.5], [1579.9, 3028.4], [1605.3, 3028.4], [1630.7, 3028.4], [1656.1, 3028.4], [1681.5, 3028.4], [1706.9, 3028.4], [1732.3, 3028.4], [1757.7, 3028.4], [1783.1, 3028.4], [1808.5, 3028.4], [1833.9, 3028.4], [1859.3, 3028.4], [1884.7, 3028.4], [1910.1, 3028.4], [1935.5, 3028.4], [1973.6, 3015.7], [1999.0, 3015.7], [2024.4, 3015.7], [1922.8, 2984.0], [1821.2, 2984.0], [1618.0, 2971.3], [1681.5, 2964.9], [1783.1, 2964.9], [1821.2, 2958.6], [1922.8, 2958.6], [1643.4, 2945.9], [1681.5, 2939.5], [1783.1, 2939.5], [1973.6, 2939.5], [1999.0, 2939.5], [2024.4, 2939.5], [2075.2, 2939.5], [2176.8, 2939.5], [1948.2, 2920.5], [1872.0, 2920.5], [1618.0, 2920.5], [1681.5, 2914.1], [1783.1, 2914.1], [1973.6, 2914.1], [1999.0, 2914.1], [2024.4, 2914.1], [2075.2, 2914.1], [2176.8, 2914.1], [2176.8, 2888.7], [2075.2, 2888.7], [1783.1, 2888.7], [1681.5, 2888.7], [1618.0, 2869.7], [1872.0, 2869.7], [1948.2, 2869.7], [2176.8, 2863.3], [2075.2, 2863.3], [1783.1, 2863.3], [1681.5, 2863.3], [1643.4,
|
||||
2844.3], [1681.5, 2837.9], [1783.1, 2837.9], [1878.3, 2837.9], [1903.7, 2837.9], [1929.1, 2837.9], [1973.6, 2837.9], [1999.0, 2837.9], [2024.4, 2837.9], [2075.2, 2837.9], [2176.8, 2837.9], [1618.0, 2818.9], [1681.5, 2812.5], [1783.1, 2812.5], [2075.2, 2812.5], [2176.8, 2812.5], [2176.8, 2787.1], [2075.2, 2787.1], [2024.4, 2787.1], [1999.0, 2787.1], [1973.6, 2787.1], [1783.1, 2787.1], [1681.5, 2787.1], [1618.0, 2768.1], [1681.5, 2761.7], [1783.1, 2761.7], [2075.2, 2761.7], [2176.8, 2761.7], [1643.4, 2742.7], [1681.5, 2736.3], [1783.1, 2736.3], [1878.3, 2736.3], [1903.7, 2736.3], [1929.1, 2736.3], [2075.2, 2736.3], [2176.8, 2736.3], [1618.0, 2717.3], [1681.5, 2710.9], [1783.1, 2710.9], [1821.2, 2710.9], [1922.8, 2710.9], [1973.6, 2710.9], [1999.0, 2710.9], [2024.4, 2710.9], [2075.2, 2710.9], [2176.8, 2710.9], [2176.8, 2685.5], [2075.2, 2685.5], [2024.4, 2685.5], [1999.0, 2685.5], [1973.6, 2685.5], [1922.8, 2685.5], [1821.2, 2685.5], [1783.1, 2685.5], [1757.7, 2685.5], [1732.3, 2685.5], [1706.9, 2685.5], [1681.5, 2685.5], [1656.1, 2685.5], [1618.0, 2666.5], [1821.2, 2660.1], [1922.8, 2660.1], [2075.2, 2660.1], [2176.8, 2660.1], [1643.4, 2641.1], [1681.5, 2634.7], [1783.1, 2634.7], [1821.2, 2634.7], [1922.8, 2634.7], [2075.2, 2634.7], [2176.8,
|
||||
2634.7], [1618.0, 2615.7], [1681.5, 2609.3], [1783.1, 2609.3], [1821.2, 2609.3], [1922.8, 2609.3], [1973.6, 2609.3], [1999.0, 2609.3], [2024.4, 2609.3], [2075.2, 2609.3], [2176.8, 2609.3], [1935.5, 2571.2], [1910.1, 2571.2], [1884.7, 2571.2], [1859.3, 2571.2], [1833.9, 2571.2], [1808.5, 2571.2], [1783.1, 2571.2], [1757.7, 2571.2], [1732.3, 2571.2], [1706.9, 2571.2], [1681.5, 2571.2], [1656.1, 2571.2], [1630.7, 2571.2], [1605.3, 2571.2], [1579.9, 2571.2], [1973.6, 2558.5], [1999.0, 2558.5], [2024.4, 2558.5], [2113.3, 2545.8], [2138.7, 2545.8], [1922.8, 2526.8], [1821.2, 2526.8], [1618.0, 2514.1], [1681.5, 2507.7], [1783.1, 2507.7], [1821.2, 2501.4], [1922.8, 2501.4], [1643.4, 2488.7], [1681.5, 2482.3], [1783.1, 2482.3], [1973.6, 2482.3], [1999.0, 2482.3], [2024.4, 2482.3], [2075.2, 2482.3], [2176.8, 2482.3], [1948.2, 2463.3], [1872.0, 2463.3], [1618.0, 2463.3], [1681.5, 2456.9], [1783.1, 2456.9], [1973.6, 2456.9], [1999.0, 2456.9], [2024.4, 2456.9], [2075.2, 2456.9], [2176.8, 2456.9], [2176.8, 2431.5], [2075.2, 2431.5], [1783.1, 2431.5], [1681.5, 2431.5], [1618.0, 2412.5], [1872.0, 2412.5], [1948.2, 2412.5], [2176.8, 2406.1], [2075.2, 2406.1], [1783.1, 2406.1], [1681.5, 2406.1], [1643.4, 2387.1], [1681.5, 2380.7], [1783.1, 2380.7], [1878.3,
|
||||
2380.7], [1903.7, 2380.7], [1929.1, 2380.7], [1973.6, 2380.7], [1999.0, 2380.7], [2024.4, 2380.7], [2075.2, 2380.7], [2176.8, 2380.7], [1618.0, 2361.7], [1681.5, 2355.3], [1783.1, 2355.3], [2075.2, 2355.3], [2176.8, 2355.3], [2176.8, 2329.9], [2075.2, 2329.9], [2024.4, 2329.9], [1999.0, 2329.9], [1973.6, 2329.9], [1783.1, 2329.9], [1681.5, 2329.9], [1618.0, 2310.9], [1681.5, 2304.5], [1783.1, 2304.5], [2075.2, 2304.5], [2176.8, 2304.5], [1643.4, 2285.5], [1681.5, 2279.1], [1783.1, 2279.1], [1878.3, 2279.1], [1903.7, 2279.1], [1929.1, 2279.1], [2075.2, 2279.1], [2176.8, 2279.1], [1618.0, 2260.1], [1681.5, 2253.7], [1783.1, 2253.7], [1821.2, 2253.7], [1922.8, 2253.7], [1973.6, 2253.7], [1999.0, 2253.7], [2024.4, 2253.7], [2075.2, 2253.7], [2176.8, 2253.7], [2176.8, 2228.3], [2075.2, 2228.3], [2024.4, 2228.3], [1999.0, 2228.3], [1973.6, 2228.3], [1922.8, 2228.3], [1821.2, 2228.3], [1783.1, 2228.3], [1757.7, 2228.3], [1732.3, 2228.3], [1706.9, 2228.3], [1681.5, 2228.3], [1656.1, 2228.3], [1618.0, 2209.3], [1821.2, 2202.9], [1922.8, 2202.9], [2075.2, 2202.9], [2176.8, 2202.9], [1643.4, 2183.9], [1681.5, 2177.5], [1783.1, 2177.5], [1821.2, 2177.5], [1922.8, 2177.5], [2075.2, 2177.5], [2176.8, 2177.5], [1618.0, 2158.5], [1681.5, 2152.1], [1783.1,
|
||||
2152.1], [1821.2, 2152.1], [1922.8, 2152.1], [1973.6, 2152.1], [1999.0, 2152.1], [2024.4, 2152.1], [2075.2, 2152.1], [2176.8, 2152.1], [2113.3, 1948.9], [2138.7, 1948.9], [1935.5, 1745.7], [1910.1, 1745.7], [1884.7, 1745.7], [1859.3, 1745.7], [1833.9, 1745.7], [1808.5, 1745.7], [1783.1, 1745.7], [1757.7, 1745.7], [1732.3, 1745.7], [1706.9, 1745.7], [1681.5, 1745.7], [1656.1, 1745.7], [1630.7, 1745.7], [1605.3, 1745.7], [1579.9, 1745.7], [1973.6, 1733.0], [1999.0, 1733.0], [2024.4, 1733.0], [2075.2, 1733.0], [2176.8, 1733.0], [2176.8, 1707.6], [2075.2, 1707.6], [1922.8, 1701.3], [1821.2, 1701.3], [1618.0, 1688.6], [1681.5, 1682.2], [1783.1, 1682.2], [2075.2, 1682.2], [2176.8, 1682.2], [1922.8, 1675.9], [1821.2, 1675.9], [1643.4, 1663.2], [1681.5, 1656.8], [1783.1, 1656.8], [1973.6, 1656.8], [1999.0, 1656.8], [2024.4, 1656.8], [2075.2, 1656.8], [2176.8, 1656.8], [1948.2, 1637.8], [1872.0, 1637.8], [1618.0, 1637.8], [1681.5, 1631.4], [1783.1, 1631.4], [1973.6, 1631.4], [1999.0, 1631.4], [2024.4, 1631.4], [2075.2, 1631.4], [2176.8, 1631.4], [2176.8, 1606.0], [2075.2, 1606.0], [1783.1, 1606.0], [1681.5, 1606.0], [1618.0, 1587.0], [1872.0, 1587.0], [1948.2, 1587.0], [2176.8, 1580.6], [2075.2, 1580.6], [1783.1, 1580.6], [1681.5, 1580.6], [1643.4,
|
||||
1561.6], [1681.5, 1555.2], [1783.1, 1555.2], [1872.0, 1555.2], [1903.7, 1555.2], [1929.1, 1555.2], [1973.6, 1555.2], [1999.0, 1555.2], [2024.4, 1555.2], [2075.2, 1555.2], [2176.8, 1555.2], [1618.0, 1536.2], [1681.5, 1529.8], [1783.1, 1529.8], [2075.2, 1529.8], [2176.8, 1529.8], [2176.8, 1504.4], [2075.2, 1504.4], [2024.4, 1504.4], [1999.0, 1504.4], [1973.6, 1504.4], [1783.1, 1504.4], [1681.5, 1504.4], [1618.0, 1485.4], [1681.5, 1479.0], [1783.1, 1479.0], [2075.2, 1479.0], [2176.8, 1479.0], [1643.4, 1460.0], [1681.5, 1453.6], [1783.1, 1453.6], [1872.0, 1453.6], [1903.7, 1453.6], [1929.1, 1453.6], [2075.2, 1453.6], [2176.8, 1453.6], [1618.0, 1434.6], [1681.5, 1428.2], [1783.1, 1428.2], [1821.2, 1428.2], [1922.8, 1428.2], [1973.6, 1428.2], [1999.0, 1428.2], [2024.4, 1428.2], [2075.2, 1428.2], [2176.8, 1428.2], [2176.8, 1402.8], [2075.2, 1402.8], [2024.4, 1402.8], [1999.0, 1402.8], [1973.6, 1402.8], [1922.8, 1402.8], [1821.2, 1402.8], [1783.1, 1402.8], [1757.7, 1402.8], [1732.3, 1402.8], [1706.9, 1402.8], [1681.5, 1402.8], [1656.1, 1402.8], [1618.0, 1383.8], [1821.2, 1377.4], [1922.8, 1377.4], [1643.4, 1358.4], [1681.5, 1352.0], [1783.1, 1352.0], [1821.2, 1352.0], [1922.8, 1352.0], [2113.3, 1352.0], [2138.7, 1352.0], [1618.0, 1333.0], [1681.5,
|
||||
1326.6], [1783.1, 1326.6], [1821.2, 1326.6], [1922.8, 1326.6], [1973.6, 1326.6], [1999.0, 1326.6], [2024.4, 1326.6], [1935.5, 1288.5], [1910.1, 1288.5], [1884.7, 1288.5], [1859.3, 1288.5], [1833.9, 1288.5], [1808.5, 1288.5], [1783.1, 1288.5], [1757.7, 1288.5], [1732.3, 1288.5], [1706.9, 1288.5], [1681.5, 1288.5], [1656.1, 1288.5], [1630.7, 1288.5], [1605.3, 1288.5], [1579.9, 1288.5], [1973.6, 1275.8], [1999.0, 1275.8], [2024.4, 1275.8], [2075.2, 1275.8], [2176.8, 1275.8], [2176.8, 1250.4], [2075.2, 1250.4], [1922.8, 1244.1], [1821.2, 1244.1], [1618.0, 1231.4], [1681.5, 1225.0], [1783.1, 1225.0], [2075.2, 1225.0], [2176.8, 1225.0], [1922.8, 1218.7], [1821.2, 1218.7], [1643.4, 1206.0], [1681.5, 1199.6], [1783.1, 1199.6], [1973.6, 1199.6], [1999.0, 1199.6], [2024.4, 1199.6], [2075.2, 1199.6], [2176.8, 1199.6], [1948.2, 1180.6], [1872.0, 1180.6], [1618.0, 1180.6], [1681.5, 1174.2], [1783.1, 1174.2], [1973.6, 1174.2], [1999.0, 1174.2], [2024.4, 1174.2], [2075.2, 1174.2], [2176.8, 1174.2], [2176.8, 1148.8], [2075.2, 1148.8], [1783.1, 1148.8], [1681.5, 1148.8], [1618.0, 1129.8], [1872.0, 1129.8], [1948.2, 1129.8], [2176.8, 1123.4], [2075.2, 1123.4], [1783.1, 1123.4], [1681.5, 1123.4], [1643.4, 1104.4], [1681.5, 1098.0], [1783.1, 1098.0], [1878.3,
|
||||
1098.0], [1903.7, 1098.0], [1929.1, 1098.0], [1973.6, 1098.0], [1999.0, 1098.0], [2024.4, 1098.0], [2075.2, 1098.0], [2176.8, 1098.0], [1618.0, 1079.0], [1681.5, 1072.6], [1783.1, 1072.6], [2075.2, 1072.6], [2176.8, 1072.6], [2176.8, 1047.2], [2075.2, 1047.2], [2024.4, 1047.2], [1999.0, 1047.2], [1973.6, 1047.2], [1783.1, 1047.2], [1681.5, 1047.2], [1618.0, 1028.2], [1681.5, 1021.8], [1783.1, 1021.8], [2075.2, 1021.8], [2176.8, 1021.8], [1643.4, 1002.8], [1681.5, 996.4], [1783.1, 996.4], [1878.3, 996.4], [1903.7, 996.4], [1929.1, 996.4], [2075.2, 996.4], [2176.8, 996.4], [1618.0, 977.4], [1681.5, 971.0], [1783.1, 971.0], [1821.2, 971.0], [1922.8, 971.0], [1973.6, 971.0], [1999.0, 971.0], [2024.4, 971.0], [2075.2, 971.0], [2176.8, 971.0], [2176.8, 945.6], [2075.2, 945.6], [2024.4, 945.6], [1999.0, 945.6], [1973.6, 945.6], [1922.8, 945.6], [1821.2, 945.6], [1783.1, 945.6], [1757.7, 945.6], [1732.3, 945.6], [1706.9, 945.6], [1681.5, 945.6], [1656.1, 945.6], [1618.0, 926.6], [1821.2, 920.2], [1922.8, 920.2], [1643.4, 901.2], [1681.5, 894.8], [1783.1, 894.8], [1821.2, 894.8], [1922.8, 894.8], [1618.0, 875.8], [1681.5, 869.4], [1783.1, 869.4], [1821.2, 869.4], [1922.8, 869.4], [1973.6, 869.4], [1999.0, 869.4], [2024.4, 869.4], [2449.8, 2037.8], [2475.2, 2037.8], [2500.6, 2037.8], [2526.0, 2037.8], [2551.4, 2037.8], [2576.8, 2037.8], [2602.2, 2037.8], [2627.6, 2037.8], [2672.1, 2037.8], [2697.5, 2037.8], [2722.9, 2037.8], [2748.3, 2037.8], [2773.7, 2037.8], [2799.1, 2037.8], [2824.5, 2037.8], [2849.9, 2037.8], [2926.1, 2075.9], [3002.3, 2075.9], [3053.1, 2075.9], [3103.9, 2075.9], [3167.4, 2075.9], [3243.6, 2075.9], [3294.4, 2075.9], [3345.2, 2075.9], [3383.3, 2088.6], [3459.5, 2088.6], [3497.6, 2088.6], [3599.2, 2088.6], [3650.0, 2088.6], [3675.4, 2088.6], [3700.8, 2088.6], [2849.9, 2114.0], [2824.5, 2114.0], [2799.1, 2114.0], [2773.7, 2114.0], [2748.3, 2114.0], [2722.9, 2114.0], [2697.5, 2114.0], [2672.1, 2114.0], [2627.6, 2114.0], [2602.2, 2114.0], [2576.8, 2114.0], [2551.4, 2114.0], [2526.0, 2114.0], [2500.6, 2114.0], [2475.2, 2114.0], [2449.8, 2114.0], [3497.6, 2126.7], [3599.2, 2126.7], [3459.5, 2139.4], [3383.3, 2139.4], [3345.2, 2152.1], [3294.4, 2152.1], [3243.6, 2152.1], [3167.4, 2152.1], [3103.9,
|
||||
2152.1], [3053.1, 2152.1], [3002.3, 2152.1], [2926.1, 2152.1], [2875.3, 2152.1], [2849.9, 2152.1], [2824.5, 2152.1], [2773.7, 2152.1], [2672.1, 2152.1], [2634.0, 2152.1], [2532.4, 2152.1], [2468.9, 2158.5], [2532.4, 2177.5], [2634.0, 2177.5], [2672.1, 2177.5], [2773.7, 2177.5], [2494.3, 2183.9], [2672.1, 2202.9], [2773.7, 2202.9], [2926.1, 2202.9], [3002.3, 2202.9], [3053.1, 2202.9], [3103.9, 2202.9], [3167.4, 2202.9], [3243.6, 2202.9], [3294.4, 2202.9], [3345.2, 2202.9], [2468.9, 2209.3], [3383.3, 2215.6], [3459.5, 2215.6], [3497.6, 2215.6], [3599.2, 2215.6], [3675.4, 2215.6], [3726.2, 2215.6], [2875.3, 2228.3], [2849.9, 2228.3], [2824.5, 2228.3], [2773.7, 2228.3], [2672.1, 2228.3], [2634.0, 2228.3], [2608.6, 2228.3], [2583.2, 2228.3], [2557.8, 2228.3], [2532.4, 2228.3], [2507.0, 2228.3], [3675.4, 2241.0], [3726.2, 2241.0], [3599.2, 2253.7], [3497.6, 2253.7], [2875.3, 2253.7], [2849.9, 2253.7], [2824.5, 2253.7], [2773.7, 2253.7], [2672.1, 2253.7], [2634.0, 2253.7], [2532.4, 2253.7], [2468.9, 2260.1], [3383.3, 2266.4], [3459.5, 2266.4], [3675.4, 2266.4], [3726.2, 2266.4], [3345.2, 2279.1], [3294.4, 2279.1], [3243.6, 2279.1], [3167.4, 2279.1], [3103.9, 2279.1], [3053.1, 2279.1], [3002.3, 2279.1], [2926.1, 2279.1], [2780.0, 2279.1], [2754.6,
|
||||
2279.1], [2729.2, 2279.1], [2634.0, 2279.1], [2532.4, 2279.1], [2494.3, 2285.5], [3675.4, 2291.8], [3726.2, 2291.8], [2634.0, 2304.5], [2532.4, 2304.5], [2468.9, 2310.9], [3675.4, 2317.2], [3726.2, 2317.2], [3345.2, 2329.9], [3294.4, 2329.9], [3243.6, 2329.9], [3167.4, 2329.9], [3103.9, 2329.9], [3053.1, 2329.9], [3002.3, 2329.9], [2926.1, 2329.9], [2875.3, 2329.9], [2849.9, 2329.9], [2824.5, 2329.9], [2634.0, 2329.9], [2532.4, 2329.9], [3383.3, 2342.6], [3459.5, 2342.6], [3497.6, 2342.6], [3599.2, 2342.6], [3675.4, 2342.6], [3726.2, 2342.6], [2634.0, 2355.3], [2532.4, 2355.3], [2468.9, 2361.7], [3675.4, 2368.0], [3726.2, 2368.0], [3599.2, 2380.7], [3497.6, 2380.7], [2875.3, 2380.7], [2849.9, 2380.7], [2824.5, 2380.7], [2780.0, 2380.7], [2754.6, 2380.7], [2729.2, 2380.7], [2634.0, 2380.7], [2532.4, 2380.7], [2494.3, 2387.1], [3383.3, 2393.4], [3459.5, 2393.4], [3675.4, 2393.4], [3726.2, 2393.4], [3345.2, 2406.1], [3294.4, 2406.1], [3243.6, 2406.1], [3167.4, 2406.1], [3103.9, 2406.1], [3053.1, 2406.1], [3002.3, 2406.1], [2926.1, 2406.1], [2634.0, 2406.1], [2532.4, 2406.1], [2468.9, 2412.5], [2722.9, 2412.5], [2799.1, 2412.5], [3675.4, 2418.8], [3726.2, 2418.8], [2634.0, 2431.5], [2532.4, 2431.5], [3675.4, 2444.2], [3726.2, 2444.2], [3345.2,
|
||||
2456.9], [3294.4, 2456.9], [3243.6, 2456.9], [3167.4, 2456.9], [3103.9, 2456.9], [3053.1, 2456.9], [3002.3, 2456.9], [2926.1, 2456.9], [2875.3, 2456.9], [2849.9, 2456.9], [2824.5, 2456.9], [2634.0, 2456.9], [2532.4, 2456.9], [2468.9, 2463.3], [2722.9, 2463.3], [2799.1, 2463.3], [3383.3, 2469.6], [3459.5, 2469.6], [3497.6, 2469.6], [3599.2, 2469.6], [3675.4, 2469.6], [3726.2, 2469.6], [2875.3, 2482.3], [2849.9, 2482.3], [2824.5, 2482.3], [2634.0, 2482.3], [2532.4, 2482.3], [2494.3, 2488.7], [3675.4, 2495.0], [3726.2, 2495.0], [2773.7, 2501.4], [2672.1, 2501.4], [2532.4, 2507.7], [2634.0, 2507.7], [3497.6, 2507.7], [3599.2, 2507.7], [2468.9, 2514.1], [3383.3, 2520.4], [3459.5, 2520.4], [3675.4, 2520.4], [3726.2, 2520.4], [2773.7, 2526.8], [2672.1, 2526.8], [2926.1, 2533.1], [3002.3, 2533.1], [3053.1, 2533.1], [3103.9, 2533.1], [3167.4, 2533.1], [3243.6, 2533.1], [3294.4, 2533.1], [3345.2, 2533.1], [3675.4, 2545.8], [3726.2, 2545.8], [2875.3, 2558.5], [2849.9, 2558.5], [2824.5, 2558.5], [2430.8, 2571.2], [2456.2, 2571.2], [2481.6, 2571.2], [2507.0, 2571.2], [2532.4, 2571.2], [2557.8, 2571.2], [2583.2, 2571.2], [2608.6, 2571.2], [2634.0, 2571.2], [2659.4, 2571.2], [2684.8, 2571.2], [2710.2, 2571.2], [2735.6, 2571.2], [2761.0, 2571.2], [2786.4,
|
||||
2571.2], [3675.4, 2571.2], [3726.2, 2571.2], [3345.2, 2583.9], [3294.4, 2583.9], [3243.6, 2583.9], [3167.4, 2583.9], [3103.9, 2583.9], [3053.1, 2583.9], [3002.3, 2583.9], [2926.1, 2583.9], [3383.3, 2596.6], [3459.5, 2596.6], [3497.6, 2596.6], [3599.2, 2596.6], [3675.4, 2596.6], [3726.2, 2596.6], [2875.3, 2609.3], [2849.9, 2609.3], [2824.5, 2609.3], [2773.7, 2609.3], [2672.1, 2609.3], [2634.0, 2609.3], [2532.4, 2609.3], [2468.9, 2615.7], [3675.4, 2622.0], [3726.2, 2622.0], [3599.2, 2634.7], [3497.6, 2634.7], [2773.7, 2634.7], [2672.1, 2634.7], [2634.0, 2634.7], [2532.4, 2634.7], [2494.3, 2641.1], [3383.3, 2647.4], [3459.5, 2647.4], [3675.4, 2647.4], [3726.2, 2647.4], [3345.2, 2660.1], [3294.4, 2660.1], [3243.6, 2660.1], [3167.4, 2660.1], [3103.9, 2660.1], [3053.1, 2660.1], [3002.3, 2660.1], [2926.1, 2660.1], [2773.7, 2660.1], [2672.1, 2660.1], [2468.9, 2666.5], [3675.4, 2672.8], [3726.2, 2672.8], [2634.0, 2679.2], [2608.6, 2679.2], [2583.2, 2679.2], [2507.0, 2685.5], [2532.4, 2685.5], [2557.8, 2685.5], [2672.1, 2685.5], [2773.7, 2685.5], [2824.5, 2685.5], [2849.9, 2685.5], [2875.3, 2685.5], [3675.4, 2698.2], [3726.2, 2698.2], [3345.2, 2710.9], [3294.4, 2710.9], [3243.6, 2710.9], [3167.4, 2710.9], [3103.9, 2710.9], [3053.1, 2710.9], [3002.3,
|
||||
2710.9], [2926.1, 2710.9], [2875.3, 2710.9], [2849.9, 2710.9], [2824.5, 2710.9], [2773.7, 2710.9], [2672.1, 2710.9], [2634.0, 2710.9], [2532.4, 2710.9], [2468.9, 2717.3], [3383.3, 2723.6], [3459.5, 2723.6], [3497.6, 2723.6], [3599.2, 2723.6], [3675.4, 2723.6], [3726.2, 2723.6], [2780.0, 2736.3], [2754.6, 2736.3], [2729.2, 2736.3], [2634.0, 2736.3], [2532.4, 2736.3], [2494.3, 2742.7], [3675.4, 2749.0], [3726.2, 2749.0], [3599.2, 2761.7], [3497.6, 2761.7], [2634.0, 2761.7], [2532.4, 2761.7], [2468.9, 2768.1], [3383.3, 2774.4], [3459.5, 2774.4], [3675.4, 2774.4], [3726.2, 2774.4], [3345.2, 2787.1], [3294.4, 2787.1], [3243.6, 2787.1], [3167.4, 2787.1], [3103.9, 2787.1], [3053.1, 2787.1], [3002.3, 2787.1], [2926.1, 2787.1], [2875.3, 2787.1], [2849.9, 2787.1], [2824.5, 2787.1], [2634.0, 2787.1], [2532.4, 2787.1], [3675.4, 2799.8], [3726.2, 2799.8], [2634.0, 2812.5], [2532.4, 2812.5], [2468.9, 2818.9], [3675.4, 2825.2], [3726.2, 2825.2], [3345.2, 2837.9], [3294.4, 2837.9], [3243.6, 2837.9], [3167.4, 2837.9], [3103.9, 2837.9], [3053.1, 2837.9], [3002.3, 2837.9], [2926.1, 2837.9], [2875.3, 2837.9], [2849.9, 2837.9], [2824.5, 2837.9], [2780.0, 2837.9], [2754.6, 2837.9], [2729.2, 2837.9], [2634.0, 2837.9], [2532.4, 2837.9], [2494.3, 2844.3], [3383.3,
|
||||
2850.6], [3459.5, 2850.6], [3497.6, 2850.6], [3599.2, 2850.6], [3675.4, 2850.6], [3726.2, 2850.6], [2634.0, 2863.3], [2532.4, 2863.3], [2468.9, 2869.7], [2722.9, 2869.7], [2799.1, 2869.7], [3675.4, 2876.0], [3726.2, 2876.0], [3599.2, 2888.7], [3497.6, 2888.7], [2634.0, 2888.7], [2532.4, 2888.7], [3383.3, 2901.4], [3459.5, 2901.4], [3675.4, 2901.4], [3726.2, 2901.4], [3345.2, 2914.1], [3294.4, 2914.1], [3243.6, 2914.1], [3167.4, 2914.1], [3103.9, 2914.1], [3053.1, 2914.1], [3002.3, 2914.1], [2926.1, 2914.1], [2875.3, 2914.1], [2849.9, 2914.1], [2824.5, 2914.1], [2634.0, 2914.1], [2532.4, 2914.1], [2468.9, 2920.5], [2722.9, 2920.5], [2799.1, 2920.5], [3675.4, 2926.8], [3726.2, 2926.8], [2875.3, 2939.5], [2849.9, 2939.5], [2824.5, 2939.5], [2634.0, 2939.5], [2532.4, 2939.5], [2494.3, 2945.9], [3675.4, 2952.2], [3726.2, 2952.2], [2773.7, 2958.6], [2672.1, 2958.6], [2532.4, 2964.9], [2634.0, 2964.9], [2926.1, 2964.9], [3002.3, 2964.9], [3053.1, 2964.9], [3103.9, 2964.9], [3167.4, 2964.9], [3243.6, 2964.9], [3294.4, 2964.9], [3345.2, 2964.9], [2468.9, 2971.3], [3383.3, 2977.6], [3459.5, 2977.6], [3497.6, 2977.6], [3599.2, 2977.6], [3675.4, 2977.6], [3726.2, 2977.6], [2773.7, 2984.0], [2672.1, 2984.0], [3675.4, 3003.0], [3726.2, 3003.0], [3599.2,
|
||||
3015.7], [3497.6, 3015.7], [2875.3, 3015.7], [2849.9, 3015.7], [2824.5, 3015.7], [2430.8, 3028.4], [2456.2, 3028.4], [2481.6, 3028.4], [2507.0, 3028.4], [2532.4, 3028.4], [2557.8, 3028.4], [2583.2, 3028.4], [2608.6, 3028.4], [2634.0, 3028.4], [2659.4, 3028.4], [2684.8, 3028.4], [2710.2, 3028.4], [2735.6, 3028.4], [2761.0, 3028.4], [2786.4, 3028.4], [3383.3, 3028.4], [3459.5, 3028.4], [3345.2, 3041.1], [3294.4, 3041.1], [3243.6, 3041.1], [3167.4, 3041.1], [3103.9, 3041.1], [3053.1, 3041.1], [3002.3, 3041.1], [2926.1, 3041.1], [3535.7, 3066.5], [3561.1, 3066.5], [3586.5, 3066.5], [3586.5, 2012.4], [3535.7, 2012.4], [3484.9, 2012.4], [3408.7, 2012.4], [3345.2, 2012.4], [3294.4, 2012.4], [3243.6, 2012.4], [3167.4, 2012.4], [3103.9, 2012.4], [3053.1, 2012.4], [3002.3, 2012.4], [2926.1, 2012.4], [2926.1, 1936.2], [3002.3, 1936.2], [3053.1, 1936.2], [3103.9, 1936.2], [3167.4, 1936.2], [3243.6, 1936.2], [3294.4, 1936.2], [3345.2, 1936.2], [3408.7, 1936.2], [3484.9, 1936.2], [3535.7, 1936.2], [3586.5, 1936.2], [3446.8, 1796.5], [3421.4, 1796.5], [3396.0, 1796.5], [2786.4, 1745.7], [2761.0, 1745.7], [2735.6, 1745.7], [2710.2, 1745.7], [2684.8, 1745.7], [2659.4, 1745.7], [2634.0, 1745.7], [2608.6, 1745.7], [2583.2, 1745.7], [2557.8, 1745.7], [2532.4,
|
||||
1745.7], [2507.0, 1745.7], [2481.6, 1745.7], [2456.2, 1745.7], [2430.8, 1745.7], [2824.5, 1733.0], [2849.9, 1733.0], [2875.3, 1733.0], [2773.7, 1701.3], [2672.1, 1701.3], [2468.9, 1688.6], [2532.4, 1682.2], [2634.0, 1682.2], [3249.9, 1682.2], [3351.5, 1682.2], [2773.7, 1675.9], [2672.1, 1675.9], [2494.3, 1663.2], [2532.4, 1656.8], [2634.0, 1656.8], [2824.5, 1656.8], [2849.9, 1656.8], [2875.3, 1656.8], [3249.9, 1656.8], [3351.5, 1656.8], [2799.1, 1637.8], [2722.9, 1637.8], [2468.9, 1637.8], [2532.4, 1631.4], [2634.0, 1631.4], [2824.5, 1631.4], [2849.9, 1631.4], [2875.3, 1631.4], [3249.9, 1631.4], [3351.5, 1631.4], [3351.5, 1606.0], [3249.9, 1606.0], [2634.0, 1606.0], [2532.4, 1606.0], [2468.9, 1587.0], [2722.9, 1587.0], [2799.1, 1587.0], [2532.4, 1580.6], [2634.0, 1580.6], [3249.9, 1580.6], [3351.5, 1580.6], [2494.3, 1561.6], [2532.4, 1555.2], [2634.0, 1555.2], [2729.2, 1555.2], [2754.6, 1555.2], [2780.0, 1555.2], [2824.5, 1555.2], [2849.9, 1555.2], [2875.3, 1555.2], [2468.9, 1536.2], [2532.4, 1529.8], [2634.0, 1529.8], [2532.4, 1504.4], [2634.0, 1504.4], [2824.5, 1504.4], [2849.9, 1504.4], [2875.3, 1504.4], [2468.9, 1485.4], [2532.4, 1479.0], [2634.0, 1479.0], [2964.2, 1479.0], [2494.3, 1460.0], [2532.4, 1453.6], [2634.0, 1453.6], [2729.2,
|
||||
1453.6], [2754.6, 1453.6], [2780.0, 1453.6], [2468.9, 1434.6], [2532.4, 1428.2], [2634.0, 1428.2], [2672.1, 1428.2], [2773.7, 1428.2], [2824.5, 1428.2], [2849.9, 1428.2], [2875.3, 1428.2], [2875.3, 1402.8], [2849.9, 1402.8], [2824.5, 1402.8], [2773.7, 1402.8], [2672.1, 1402.8], [2634.0, 1402.8], [2608.6, 1402.8], [2583.2, 1402.8], [2557.8, 1402.8], [2532.4, 1402.8], [2507.0, 1402.8], [2468.9, 1383.8], [2672.1, 1377.4], [2773.7, 1377.4], [2964.2, 1377.4], [2494.3, 1358.4], [2532.4, 1352.0], [2634.0, 1352.0], [2672.1, 1352.0], [2773.7, 1352.0], [2468.9, 1333.0], [2532.4, 1326.6], [2634.0, 1326.6], [2672.1, 1326.6], [2773.7, 1326.6], [2824.5, 1326.6], [2849.9, 1326.6], [2875.3, 1326.6], [2786.4, 1288.5], [2761.0, 1288.5], [2735.6, 1288.5], [2710.2, 1288.5], [2684.8, 1288.5], [2659.4, 1288.5], [2634.0, 1288.5], [2608.6, 1288.5], [2583.2, 1288.5], [2557.8, 1288.5], [2532.4, 1288.5], [2507.0, 1288.5], [2481.6, 1288.5], [2456.2, 1288.5], [2430.8, 1288.5], [2824.5, 1275.8], [2849.9, 1275.8], [2875.3, 1275.8], [2773.7, 1244.1], [2672.1, 1244.1], [2468.9, 1231.4], [2532.4, 1225.0], [2634.0, 1225.0], [2672.1, 1218.7], [2773.7, 1218.7], [2494.3, 1206.0], [2532.4, 1199.6], [2634.0, 1199.6], [2824.5, 1199.6], [2849.9, 1199.6], [2875.3, 1199.6], [2799.1,
|
||||
1180.6], [2722.9, 1180.6], [2468.9, 1180.6], [2532.4, 1174.2], [2634.0, 1174.2], [2824.5, 1174.2], [2849.9, 1174.2], [2875.3, 1174.2], [2634.0, 1148.8], [2532.4, 1148.8], [2468.9, 1129.8], [2722.9, 1129.8], [2799.1, 1129.8], [2634.0, 1123.4], [2532.4, 1123.4], [2494.3, 1104.4], [2532.4, 1098.0], [2634.0, 1098.0], [2729.2, 1098.0], [2754.6, 1098.0], [2780.0, 1098.0], [2824.5, 1098.0], [2849.9, 1098.0], [2875.3, 1098.0], [2468.9, 1079.0], [2532.4, 1072.6], [2634.0, 1072.6], [2919.7, 1066.3], [3021.3, 1066.3], [3091.2, 1066.3], [3192.8, 1066.3], [3243.6, 1066.3], [3345.2, 1066.3], [2875.3, 1047.2], [2849.9, 1047.2], [2824.5, 1047.2], [2634.0, 1047.2], [2532.4, 1047.2], [2919.7, 1040.9], [3021.3, 1040.9], [3091.2, 1040.9], [3192.8, 1040.9], [3243.6, 1040.9], [3345.2, 1040.9], [2468.9, 1028.2], [2532.4, 1021.8], [2634.0, 1021.8], [2919.7, 1015.5], [3021.3, 1015.5], [3091.2, 1015.5], [3192.8, 1015.5], [3243.6, 1015.5], [3345.2, 1015.5], [2494.3, 1002.8], [2532.4, 996.4],
|
||||
[2634.0, 996.4], [2729.2, 996.4], [2754.6, 996.4], [2780.0, 996.4], [2919.7, 990.1], [3021.3, 990.1], [2468.9, 977.4], [2532.4, 971.0], [2634.0, 971.0], [2672.1, 971.0], [2773.7, 971.0], [2824.5, 971.0], [2849.9, 971.0], [2875.3, 971.0], [2875.3, 945.6], [2849.9, 945.6], [2824.5, 945.6], [2773.7, 945.6], [2672.1, 945.6], [2634.0, 945.6], [2608.6, 945.6], [2583.2, 945.6], [2557.8, 945.6], [2532.4, 945.6], [2507.0, 945.6], [2468.9, 926.6], [2672.1, 920.2], [2773.7, 920.2], [2494.3, 901.2], [2532.4, 894.8], [2634.0, 894.8], [2672.1, 894.8], [2773.7, 894.8], [2468.9, 875.8], [2532.4, 869.4], [2634.0, 869.4], [2672.1, 869.4], [2773.7, 869.4], [2824.5, 869.4], [2849.9, 869.4], [2875.3, 869.4], [3091.2, 958.3], [3116.6, 958.3], [3142.0, 958.3], [3167.4, 958.3], [3192.8, 958.3], [3218.2, 958.3], [3243.6, 958.3], [3269.0, 958.3], [3294.4, 958.3], [3319.8, 958.3], [3319.8, 882.1], [3294.4, 882.1], [3269.0, 882.1], [3243.6, 882.1], [3218.2, 882.1], [3192.8, 882.1], [3167.4, 882.1], [3142.0, 882.1], [3116.6, 882.1], [3091.2, 882.1], [3116.6, 844.0], [3218.2, 844.0], [3535.7, 831.3], [3561.1, 831.3], [3586.5, 831.3], [3650.0, 882.1], [3675.4, 882.1], [3726.2, 882.1], [3726.2, 907.5], [3675.4, 907.5], [3650.0, 907.5], [3650.0, 932.9], [3675.4, 932.9], [3726.2, 932.9], [3726.2, 958.3], [3675.4, 958.3], [3650.0, 958.3], [3650.0, 983.7], [3675.4, 983.7], [3726.2, 983.7], [3726.2, 1009.1], [3675.4, 1009.1], [3650.0, 1009.1], [3650.0, 1034.5], [3675.4, 1034.5], [3726.2, 1034.5], [3726.2, 1059.9], [3675.4, 1059.9], [3650.0, 1059.9], [3650.0, 1085.3], [3675.4, 1085.3], [3726.2, 1085.3], [3726.2, 1110.7], [3675.4, 1110.7], [3650.0, 1110.7], [3650.0, 1136.1], [3675.4, 1136.1], [3726.2, 1136.1], [3726.2, 1161.5], [3675.4, 1161.5], [3650.0, 1161.5], [3650.0, 1186.9], [3675.4, 1186.9], [3726.2, 1186.9], [3586.5, 1199.6], [3561.1, 1199.6], [3650.0, 1212.3], [3675.4, 1212.3], [3726.2, 1212.3], [3726.2, 1237.7], [3675.4, 1237.7], [3650.0, 1237.7], [3650.0, 1263.1], [3675.4, 1263.1], [3726.2, 1263.1], [3726.2, 1288.5], [3675.4, 1288.5], [3650.0, 1288.5], [3586.5, 1301.2], [3561.1, 1301.2], [3650.0, 1313.9], [3675.4, 1313.9], [3726.2, 1313.9], [3726.2, 1339.3], [3675.4, 1339.3], [3650.0, 1339.3], [3650.0, 1364.7], [3675.4, 1364.7], [3726.2, 1364.7], [3726.2, 1390.1], [3675.4, 1390.1], [3650.0, 1390.1], [3650.0, 1415.5], [3675.4, 1415.5], [3726.2, 1415.5], [3726.2, 1440.9], [3675.4, 1440.9], [3650.0, 1440.9], [3650.0, 1466.3], [3675.4, 1466.3], [3726.2, 1466.3], [3726.2, 1491.7], [3675.4, 1491.7], [3650.0,
|
||||
1491.7], [3650.0, 1517.1], [3675.4, 1517.1], [3726.2, 1517.1], [3726.2, 1542.5], [3675.4, 1542.5], [3650.0, 1542.5], [3573.8, 1548.9], [3548.4, 1548.9], [3650.0, 1567.9], [3675.4, 1567.9], [3726.2, 1567.9], [3726.2, 1593.3], [3675.4, 1593.3], [3650.0, 1593.3], [3650.0, 1618.7], [3675.4, 1618.7], [3726.2, 1618.7], [3726.2, 1644.1], [3675.4, 1644.1], [3650.0, 1644.1], [3726.2, 1669.5], [3675.4, 1669.5], [3650.0, 1669.5], [3599.2, 1669.5], [3497.6, 1669.5], [3497.6, 1694.9], [3599.2, 1694.9], [3599.2, 1720.3], [3497.6, 1720.3]]
|
||||