{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "**Make sure you run this at the begining**" ] }, { "cell_type": "code", "execution_count": 1, "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": 2, "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": 3, "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": 4, "metadata": {}, "outputs": [], "source": [ "ulysses16 = np.array(load_data(\"./template/data/simple/ulysses16.tsp\"))" ] }, { "cell_type": "code", "execution_count": 5, "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": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ulysses16[:]" ] }, { "cell_type": "code", "execution_count": 6, "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": 7, "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": 8, "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": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 8, 9, 12, 3, 2, 6, 11, 0, 14, 15, 7, 4, 5, 13, 10]\n" ] } ], "source": [ "random_permutation = np.random.permutation(16).tolist()\n", "print(random_permutation)" ] }, { "cell_type": "code", "execution_count": 10, "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": 11, "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": 12, "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": 13, "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": 14, "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": 15, "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": 16, "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": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Order Fitness:\t 104.42225210207233\n", "Random Fitness:\t 142.71833065004333\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": 18, "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": 19, "metadata": {}, "outputs": [], "source": [ "tsp_file = './template/data/simple/ulysses16.tsp'" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[*] [Node] 16, [Best] 108.63032651658955\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": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 21, "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": [ "## Genetic Algorithm" ] }, { "cell_type": "code", "execution_count": 244, "metadata": {}, "outputs": [], "source": [ "class Gene: # City\n", " def __init__(self, name, lat, lng):\n", " self.name = name\n", " self.lat = lat\n", " self.lng = lng\n", "\n", " def get_distance_to(self, dest):\n", " return math.sqrt( (self.lng - dest.lng) ** 2 + (self.lat - dest.lat) ** 2 )\n", "\n", "class Individual: # Route: possible solution to TSP\n", " def __init__(self, genes):\n", " assert(len(genes) > 3)\n", " self.genes = genes\n", " self.__reset_params()\n", "\n", " def swap(self, gene_1, gene_2):\n", " self.genes[0]\n", " a, b = self.genes.index(gene_1), self.genes.index(gene_2)\n", " self.genes[b], self.genes[a] = self.genes[a], self.genes[b]\n", " self.__reset_params()\n", "\n", " def add(self, gene):\n", " self.genes.append(gene)\n", " self.__reset_params()\n", "\n", " @property\n", " def fitness(self):\n", " if self.__fitness == 0:\n", " self.__fitness = 1 / self.travel_cost # Normalize travel cost\n", " return self.__fitness\n", "\n", " @property\n", " def travel_cost(self): # Get total travelling cost\n", " if self.__travel_cost == 0:\n", " for i in range(len(self.genes)):\n", " origin = self.genes[i]\n", " if i == len(self.genes) - 1:\n", " dest = self.genes[0]\n", " else:\n", " dest = self.genes[i+1]\n", "\n", " self.__travel_cost += origin.get_distance_to(dest)\n", "\n", " return self.__travel_cost\n", "\n", " def __reset_params(self):\n", " self.__travel_cost = 0\n", " self.__fitness = 0\n", "\n", "class Population: # Population of individuals\n", " def __init__(self, individuals):\n", " self.individuals = individuals\n", "\n", " @staticmethod\n", " def gen_individuals(sz, genes):\n", " individuals = []\n", " for _ in range(sz):\n", " individuals.append(Individual(sample(genes, len(genes))))\n", " return Population(individuals)\n", "\n", " def add(self, route):\n", " self.individuals.append(route)\n", "\n", " def rmv(self, route):\n", " self.individuals.remove(route)\n", "\n", " def get_fittest(self):\n", " fittest = self.individuals[0]\n", " for route in self.individuals:\n", " if route.fitness > fittest.fitness:\n", " fittest = route\n", "\n", " return fittest" ] }, { "cell_type": "code", "execution_count": 380, "metadata": {}, "outputs": [], "source": [ "import math\n", "import random\n", "from model.base_model import Model\n", "from random import randint, sample\n", "\n", "class MyGAModel(Model):\n", " def __init__(self):\n", " super().__init__()\n", " self.iteration = 0\n", "\n", " def init(self, nodes):\n", " super().init(nodes)\n", "\n", " def evolve(self, pop, tourn_size, mut_rate):\n", " new_generation = Population([])\n", " pop_size = len(pop.individuals)\n", " elitism_num = pop_size // 4\n", "\n", " # Elitism\n", " for _ in range(elitism_num):\n", " fittest = pop.get_fittest()\n", " new_generation.add(fittest)\n", " pop.rmv(fittest)\n", "\n", " # Crossover\n", " for _ in range(elitism_num, pop_size):\n", " parent_1 = self.selection(new_generation, tourn_size)\n", " parent_2 = self.selection(new_generation, tourn_size)\n", " child = self.crossover(parent_1, parent_2)\n", " new_generation.add(child)\n", "\n", " # Mutation\n", " for i in range(elitism_num, pop_size):\n", " self.mutate(new_generation.individuals[i], mut_rate)\n", "\n", " return new_generation\n", "\n", " def crossover(self, parent_1, parent_2):\n", " def fill_with_parent1_genes(child, parent, genes_n):\n", " start_at = randint(0, len(parent.genes)-genes_n-1)\n", " finish_at = start_at + genes_n\n", " for i in range(start_at, finish_at):\n", " child.genes[i] = parent_1.genes[i]\n", "\n", " def fill_with_parent2_genes(child, parent):\n", " j = 0\n", " for i in range(0, len(parent.genes)):\n", " if child.genes[i] == None:\n", " while parent.genes[j] in child.genes:\n", " j += 1\n", " child.genes[i] = parent.genes[j]\n", " j += 1\n", "\n", " genes_n = len(parent_1.genes)\n", " child = Individual([None for _ in range(genes_n)])\n", " fill_with_parent1_genes(child, parent_1, genes_n // 2)\n", " fill_with_parent2_genes(child, parent_2)\n", "\n", " return child\n", "\n", " def mutate(self, individual, rate):\n", " for _ in range(len(individual.genes)):\n", " if random.random() < rate:\n", " sel_genes = sample(individual.genes, 2)\n", " individual.swap(sel_genes[0], sel_genes[1])\n", "\n", " def selection(self, population, competitors_n):\n", " return Population(sample(population.individuals, competitors_n)).get_fittest()\n", "\n", " def fit(self, max_it=20):\n", " \"\"\"\n", " Execute simulated annealing algorithm.\n", " \"\"\"\n", " pop_size = 1000\n", " mut_rate = 0.9\n", " tourn_size = 100\n", "\n", " genes = [Gene(num, city[0], city[1]) for num, city in enumerate(self.coords)]\n", " self.genes = genes\n", "\n", " population = Population.gen_individuals(pop_size, genes)\n", " \n", "\n", " for it in range(0, max_it):\n", " mut_rate = mut_rate * 0.95\n", " if mut_rate < 0.05:\n", " mut_rate = 0.05\n", " population = self.evolve(population, tourn_size, mut_rate)\n", " cost = population.get_fittest().travel_cost\n", "\n", " it += 1\n", " self.fitness_list.append(cost)\n", " print(\"[step] \", it, \" [mut] \", mut_rate, \" [best] \", self.fitness_list[self.fitness_list.index(min(self.fitness_list))])\n", "\n", " self.best_solution = [gene.name for gene in population.get_fittest().genes]\n", "\n", " return self.best_solution, self.fitness_list" ] }, { "cell_type": "code", "execution_count": 381, "metadata": {}, "outputs": [], "source": [ "tsp_problem = \"./template/data/simple/ulysses16.tsp\"" ] }, { "cell_type": "code", "execution_count": 382, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Genetic Algorithm\n", "[step] 1 [mut] 0.855 [best] 96.11229392543888\n", "[step] 2 [mut] 0.8122499999999999 [best] 93.76996122899693\n", "[step] 3 [mut] 0.7716374999999999 [best] 93.76996122899693\n", "[step] 4 [mut] 0.7330556249999999 [best] 93.36477102051143\n", "[step] 5 [mut] 0.6964028437499998 [best] 93.36477102051143\n", "[step] 6 [mut] 0.6615827015624998 [best] 93.36477102051143\n", "[step] 7 [mut] 0.6285035664843748 [best] 90.01149831972343\n", "[step] 8 [mut] 0.597078388160156 [best] 90.01149831972343\n", "[step] 9 [mut] 0.5672244687521482 [best] 89.10668237027161\n", "[step] 10 [mut] 0.5388632453145408 [best] 89.10668237027161\n", "[step] 11 [mut] 0.5119200830488138 [best] 89.10668237027161\n", "[step] 12 [mut] 0.486324078896373 [best] 75.20103046245312\n", "[step] 13 [mut] 0.4620078749515544 [best] 75.20103046245312\n", "[step] 14 [mut] 0.43890748120397666 [best] 75.20103046245312\n", "[step] 15 [mut] 0.4169621071437778 [best] 75.10440611823527\n", "[step] 16 [mut] 0.3961140017865889 [best] 75.10440611823527\n", "[step] 17 [mut] 0.37630830169725943 [best] 74.94828839659989\n", "[step] 18 [mut] 0.3574928866123964 [best] 74.94828839659989\n", "[step] 19 [mut] 0.33961824228177656 [best] 74.94828839659989\n", "[step] 20 [mut] 0.3226373301676877 [best] 74.94828839659989\n", "[step] 21 [mut] 0.3065054636593033 [best] 74.94828839659989\n", "[step] 22 [mut] 0.29118019047633814 [best] 74.23355449180846\n", "[step] 23 [mut] 0.2766211809525212 [best] 74.21961177789215\n", "[step] 24 [mut] 0.26279012190489515 [best] 74.21961177789215\n", "[step] 25 [mut] 0.24965061580965037 [best] 74.21961177789215\n", "[step] 26 [mut] 0.23716808501916783 [best] 73.987618045175\n", "[step] 27 [mut] 0.22530968076820942 [best] 73.987618045175\n", "[step] 28 [mut] 0.21404419672979894 [best] 73.987618045175\n", "[step] 29 [mut] 0.20334198689330898 [best] 73.987618045175\n", "[step] 30 [mut] 0.19317488754864354 [best] 73.987618045175\n", "[step] 31 [mut] 0.18351614317121134 [best] 73.987618045175\n", "[step] 32 [mut] 0.17434033601265078 [best] 73.987618045175\n", "[step] 33 [mut] 0.16562331921201823 [best] 73.987618045175\n", "[step] 34 [mut] 0.15734215325141732 [best] 73.987618045175\n", "[step] 35 [mut] 0.14947504558884644 [best] 73.987618045175\n", "[step] 36 [mut] 0.14200129330940411 [best] 73.987618045175\n", "[step] 37 [mut] 0.1349012286439339 [best] 73.987618045175\n", "[step] 38 [mut] 0.1281561672117372 [best] 73.987618045175\n", "[step] 39 [mut] 0.12174835885115033 [best] 73.987618045175\n", "[step] 40 [mut] 0.11566094090859282 [best] 73.987618045175\n", "[step] 41 [mut] 0.10987789386316317 [best] 73.987618045175\n", "[step] 42 [mut] 0.104383999170005 [best] 73.987618045175\n", "[step] 43 [mut] 0.09916479921150474 [best] 73.987618045175\n", "[step] 44 [mut] 0.0942065592509295 [best] 73.987618045175\n", "[step] 45 [mut] 0.08949623128838302 [best] 73.987618045175\n", "[step] 46 [mut] 0.08502141972396386 [best] 73.987618045175\n", "[step] 47 [mut] 0.08077034873776566 [best] 73.987618045175\n", "[step] 48 [mut] 0.07673183130087738 [best] 73.987618045175\n", "[step] 49 [mut] 0.0728952397358335 [best] 73.987618045175\n", "[step] 50 [mut] 0.06925047774904183 [best] 73.987618045175\n", "[step] 51 [mut] 0.06578795386158974 [best] 73.987618045175\n", "[step] 52 [mut] 0.06249855616851025 [best] 73.987618045175\n", "[step] 53 [mut] 0.05937362836008474 [best] 73.987618045175\n", "[step] 54 [mut] 0.0564049469420805 [best] 73.987618045175\n", "[step] 55 [mut] 0.05358469959497647 [best] 73.987618045175\n", "[step] 56 [mut] 0.050905464615227644 [best] 73.987618045175\n", "[step] 57 [mut] 0.05 [best] 73.987618045175\n", "[step] 58 [mut] 0.05 [best] 73.987618045175\n", "[step] 59 [mut] 0.05 [best] 73.987618045175\n", "[step] 60 [mut] 0.05 [best] 73.987618045175\n", "[step] 61 [mut] 0.05 [best] 73.987618045175\n", "[step] 62 [mut] 0.05 [best] 73.987618045175\n", "[step] 63 [mut] 0.05 [best] 73.987618045175\n", "[step] 64 [mut] 0.05 [best] 73.987618045175\n", "[step] 65 [mut] 0.05 [best] 73.987618045175\n", "[step] 66 [mut] 0.05 [best] 73.987618045175\n", "[step] 67 [mut] 0.05 [best] 73.987618045175\n", "[step] 68 [mut] 0.05 [best] 73.987618045175\n", "[step] 69 [mut] 0.05 [best] 73.987618045175\n", "[step] 70 [mut] 0.05 [best] 73.987618045175\n", "[step] 71 [mut] 0.05 [best] 73.987618045175\n", "[step] 72 [mut] 0.05 [best] 73.987618045175\n", "[step] 73 [mut] 0.05 [best] 73.987618045175\n", "[step] 74 [mut] 0.05 [best] 73.987618045175\n", "[step] 75 [mut] 0.05 [best] 73.987618045175\n", "[step] 76 [mut] 0.05 [best] 73.987618045175\n", "[step] 77 [mut] 0.05 [best] 73.987618045175\n", "[step] 78 [mut] 0.05 [best] 73.987618045175\n", "[step] 79 [mut] 0.05 [best] 73.987618045175\n", "[step] 80 [mut] 0.05 [best] 73.987618045175\n", "[step] 81 [mut] 0.05 [best] 73.987618045175\n", "[step] 82 [mut] 0.05 [best] 73.987618045175\n", "[step] 83 [mut] 0.05 [best] 73.987618045175\n", "[step] 84 [mut] 0.05 [best] 73.987618045175\n", "[step] 85 [mut] 0.05 [best] 73.987618045175\n", "[step] 86 [mut] 0.05 [best] 73.987618045175\n", "[step] 87 [mut] 0.05 [best] 73.987618045175\n", "[step] 88 [mut] 0.05 [best] 73.987618045175\n", "[step] 89 [mut] 0.05 [best] 73.987618045175\n", "[step] 90 [mut] 0.05 [best] 73.987618045175\n", "[step] 91 [mut] 0.05 [best] 73.987618045175\n", "[step] 92 [mut] 0.05 [best] 73.987618045175\n", "[step] 93 [mut] 0.05 [best] 73.987618045175\n", "[step] 94 [mut] 0.05 [best] 73.987618045175\n", "[step] 95 [mut] 0.05 [best] 73.987618045175\n", "[step] 96 [mut] 0.05 [best] 73.987618045175\n", "[step] 97 [mut] 0.05 [best] 73.987618045175\n", "[step] 98 [mut] 0.05 [best] 73.987618045175\n", "[step] 99 [mut] 0.05 [best] 73.987618045175\n", "[step] 100 [mut] 0.05 [best] 73.987618045175\n", "[step] 101 [mut] 0.05 [best] 73.987618045175\n", "[step] 102 [mut] 0.05 [best] 73.987618045175\n", "[step] 103 [mut] 0.05 [best] 73.987618045175\n", "[step] 104 [mut] 0.05 [best] 73.987618045175\n", "[step] 105 [mut] 0.05 [best] 73.987618045175\n", "[step] 106 [mut] 0.05 [best] 73.987618045175\n", "[step] 107 [mut] 0.05 [best] 73.987618045175\n", "[step] 108 [mut] 0.05 [best] 73.987618045175\n", "[step] 109 [mut] 0.05 [best] 73.987618045175\n", "[step] 110 [mut] 0.05 [best] 73.987618045175\n", "[step] 111 [mut] 0.05 [best] 73.987618045175\n", "[step] 112 [mut] 0.05 [best] 73.987618045175\n", "[step] 113 [mut] 0.05 [best] 73.987618045175\n", "[step] 114 [mut] 0.05 [best] 73.987618045175\n", "[step] 115 [mut] 0.05 [best] 73.987618045175\n", "[step] 116 [mut] 0.05 [best] 73.987618045175\n", "[step] 117 [mut] 0.05 [best] 73.987618045175\n", "[step] 118 [mut] 0.05 [best] 73.987618045175\n", "[step] 119 [mut] 0.05 [best] 73.987618045175\n", "[step] 120 [mut] 0.05 [best] 73.987618045175\n", "[step] 121 [mut] 0.05 [best] 73.987618045175\n", "[step] 122 [mut] 0.05 [best] 73.987618045175\n", "[step] 123 [mut] 0.05 [best] 73.987618045175\n", "[step] 124 [mut] 0.05 [best] 73.987618045175\n", "[step] 125 [mut] 0.05 [best] 73.987618045175\n", "[step] 126 [mut] 0.05 [best] 73.987618045175\n", "[step] 127 [mut] 0.05 [best] 73.987618045175\n", "[step] 128 [mut] 0.05 [best] 73.987618045175\n", "[step] 129 [mut] 0.05 [best] 73.987618045175\n", "[step] 130 [mut] 0.05 [best] 73.987618045175\n", "[step] 131 [mut] 0.05 [best] 73.987618045175\n", "[step] 132 [mut] 0.05 [best] 73.987618045175\n", "[step] 133 [mut] 0.05 [best] 73.987618045175\n", "[step] 134 [mut] 0.05 [best] 73.987618045175\n", "[step] 135 [mut] 0.05 [best] 73.987618045175\n", "[step] 136 [mut] 0.05 [best] 73.987618045175\n", "[step] 137 [mut] 0.05 [best] 73.987618045175\n", "[step] 138 [mut] 0.05 [best] 73.987618045175\n", "[step] 139 [mut] 0.05 [best] 73.987618045175\n", "[step] 140 [mut] 0.05 [best] 73.987618045175\n", "[step] 141 [mut] 0.05 [best] 73.987618045175\n", "[step] 142 [mut] 0.05 [best] 73.987618045175\n", "[step] 143 [mut] 0.05 [best] 73.987618045175\n", "[step] 144 [mut] 0.05 [best] 73.987618045175\n", "[step] 145 [mut] 0.05 [best] 73.987618045175\n", "[step] 146 [mut] 0.05 [best] 73.987618045175\n", "[step] 147 [mut] 0.05 [best] 73.987618045175\n", "[step] 148 [mut] 0.05 [best] 73.987618045175\n", "[step] 149 [mut] 0.05 [best] 73.987618045175\n", "[step] 150 [mut] 0.05 [best] 73.987618045175\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[step] 151 [mut] 0.05 [best] 73.987618045175\n", "[step] 152 [mut] 0.05 [best] 73.987618045175\n", "[step] 153 [mut] 0.05 [best] 73.987618045175\n", "[step] 154 [mut] 0.05 [best] 73.987618045175\n", "[step] 155 [mut] 0.05 [best] 73.987618045175\n", "[step] 156 [mut] 0.05 [best] 73.987618045175\n", "[step] 157 [mut] 0.05 [best] 73.987618045175\n", "[step] 158 [mut] 0.05 [best] 73.987618045175\n", "[step] 159 [mut] 0.05 [best] 73.987618045175\n", "[step] 160 [mut] 0.05 [best] 73.987618045175\n", "[step] 161 [mut] 0.05 [best] 73.987618045175\n", "[step] 162 [mut] 0.05 [best] 73.987618045175\n", "[step] 163 [mut] 0.05 [best] 73.987618045175\n", "[step] 164 [mut] 0.05 [best] 73.987618045175\n", "[step] 165 [mut] 0.05 [best] 73.987618045175\n", "[step] 166 [mut] 0.05 [best] 73.987618045175\n", "[step] 167 [mut] 0.05 [best] 73.987618045175\n", "[step] 168 [mut] 0.05 [best] 73.987618045175\n", "[step] 169 [mut] 0.05 [best] 73.987618045175\n", "[step] 170 [mut] 0.05 [best] 73.987618045175\n", "[step] 171 [mut] 0.05 [best] 73.987618045175\n", "[step] 172 [mut] 0.05 [best] 73.987618045175\n", "[step] 173 [mut] 0.05 [best] 73.987618045175\n", "[step] 174 [mut] 0.05 [best] 73.987618045175\n", "[step] 175 [mut] 0.05 [best] 73.987618045175\n", "[step] 176 [mut] 0.05 [best] 73.987618045175\n", "[step] 177 [mut] 0.05 [best] 73.987618045175\n", "[step] 178 [mut] 0.05 [best] 73.987618045175\n", "[step] 179 [mut] 0.05 [best] 73.987618045175\n", "[step] 180 [mut] 0.05 [best] 73.987618045175\n", "[step] 181 [mut] 0.05 [best] 73.987618045175\n", "[step] 182 [mut] 0.05 [best] 73.987618045175\n", "[step] 183 [mut] 0.05 [best] 73.987618045175\n", "[step] 184 [mut] 0.05 [best] 73.987618045175\n", "[step] 185 [mut] 0.05 [best] 73.987618045175\n", "[step] 186 [mut] 0.05 [best] 73.987618045175\n", "[step] 187 [mut] 0.05 [best] 73.987618045175\n", "[step] 188 [mut] 0.05 [best] 73.987618045175\n", "[step] 189 [mut] 0.05 [best] 73.987618045175\n", "[step] 190 [mut] 0.05 [best] 73.987618045175\n", "[step] 191 [mut] 0.05 [best] 73.987618045175\n", "[step] 192 [mut] 0.05 [best] 73.987618045175\n", "[step] 193 [mut] 0.05 [best] 73.987618045175\n", "[step] 194 [mut] 0.05 [best] 73.987618045175\n", "[step] 195 [mut] 0.05 [best] 73.987618045175\n", "[step] 196 [mut] 0.05 [best] 73.987618045175\n", "[step] 197 [mut] 0.05 [best] 73.987618045175\n", "[step] 198 [mut] 0.05 [best] 73.987618045175\n", "[step] 199 [mut] 0.05 [best] 73.987618045175\n", "[step] 200 [mut] 0.05 [best] 73.987618045175\n", "[*] [Node] 16, [Best] 73.987618045175\n", "[*] Running for: 32.92 seconds\n", "\n" ] } ], "source": [ "model = MyGAModel()\n", "\n", "print(\"Genetic Algorithm\")\n", "best_solution, fitness_list, time = TSP_Bench(tsp_problem, model, max_it=200)" ] }, { "cell_type": "code", "execution_count": 383, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 383, "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": "code", "execution_count": 384, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plotTSP([best_solution], load_data(tsp_problem), num_iters=1)" ] }, { "cell_type": "code", "execution_count": 386, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best Fitness:\t 73.987618045175\n", "Best Fitness:\t 74.10873595815309\n" ] } ], "source": [ "print (\"Best Fitness:\\t\", fitness(best_solution, ulysses16))\n", "print (\"Best Fitness:\\t\", fitness(best_ulysses16, ulysses16))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Your Smart Model" ] }, { "cell_type": "code", "execution_count": 72, "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": 73, "metadata": {}, "outputs": [], "source": [ "tsp_problem = './template/data/simple/ulysses16.tsp'" ] }, { "cell_type": "code", "execution_count": 74, "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] 147.19356281214667\n", "[*] Running for: 0.01 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": 90, "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": 91, "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": 94, "metadata": {}, "outputs": [], "source": [ "tsp_path = './template/data/medium'" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Random Search\n", "[*] ./template/data/medium/pcb442.tsp\n", "[*] [Node] 442, [Best] 722875.708265324\n", "[*] Running for: 0.26 seconds\n", "\n", "[*] ./template/data/medium/a280.tsp\n", "[*] [Node] 280, [Best] 31126.512432333657\n", "[*] Running for: 0.16 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": 79, "metadata": { "scrolled": true }, "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": 82, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Genetic Algorithm\n", "[*] ./template/data/medium/pcb442.tsp\n", "'module' object is not callable\n", "[*] Unkown -4\n", "[*] No Answer -1\n", "[*] Running for: 0.12 seconds\n", "\n", "[*] ./template/data/medium/a280.tsp\n", "'module' object is not callable\n", "[*] Unkown -4\n", "[*] No Answer -1\n", "[*] Running for: 0.05 seconds\n", "\n", "[*] ./template/data/hard/dsj1000.tsp\n", "'module' object is not callable\n", "[*] Unkown -4\n", "[*] No Answer -1\n", "[*] Running for: 0.38 seconds\n", "\n", "[*] ./template/data/simple/att48.tsp\n", "'module' object is not callable\n", "[*] Unkown -4\n", "[*] No Answer -1\n", "[*] Running for: 0.01 seconds\n", "\n", "[*] ./template/data/simple/ulysses16.tsp\n", "'module' object is not callable\n", "[*] Unkown -4\n", "[*] No Answer -1\n", "[*] Running for: 0.00 seconds\n", "\n", "[*] ./template/data/simple/st70.tsp\n", "'module' object is not callable\n", "[*] Unkown -4\n", "[*] No Answer -1\n", "[*] Running for: 0.01 seconds\n", "\n" ] } ], "source": [ "model = MyGAModel()\n", "\n", "print(\"Genetic Algorithm\")\n", "best_solutions, fitness_lists, times = TSP_Bench_ALL(tsp_path, model, max_it=100, timeout=600)" ] }, { "cell_type": "code", "execution_count": 81, "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, \"Genetic Algorithm\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "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 }