update deliverable + other script

This commit is contained in:
Louis 2023-06-19 16:37:23 +02:00
parent cbe40b0970
commit cdfbfd68d1
4 changed files with 777 additions and 77 deletions

File diff suppressed because one or more lines are too long

View File

@ -3,92 +3,21 @@ import matplotlib.pyplot as plt
import numpy as np import numpy as np
import random, time, math import random, time, math
from libs.clustering import split_tour_across_clusters from libs.clustering import split_tour_across_clusters
from libs.aco import AntColony, total_distance
def generate_cities(nb, max_coords=1000): def generate_cities(nb, max_coords=1000):
return [random.sample(range(max_coords), 2) for _ in range(nb)] return [random.sample(range(max_coords), 2) for _ in range(nb)]
def distance(city1, city2):
return math.sqrt((city1[0] - city2[0]) ** 2 + (city1[1] - city2[1]) ** 2) + 1e-10
def total_distance(cities):
return sum([distance(cities[i - 1], cities[i]) for i in range(len(cities))])
class AntColony:
def __init__(self, cities, n_ants, alpha=1, beta=4, evaporation=0.5, intensification=2, max_time=0.1):
self.cities = cities
self.n = len(cities)
self.n_ants = n_ants
self.alpha = alpha
self.beta = beta
self.evaporation = evaporation
self.intensification = intensification
self.max_time = max_time
self.pheromones = [[1 / self.n for _ in range(self.n)] for __ in range(self.n)]
def choose_next_city(self, ant):
unvisited_cities = [i for i in range(self.n) if i not in ant]
probabilities = [self.pheromones[ant[-1]][i] ** self.alpha * ((1 / distance(self.cities[ant[-1]], self.cities[i])) ** self.beta) for i in unvisited_cities]
total = sum(probabilities)
if total == 0:
probabilities = [1 / len(unvisited_cities) for _ in unvisited_cities]
else:
probabilities = [p / total for p in probabilities]
return np.random.choice(unvisited_cities, p=probabilities)
def update_pheromones(self, ant):
pheromones_delta = self.intensification / total_distance([self.cities[i] for i in ant])
for i in range(len(ant) - 1):
self.pheromones[ant[i]][ant[i+1]] += pheromones_delta
def run(self):
best_ant = []
best_distance = float('inf')
start_time = time.time()
while time.time() - start_time < self.max_time:
ants = [[random.randint(0, self.n - 1)] for _ in range(self.n_ants)]
for ant in ants:
for _ in range(self.n - 1):
ant.append(self.choose_next_city(ant))
ant_distance = total_distance([self.cities[i] for i in ant])
if ant_distance < best_distance:
best_distance = ant_distance
best_ant = ant.copy()
self.update_pheromones(ant)
self.pheromones = [[(1 - self.evaporation) * p for p in row] for row in self.pheromones]
return [self.cities[i] for i in best_ant]
nb_ville = 2000 nb_ville = 2000
max_coords = 1000 max_coords = 1000
nb_truck = 3 nb_truck = 1
max_time = 50 max_time = 2
nb_ants = 10 nb_ants = 10
max_time_per_cluster = max_time / nb_truck max_time_per_cluster = max_time / nb_truck
start_time_generate = time.time() start_time_generate = time.time()
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, 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]]
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] #cities[0] = [max_coords/2, max_coords/2]
stop_time_generate = time.time() stop_time_generate = time.time()

View File

@ -4,8 +4,6 @@ import numpy as np
import random, time, math import random, time, math
from libs.clustering import split_tour_across_clusters from libs.clustering import split_tour_across_clusters
random.seed(3)
def generate_cities(nb, max_coords=1000): def generate_cities(nb, max_coords=1000):
return [random.sample(range(max_coords), 2) for _ in range(nb)] return [random.sample(range(max_coords), 2) for _ in range(nb)]

View File

@ -0,0 +1,82 @@
import numpy as np
from matplotlib import pyplot as plt
from libs.aco import AntColony, total_distance
name_1 = "att48"
cities_1 = [[6734, 1453], [2233, 10], [5530, 1424], [401, 841], [3082, 1644], [7608, 4458], [7573, 3716], [7265, 1268], [6898, 1885], [1112, 2049], [5468, 2606], [5989, 2873], [4706, 2674], [4612, 2035], [6347, 2683], [6107, 669], [7611, 5184], [7462, 3590], [7732, 4723], [5900, 3561], [4483, 3369], [6101, 1110], [5199, 2182], [1633, 2809], [4307, 2322], [675, 1006], [7555, 4819], [7541, 3981], [3177, 756], [7352, 4506], [7545, 2801], [3245, 3305], [6426, 3173], [4608, 1198], [23, 2216], [7248, 3779], [7762, 4595], [7392, 2244], [3484, 2829], [6271, 2135], [4985, 140], [1916, 1569], [7280, 4899], [7509, 3239], [10, 2676], [6807, 2993], [5185, 3258], [3023, 1942]]
optimal_1 = 33523
name_2 = "berlin52"
cities_2 = [[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_2 = 7542
name_3 = "eil76"
cities_3 = [[22, 22], [36, 26], [21, 45], [45, 35], [55, 20], [33, 34], [50, 50], [55, 45], [26, 59], [40, 66], [55, 65], [35, 51], [62, 35], [62, 57], [62, 24], [21, 36], [33, 44], [9, 56], [62, 48], [66, 14],
[44, 13], [26, 13], [11, 28], [7, 43], [17, 64], [41, 46], [55, 34], [35, 16], [52, 26], [43, 26], [31, 76], [22, 53], [26, 29], [50, 40], [55, 50], [54, 10], [60, 15], [47, 66], [30, 60], [30, 50], [12, 17], [15, 14], [16, 19], [21, 48], [50, 30], [51, 42], [50, 15], [48, 21], [12, 38], [15, 56], [29, 39], [54, 38], [55, 57], [67, 41], [10, 70], [6, 25], [65, 27], [40, 60], [70, 64], [64, 4], [36, 6], [30, 20], [20, 30], [15, 5], [50, 70], [57, 72], [45, 42], [38, 33], [50, 4], [66, 8], [59,
5], [35, 60], [27, 24], [40, 20], [40, 37], [40, 40]]
optimal_3 = 538
all_names = [name_1, name_2, name_3]
all_cities = [cities_1, cities_2, cities_3]
all_optimals = [optimal_1, optimal_2, optimal_3]
n_ants = 10
alpha = 1
beta = 4
evaporation = 0.5
intensification = 2
max_times = [1, 2, 3]
iterations = 1
bar_width = 0.15
opacity = 0.8
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
]
best_distances = []
for cities in all_cities:
for max_time in max_times:
for iteration in range(iterations):
ant_colony = AntColony(cities, n_ants, alpha, beta, evaporation, intensification, max_time)
print("Running iteration number {}/{} ({} sec)".format(iteration + 1, iterations, max_time))
best_route = ant_colony.run()
best_distances.append([total_distance(best_route), colors[max_times.index(max_time) % len(colors)]])
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 / 3)
ax.set_xticklabels(max_times)
ax.legend()
plt.axhline(y=100, color='r')
plt.show()