{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "**Make sure you run this at the begining**" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import os\n", "import sys\n", "import math\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# Append template path to sys path\n", "sys.path.append(os.getcwd() + \"/template\") " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from utils.load_data import load_data\n", "from utils.load_data import log\n", "from utils.visualize_tsp import plotTSP\n", "from utils.tsp import TSP\n", "from utils.tsp import TSP_Bench\n", "from utils.tsp import TSP_Bench_ALL" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Workshop Starts Here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"TSP\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"solutions\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Get familiar with your dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are problems at different levels. **3 simple, 2 medium, 1 hard**." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "./template/data/medium/pcb442.tsp\n", "./template/data/medium/a280.tsp\n", "./template/data/hard/dsj1000.tsp\n", "./template/data/simple/att48.tsp\n", "./template/data/simple/ulysses16.tsp\n", "./template/data/simple/st70.tsp\n" ] } ], "source": [ "for root, _, files in os.walk('./template/data'):\n", " if(files):\n", " for f in files:\n", " print(str(root) + \"/\" + f)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "ulysses16 = np.array(load_data(\"./template/data/simple/ulysses16.tsp\"))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[38.24, 20.42],\n", " [39.57, 26.15],\n", " [40.56, 25.32],\n", " [36.26, 23.12],\n", " [33.48, 10.54],\n", " [37.56, 12.19],\n", " [38.42, 13.11],\n", " [37.52, 20.44],\n", " [41.23, 9.1 ],\n", " [41.17, 13.05],\n", " [36.08, -5.21],\n", " [38.47, 15.13],\n", " [38.15, 15.35],\n", " [37.51, 15.17],\n", " [35.49, 14.32],\n", " [39.36, 19.56]])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ulysses16[:]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.scatter(ulysses16[:, 0], ulysses16[:, 1])\n", "for i in range(0, 16):\n", " plt.annotate(i, (ulysses16[i, 0], ulysses16[i, 1]+0.5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Naive Solution: In Order" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]\n" ] } ], "source": [ "simple_sequence = list(range(0, 16))\n", "print(simple_sequence)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plotTSP([simple_sequence], ulysses16, num_iters=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Naive Solution: Random Permutation" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[11, 9, 14, 2, 15, 10, 0, 5, 3, 4, 7, 1, 12, 13, 6, 8]\n" ] } ], "source": [ "random_permutation = np.random.permutation(16).tolist()\n", "print(random_permutation)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plotTSP([random_permutation], ulysses16, num_iters=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Best Solution" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "best_ulysses16 = [0, 13, 12, 11, 6, 5, 14, 4, 10, 8, 9, 15, 2, 1, 3, 7]\n", "plotTSP([best_ulysses16], ulysses16, num_iters=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Calculate Fitness (Sum of all Distances)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def dist(node_0, node_1, coords):\n", " \"\"\"\n", " Euclidean distance between two nodes.\n", " \"\"\"\n", " coord_0, coord_1 = coords[node_0], coords[node_1]\n", " return math.sqrt((coord_0[0] - coord_1[0]) ** 2 + (coord_0[1] - coord_1[1]) ** 2)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coordinate of City 0: [38.24 20.42]\n" ] } ], "source": [ "print(\"Coordinate of City 0:\", ulysses16[0])" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coordinate of City 1: [39.57 26.15]\n" ] } ], "source": [ "print(\"Coordinate of City 1:\", ulysses16[1])" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Distance Between 5.882329470541408\n" ] } ], "source": [ "print(\"Distance Between\", dist(0, 1, ulysses16))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "def fitness(solution, coords):\n", " N = len(coords)\n", " cur_fit = 0\n", " for i in range(len(solution)):\n", " cur_fit += dist(solution[i % N], solution[(i + 1) % N], coords)\n", " return cur_fit" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Order Fitness:\t 104.42225210207233\n", "Random Fitness:\t 152.17750148686756\n", "Best Fitness:\t 74.10873595815309\n" ] } ], "source": [ "print (\"Order Fitness:\\t\", fitness(simple_sequence, ulysses16))\n", "print (\"Random Fitness:\\t\", fitness(random_permutation, ulysses16))\n", "print (\"Best Fitness:\\t\", fitness(best_ulysses16, ulysses16))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Naive Random Model" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "import math\n", "import random\n", "from model.base_model import Model\n", "\n", "class MyRandomModel(Model):\n", " def __init__(self):\n", " super().__init__()\n", "\n", " def init(self, nodes):\n", " \"\"\"\n", " Put your initialization here.\n", " \"\"\"\n", " super().init(nodes)\n", "\n", " def fit(self, max_it):\n", " \"\"\"\n", " Put your iteration process here.\n", " \"\"\"\n", " random_solutions = []\n", " for i in range(0, max_it):\n", " solution = np.random.permutation(self.N).tolist()\n", " random_solutions.append(solution)\n", " self.fitness_list.append(self.fitness(solution))\n", "\n", " self.best_solution = random_solutions[self.fitness_list.index(min(self.fitness_list))]\n", " return self.best_solution, self.fitness_list" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "scrolled": true }, "outputs": [], "source": [ "tsp_file = './template/data/simple/ulysses16.tsp'" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[*] [Node] 16, [Best] 114.07985427845105\n", "[*] Running for: 0.01 seconds\n", "\n" ] } ], "source": [ "model = MyRandomModel()\n", "best_solution, fitness_list, time = TSP_Bench(tsp_file, model, max_it=100)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(fitness_list, 'o-')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ant Colony Optimization" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "https://github.com/rochakgupta/aco-tsp" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "import math\n", "import random\n", "from model.base_model import Model\n", "\n", "class MyACOModel(Model):\n", " def __init__(self):\n", " super().__init__()\n", "\n", " class Edge:\n", " def __init__(self, a, b, weight, initial_pheromone):\n", " self.a = a\n", " self.b = b\n", " self.weight = weight\n", " self.pheromone = initial_pheromone\n", "\n", " class Ant:\n", " def __init__(self, alpha, beta, num_nodes, edges):\n", " self.alpha = alpha\n", " self.beta = beta\n", " self.num_nodes = num_nodes\n", " self.edges = edges\n", " self.tour = None\n", " self.distance = 0.0\n", "\n", " def _select_node(self):\n", " roulette_wheel = 0.0\n", " unvisited_nodes = [node for node in range(self.num_nodes) if node not in self.tour]\n", " heuristic_total = 0.0\n", " for unvisited_node in unvisited_nodes:\n", " heuristic_total += self.edges[self.tour[-1]][unvisited_node].weight\n", " for unvisited_node in unvisited_nodes:\n", " roulette_wheel += pow(self.edges[self.tour[-1]][unvisited_node].pheromone, self.alpha) * \\\n", " pow((heuristic_total / self.edges[self.tour[-1]][unvisited_node].weight), self.beta)\n", " random_value = random.uniform(0.0, roulette_wheel)\n", " wheel_position = 0.0\n", " for unvisited_node in unvisited_nodes:\n", " wheel_position += pow(self.edges[self.tour[-1]][unvisited_node].pheromone, self.alpha) * \\\n", " pow((heuristic_total / self.edges[self.tour[-1]][unvisited_node].weight), self.beta)\n", " if wheel_position >= random_value:\n", " return unvisited_node\n", "\n", " def find_tour(self):\n", " self.tour = [random.randint(0, self.num_nodes - 1)]\n", " while len(self.tour) < self.num_nodes:\n", " self.tour.append(self._select_node())\n", " return self.tour\n", "\n", " def get_distance(self):\n", " self.distance = 0.0\n", " for i in range(self.num_nodes):\n", " self.distance += self.edges[self.tour[i]][self.tour[(i + 1) % self.num_nodes]].weight\n", " return self.distance\n", "\n", " def init(self, nodes, *args):\n", " super().init(nodes)\n", " mode, colony_size, elitist_weight, min_scaling_factor, alpha, beta, rho, pheromone_deposit_weight, initial_pheromone, labels = args\n", "\n", " self.mode = mode[0]\n", " self.colony_size = colony_size\n", " self.elitist_weight = elitist_weight\n", " self.min_scaling_factor = min_scaling_factor\n", " self.rho = rho\n", " self.pheromone_deposit_weight = pheromone_deposit_weight\n", " self.num_nodes = len(nodes)\n", " self.nodes = nodes\n", "\n", " if labels is not None:\n", " self.labels = labels\n", " else:\n", " self.labels = range(1, self.num_nodes + 1)\n", " self.edges = [[None] * self.num_nodes for _ in range(self.num_nodes)]\n", " for i in range(self.num_nodes):\n", " for j in range(i + 1, self.num_nodes):\n", " self.edges[i][j] = self.edges[j][i] = self.Edge(i, j, math.sqrt(\n", " pow(self.nodes[i][0] - self.nodes[j][0], 2.0) + pow(self.nodes[i][1] - self.nodes[j][1], 2.0)),\n", " initial_pheromone)\n", " self.ants = [self.Ant(alpha, beta, self.num_nodes, self.edges) for _ in range(self.colony_size)]\n", " self.global_best_tour = None\n", " self.global_best_distance = float(\"inf\")\n", "\n", " def _add_pheromone(self, tour, distance, weight=1.0):\n", " pheromone_to_add = self.pheromone_deposit_weight / distance\n", " for i in range(self.num_nodes):\n", " self.edges[tour[i]][tour[(i + 1) % self.num_nodes]].pheromone += weight * pheromone_to_add\n", "\n", " def _acs(self, max_it):\n", " for step in range(0, max_it):\n", "# print('[step]', step)\n", " for ant in self.ants:\n", " self._add_pheromone(ant.find_tour(), ant.get_distance())\n", " if ant.distance < self.global_best_distance:\n", " self.global_best_tour = ant.tour\n", " self.global_best_distance = ant.distance\n", " self.fitness_list.append(ant.distance)\n", " for i in range(self.num_nodes):\n", " for j in range(i + 1, self.num_nodes):\n", " self.edges[i][j].pheromone *= (1.0 - self.rho)\n", "\n", " def _elitist(self, max_it):\n", " for step in range(0, max_it):\n", "# print('[step]', step)\n", " for ant in self.ants:\n", " self._add_pheromone(ant.find_tour(), ant.get_distance())\n", " if ant.distance < self.global_best_distance:\n", " self.global_best_tour = ant.tour\n", " self.global_best_distance = ant.distance\n", " self.fitness_list.append(ant.distance)\n", " self._add_pheromone(self.global_best_tour, self.global_best_distance, weight=self.elitist_weight)\n", " for i in range(self.num_nodes):\n", " for j in range(i + 1, self.num_nodes):\n", " self.edges[i][j].pheromone *= (1.0 - self.rho)\n", "\n", " def fit(self, max_it=1000):\n", " \"\"\"\n", " Execute simulated annealing algorithm.\n", " \"\"\"\n", " # Initialize with the greedy solution.\n", " if self.mode == 'ACS':\n", " self._acs(max_it)\n", " elif self.mode == 'Elitist':\n", " self._elitist(max_it)\n", " else:\n", " print(\"Un supported\")\n", "# print('Sequence : <- {0} ->'.format(' - '.join(str(self.labels[i]) for i in self.global_best_tour)))\n", "# print('Total distance travelled to complete the tour : {0}\\n'.format(round(self.global_best_distance, 2)))\n", "\n", " return self.global_best_tour, self.fitness_list" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "tsp_file = './template/data/simple/ulysses16.tsp'" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "# Set hypter-parameters\n", "mode='ACS', \n", "colony_size=10\n", "elitist_weight=1.0\n", "min_scaling_factor=0.001\n", "alpha=1.0\n", "beta=3.0\n", "rho=0.1\n", "pheromone_deposit_weight=1.0\n", "initial_pheromone=1.0\n", "labels = None" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[*] [Node] 16, [Best] 74.1087359581531\n", "[*] Running for: 1.61 seconds\n", "\n" ] } ], "source": [ "model = MyACOModel()\n", "best_solution, fitness_list, time = TSP_Bench(tsp_file, model, mode, colony_size, elitist_weight, min_scaling_factor, alpha, beta, rho, pheromone_deposit_weight, initial_pheromone, labels, max_it=1000, timeout=300)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Your Smart Model" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "import math\n", "import random\n", "from model.base_model import Model\n", "\n", "class MyModel(Model):\n", " def __init__(self):\n", " super().__init__()\n", "\n", " def init(self, nodes):\n", " \"\"\"\n", " Put your initialization here.\n", " \"\"\"\n", " super().init(nodes)\n", " self.log(\"Nothing to initialize in your model now\")\n", "\n", " def fit(self, max_it):\n", " \"\"\"\n", " Put your iteration process here.\n", " \"\"\"\n", " self.log(\"Naive Random Solution\")\n", " self.best_solution = np.random.permutation(self.N).tolist()\n", " self.fitness_list.append(self.fitness(self.best_solution))\n", "\n", " return self.best_solution, self.fitness_list" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test your Model" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "tsp_problem = './template/data/simple/ulysses16.tsp'" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[MyModel] Nothing to initialize in your model now\n", "[MyModel] Naive Random Solution\n", "[*] [Node] 16, [Best] 149.95613345077442\n", "[*] Running for: 0.00 seconds\n", "\n" ] } ], "source": [ "model = MyModel()\n", "best_solution, fitness_list, time = TSP_Bench(tsp_file, model)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Test All Dataset" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "./template/data/medium/pcb442.tsp\n", "./template/data/medium/a280.tsp\n", "./template/data/hard/dsj1000.tsp\n", "./template/data/simple/att48.tsp\n", "./template/data/simple/ulysses16.tsp\n", "./template/data/simple/st70.tsp\n" ] } ], "source": [ "for root, _, files in os.walk('./template/data'):\n", " if(files):\n", " for f in files:\n", " print(str(root) + \"/\" + f)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "def plot_results(best_solutions, times, title):\n", " fig = plt.figure()\n", " nodes = [len(s) for s in best_solutions]\n", " data = np.array([[node, time] for node, time in sorted(zip(nodes, times))])\n", " plt.plot(data[:, 0], data[:, 1], 'o-')\n", " fig.suptitle(title, fontsize=20)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "tsp_path = './template/data'" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Random Search\n", "[*] ./template/data/medium/pcb442.tsp\n", "[*] [Node] 442, [Best] 726804.3180499345\n", "[*] Running for: 0.30 seconds\n", "\n", "[*] ./template/data/medium/a280.tsp\n", "[*] [Node] 280, [Best] 30377.079411308096\n", "[*] Running for: 0.18 seconds\n", "\n", "[*] ./template/data/hard/dsj1000.tsp\n", "[*] [Node] 1000, [Best] 532033547.526717\n", "[*] Running for: 0.71 seconds\n", "\n", "[*] ./template/data/simple/att48.tsp\n", "[*] [Node] 48, [Best] 114552.11880841342\n", "[*] Running for: 0.05 seconds\n", "\n", "[*] ./template/data/simple/ulysses16.tsp\n", "[*] [Node] 16, [Best] 107.55064433885224\n", "[*] Running for: 0.04 seconds\n", "\n", "[*] ./template/data/simple/st70.tsp\n", "[*] [Node] 70, [Best] 3006.0125566251013\n", "[*] Running for: 0.06 seconds\n", "\n" ] } ], "source": [ "model = MyRandomModel()\n", "\n", "print(\"Random Search\")\n", "best_solutions, fitness_lists, times = TSP_Bench_ALL(tsp_path, model)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_results(best_solutions, times, \"Random Model\")" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "# Set hypter-parameters\n", "mode='ACS', \n", "colony_size=10\n", "elitist_weight=1.0\n", "min_scaling_factor=0.001\n", "alpha=1.0\n", "beta=3.0\n", "rho=0.1\n", "pheromone_deposit_weight=1.0\n", "initial_pheromone=1.0\n", "labels = None" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ant Colony Optimization\n", "[*] ./template/data/medium/pcb442.tsp\n", "[*] [Node] 442, [Best] 81773.39944759021\n", "[*] Running for: 437.55 seconds\n", "\n", "[*] ./template/data/medium/a280.tsp\n", "[*] [Node] 280, [Best] 3402.3354165651604\n", "[*] Running for: 122.83 seconds\n", "\n", "[*] ./template/data/hard/dsj1000.tsp\n", "[*] Timeout -3\n", "[*] Running for: 600.01 seconds\n", "\n", "[*] ./template/data/simple/att48.tsp\n", "[*] [Node] 48, [Best] 37903.563183654456\n", "[*] Running for: 1.60 seconds\n", "\n", "[*] ./template/data/simple/ulysses16.tsp\n", "[*] [Node] 16, [Best] 74.61480359572822\n", "[*] Running for: 0.18 seconds\n", "\n", "[*] ./template/data/simple/st70.tsp\n", "[*] [Node] 70, [Best] 758.1364540871836\n", "[*] Running for: 3.71 seconds\n", "\n" ] } ], "source": [ "model = MyACOModel()\n", "\n", "print(\"Ant Colony Optimization\")\n", "best_solutions, fitness_lists, times = TSP_Bench_ALL(tsp_path, model, mode, colony_size, elitist_weight, min_scaling_factor, alpha, beta, rho, pheromone_deposit_weight, initial_pheromone, labels, max_it=100, timeout=600)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_results(best_solutions, times, \"Ant Colony Optimization\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }