1593 lines
287 KiB
Plaintext
1593 lines
287 KiB
Plaintext
{
|
|
"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": [
|
|
"<img src=\"images/tsp.jpg\" alt=\"TSP\" style=\"width: 900px;\"/>"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"<img src=\"images/solutions.png\" alt=\"solutions\" style=\"width: 900px;\"/>"
|
|
]
|
|
},
|
|
{
|
|
"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": {
|
|
"scrolled": true
|
|
},
|
|
"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": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"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": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"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": [
|
|
"[9, 8, 3, 7, 0, 13, 15, 4, 11, 10, 2, 14, 12, 6, 5, 1]\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": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"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": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"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 147.23709375479442\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": {
|
|
"scrolled": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"tsp_file = './template/data/simple/ulysses16.tsp'"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 20,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[*] [Node] 16, [Best] 109.76627855420857\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": [
|
|
"[<matplotlib.lines.Line2D at 0x7f1904092e80>]"
|
|
]
|
|
},
|
|
"execution_count": 21,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.plot(fitness_list, 'o-')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Minimum Spanning Tree (Depth First)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 22,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import math\n",
|
|
"import random\n",
|
|
"from model.base_model import Model\n",
|
|
"\n",
|
|
"class MyDFSModel(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",
|
|
"\n",
|
|
" MST_solutions = []\n",
|
|
" # Depth First: Set one city as starting point, iterate to the end, then select next city as starting point.\n",
|
|
" for i in range(0, self.N):\n",
|
|
" solution = []\n",
|
|
" solution.append(i)\n",
|
|
" unvisited_list = list(range(0, self.N))\n",
|
|
" cur_city = i\n",
|
|
"# print(\"[starting]\", i)\n",
|
|
" for steps in range(self.N - 1):\n",
|
|
"# print(unvisited_list)\n",
|
|
" unvisited_list.remove(cur_city)\n",
|
|
" closest_neighbour = -1\n",
|
|
" shortest_distance = math.inf\n",
|
|
" for j in unvisited_list:\n",
|
|
" if(self.dist(cur_city, j) < shortest_distance):\n",
|
|
" closest_neighbour = j\n",
|
|
" shortest_distance = self.dist(cur_city, j)\n",
|
|
" solution.append(closest_neighbour)\n",
|
|
" cur_city = closest_neighbour\n",
|
|
" MST_solutions.append(solution)\n",
|
|
" self.fitness_list.append(self.fitness(solution))\n",
|
|
"\n",
|
|
" self.best_solution = MST_solutions[ self.fitness_list.index(min(self.fitness_list)) ]\n",
|
|
"\n",
|
|
" return self.best_solution, self.fitness_list"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 23,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"tsp_file = './template/data/simple/ulysses16.tsp'\n",
|
|
"model = MyDFSModel()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 24,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[*] [Node] 16, [Best] 77.12688501241215\n",
|
|
"[*] Running for: 0.01 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"best_solution, fitness_list, time = TSP_Bench(tsp_file, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 25,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[<matplotlib.lines.Line2D at 0x7f190407a970>]"
|
|
]
|
|
},
|
|
"execution_count": 25,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.plot(fitness_list, 'o-')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Minimum Spanning Tree (Breadth First)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 26,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import math\n",
|
|
"import random\n",
|
|
"from model.base_model import Model\n",
|
|
"\n",
|
|
"class MyBFSModel(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",
|
|
"\n",
|
|
" UCS_solutions = []\n",
|
|
" \n",
|
|
" for i in range(0, self.N):\n",
|
|
" solution = [i]\n",
|
|
" UCS_solutions.append(solution)\n",
|
|
" \n",
|
|
" # Breadth First: Set each city as starting point, then go to next city simultaneously\n",
|
|
" for step in range(0, self.N - 1):\n",
|
|
" # print(\"[step]\", step)\n",
|
|
" unvisited_list = list(range(0, self.N))\n",
|
|
" # For each search path\n",
|
|
" for i in range(0, self.N):\n",
|
|
" cur_city = UCS_solutions[i][-1]\n",
|
|
" unvisited_list = list( set(range(0, self.N)) - set(UCS_solutions[i]) )\n",
|
|
" # print(unvisited_list)\n",
|
|
" closest_neighbour = -1\n",
|
|
" shortest_distance = math.inf\n",
|
|
" for j in unvisited_list:\n",
|
|
" if(self.dist(cur_city, j) < shortest_distance):\n",
|
|
" closest_neighbour = j\n",
|
|
" shortest_distance = self.dist(cur_city, j)\n",
|
|
" UCS_solutions[i].append(closest_neighbour)\n",
|
|
"\n",
|
|
" for i in range(0, self.N):\n",
|
|
" self.fitness_list.append(self.fitness(UCS_solutions[i]))\n",
|
|
" \n",
|
|
" self.best_solution = UCS_solutions[ self.fitness_list.index(min(self.fitness_list)) ]\n",
|
|
" self.fitness_list.append(self.fitness(self.best_solution))\n",
|
|
"\n",
|
|
" return self.best_solution, self.fitness_list"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 27,
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"tsp_file = './template/data/simple/ulysses16.tsp'\n",
|
|
"model = MyBFSModel()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 28,
|
|
"metadata": {
|
|
"scrolled": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[*] [Node] 16, [Best] 77.12688501241215\n",
|
|
"[*] Running for: 0.01 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"best_solution, fitness_list, time = TSP_Bench(tsp_file, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 29,
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[<matplotlib.lines.Line2D at 0x7f1903fe00d0>]"
|
|
]
|
|
},
|
|
"execution_count": 29,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.plot(fitness_list, 'o-')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Dynamic Programming (DFS)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Costs a lot of memory"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 30,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import math\n",
|
|
"import random\n",
|
|
"from model.base_model import Model\n",
|
|
"\n",
|
|
"class MyDPDModel(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 getMST(self, node):\n",
|
|
" MST = []\n",
|
|
" distances = []\n",
|
|
" for i in range(0, self.N):\n",
|
|
" if i != node:\n",
|
|
" MST.append(i)\n",
|
|
" distances.append(self.dist(node, i))\n",
|
|
" return [x for _,x in sorted(zip(distances, MST))]\n",
|
|
"\n",
|
|
" def fit(self, max_it):\n",
|
|
" \"\"\"\n",
|
|
" Put your iteration process here.\n",
|
|
" \"\"\"\n",
|
|
"\n",
|
|
" MST_solutions = []\n",
|
|
"\n",
|
|
" # Depth First: Set one city as starting point, iterate to the end, then select next city as starting point.\n",
|
|
" MSTs = []\n",
|
|
" for i in range(0, self.N):\n",
|
|
" MSTs.append([-1] * self.N)\n",
|
|
" for i in range(0, self.N):\n",
|
|
" solution = []\n",
|
|
" solution.append(i)\n",
|
|
" unvisited_list = list(range(0, self.N))\n",
|
|
" cur_city = i\n",
|
|
" # print(\"[starting]\", i)\n",
|
|
" for steps in range(self.N - 1):\n",
|
|
" # print(unvisited_list)\n",
|
|
" unvisited_list.remove(cur_city)\n",
|
|
" if MSTs[cur_city][0] == -1:\n",
|
|
" MST = self.getMST(cur_city)\n",
|
|
" MSTs[cur_city] = MST\n",
|
|
" \n",
|
|
" for j in MSTs[cur_city]:\n",
|
|
" if(j in unvisited_list):\n",
|
|
" solution.append(j)\n",
|
|
" cur_city = j\n",
|
|
" break\n",
|
|
" # print(solution)\n",
|
|
" MST_solutions.append(solution)\n",
|
|
" self.fitness_list.append(self.fitness(solution))\n",
|
|
"\n",
|
|
" self.best_solution = MST_solutions[ self.fitness_list.index(min(self.fitness_list)) ]\n",
|
|
"\n",
|
|
" return self.best_solution, self.fitness_list"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 31,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"tsp_file = './template/data/simple/ulysses16.tsp'\n",
|
|
"model = MyDPDModel()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 32,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[*] [Node] 16, [Best] 77.12688501241215\n",
|
|
"[*] Running for: 0.00 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"best_solution, fitness_list, time = TSP_Bench(tsp_file, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 33,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[<matplotlib.lines.Line2D at 0x7f1903fb8fa0>]"
|
|
]
|
|
},
|
|
"execution_count": 33,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.plot(fitness_list, 'o-')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Dynamic Programming (BFS)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 34,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import math\n",
|
|
"import random\n",
|
|
"from model.base_model import Model\n",
|
|
"\n",
|
|
"class MyDPBModel(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 getMST(self, node):\n",
|
|
" MST = []\n",
|
|
" distances = []\n",
|
|
" for i in range(0, self.N):\n",
|
|
" if i != node:\n",
|
|
" MST.append(i)\n",
|
|
" distances.append(self.dist(node, i))\n",
|
|
" return [x for _,x in sorted(zip(distances, MST))]\n",
|
|
"\n",
|
|
" def fit(self, max_it):\n",
|
|
" \"\"\"\n",
|
|
" Put your iteration process here.\n",
|
|
" \"\"\"\n",
|
|
"\n",
|
|
" MST_solutions = []\n",
|
|
" \n",
|
|
" for i in range(0, self.N):\n",
|
|
" solution = [i]\n",
|
|
" MST_solutions.append(solution)\n",
|
|
" \n",
|
|
" MSTs = []\n",
|
|
" for i in range(0, self.N):\n",
|
|
" MSTs.append([-1] * self.N)\n",
|
|
"\n",
|
|
" # Breadth First: Set each city as starting point, then go to next city simultaneously\n",
|
|
" for step in range(0, self.N - 1):\n",
|
|
" # print(\"[step]\", step)\n",
|
|
" unvisited_list = list(range(0, self.N))\n",
|
|
" # For each search path\n",
|
|
" for i in range(0, self.N):\n",
|
|
" cur_city = MST_solutions[i][-1]\n",
|
|
" unvisited_list = list( set(range(0, self.N)) - set(MST_solutions[i]) )\n",
|
|
"\n",
|
|
" if MSTs[cur_city][0] == -1:\n",
|
|
" MST = self.getMST(cur_city)\n",
|
|
" MSTs[cur_city] = MST\n",
|
|
"\n",
|
|
" for j in MSTs[cur_city]:\n",
|
|
" if(j in unvisited_list):\n",
|
|
" MST_solutions[i].append(j)\n",
|
|
" break\n",
|
|
"\n",
|
|
" for i in range(0, self.N):\n",
|
|
" self.fitness_list.append(self.fitness(MST_solutions[i]))\n",
|
|
" \n",
|
|
" self.best_solution = MST_solutions[ self.fitness_list.index(min(self.fitness_list)) ]\n",
|
|
" self.fitness_list.append(self.fitness(self.best_solution))\n",
|
|
"\n",
|
|
" return self.best_solution, self.fitness_list"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 35,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"tsp_file = './template/data/simple/ulysses16.tsp'\n",
|
|
"model = MyDPBModel()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 36,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[*] [Node] 16, [Best] 77.12688501241215\n",
|
|
"[*] Running for: 0.00 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"best_solution, fitness_list, time = TSP_Bench(tsp_file, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 37,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[<matplotlib.lines.Line2D at 0x7f1903f1d850>]"
|
|
]
|
|
},
|
|
"execution_count": 37,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.plot(fitness_list, 'o-')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Your Smart Model"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 38,
|
|
"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",
|
|
"\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.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": 39,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"tsp_problem = './template/data/simple/ulysses16.tsp'\n",
|
|
"model = MyModel()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 40,
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[MyModel] Nothing to initialize in your model now\n",
|
|
"[*] [Node] 16, [Best] 148.6111649037806\n",
|
|
"[*] Running for: 0.00 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"best_solution, fitness_list, time = TSP_Bench(tsp_file, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Test All Dataset"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 41,
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"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": 42,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"tsp_path = './template/data'"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 43,
|
|
"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": 44,
|
|
"metadata": {
|
|
"scrolled": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Random Search\n",
|
|
"[*] ./template/data/medium/pcb442.tsp\n",
|
|
"[*] [Node] 442, [Best] 728128.1926675908\n",
|
|
"[*] Running for: 0.47 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/medium/a280.tsp\n",
|
|
"[*] [Node] 280, [Best] 30174.692642901202\n",
|
|
"[*] Running for: 0.24 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/hard/dsj1000.tsp\n",
|
|
"[*] [Node] 1000, [Best] 526435341.8268128\n",
|
|
"[*] Running for: 0.92 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/att48.tsp\n",
|
|
"[*] [Node] 48, [Best] 123505.12211442963\n",
|
|
"[*] Running for: 0.04 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/ulysses16.tsp\n",
|
|
"[*] [Node] 16, [Best] 98.36043449906845\n",
|
|
"[*] Running for: 0.02 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/st70.tsp\n",
|
|
"[*] [Node] 70, [Best] 3030.2458377657613\n",
|
|
"[*] Running for: 0.06 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"model = MyRandomModel()\n",
|
|
"print(\"Random Search\")\n",
|
|
"best_solutions, fitness_lists, times = TSP_Bench_ALL(tsp_path, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 45,
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plot_results(best_solutions, times, \"Random Model\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 46,
|
|
"metadata": {
|
|
"scrolled": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[*] ./template/data/medium/pcb442.tsp\n",
|
|
"[*] [Node] 442, [Best] 58952.967129705365\n",
|
|
"[*] Running for: 31.01 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/medium/a280.tsp\n",
|
|
"[*] [Node] 280, [Best] 3088.6042241002488\n",
|
|
"[*] Running for: 7.16 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/hard/dsj1000.tsp\n",
|
|
"[*] Timeout -3\n",
|
|
"[*] Running for: 60.02 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/att48.tsp\n",
|
|
"[*] [Node] 48, [Best] 39236.884898455035\n",
|
|
"[*] Running for: 0.04 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/ulysses16.tsp\n",
|
|
"[*] [Node] 16, [Best] 77.12688501241215\n",
|
|
"[*] Running for: 0.00 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/st70.tsp\n",
|
|
"[*] [Node] 70, [Best] 761.6890898866324\n",
|
|
"[*] Running for: 0.11 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"model = MyDFSModel()\n",
|
|
"\n",
|
|
"best_solutions, fitness_lists, times = TSP_Bench_ALL(tsp_path, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 47,
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plot_results(best_solutions, times, \"Depth First Search\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 48,
|
|
"metadata": {
|
|
"scrolled": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[*] ./template/data/medium/pcb442.tsp\n",
|
|
"[*] [Node] 442, [Best] 58952.967129705365\n",
|
|
"[*] Running for: 33.78 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/medium/a280.tsp\n",
|
|
"[*] [Node] 280, [Best] 3088.6042241002488\n",
|
|
"[*] Running for: 7.97 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/hard/dsj1000.tsp\n",
|
|
"[*] Timeout -3\n",
|
|
"[*] Running for: 60.02 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/att48.tsp\n",
|
|
"[*] [Node] 48, [Best] 39236.884898455035\n",
|
|
"[*] Running for: 0.06 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/ulysses16.tsp\n",
|
|
"[*] [Node] 16, [Best] 77.12688501241215\n",
|
|
"[*] Running for: 0.00 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/st70.tsp\n",
|
|
"[*] [Node] 70, [Best] 761.6890898866324\n",
|
|
"[*] Running for: 0.14 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"model = MyBFSModel()\n",
|
|
"\n",
|
|
"best_solutions, fitness_lists, times = TSP_Bench_ALL(tsp_path, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 49,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plot_results(best_solutions, times, \"Breadth First Search\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 50,
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Dynamic Progrmaming\n",
|
|
"[*] ./template/data/medium/pcb442.tsp\n",
|
|
"[*] [Node] 442, [Best] 58952.967129705365\n",
|
|
"[*] Running for: 2.05 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/medium/a280.tsp\n",
|
|
"[*] [Node] 280, [Best] 3088.6042241002488\n",
|
|
"[*] Running for: 0.55 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/hard/dsj1000.tsp\n",
|
|
"[*] [Node] 1000, [Best] 22449665.175576296\n",
|
|
"[*] Running for: 32.57 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/att48.tsp\n",
|
|
"[*] [Node] 48, [Best] 39236.884898455035\n",
|
|
"[*] Running for: 0.01 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/ulysses16.tsp\n",
|
|
"[*] [Node] 16, [Best] 77.12688501241215\n",
|
|
"[*] Running for: 0.00 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/st70.tsp\n",
|
|
"[*] [Node] 70, [Best] 761.6890898866324\n",
|
|
"[*] Running for: 0.02 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"model = MyDPDModel()\n",
|
|
"\n",
|
|
"print(\"Dynamic Progrmaming\")\n",
|
|
"best_solutions, fitness_lists, times = TSP_Bench_ALL(tsp_path, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 51,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plot_results(best_solutions, times, \"Dynamic Programming (Depth First)\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 52,
|
|
"metadata": {
|
|
"scrolled": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Dynamic Progrmaming\n",
|
|
"[*] ./template/data/medium/pcb442.tsp\n",
|
|
"[*] [Node] 442, [Best] 58952.967129705365\n",
|
|
"[*] Running for: 7.77 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/medium/a280.tsp\n",
|
|
"[*] [Node] 280, [Best] 3088.6042241002488\n",
|
|
"[*] Running for: 2.04 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/hard/dsj1000.tsp\n",
|
|
"[*] Timeout -3\n",
|
|
"[*] Running for: 60.04 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/att48.tsp\n",
|
|
"[*] [Node] 48, [Best] 39236.884898455035\n",
|
|
"[*] Running for: 0.02 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/ulysses16.tsp\n",
|
|
"[*] [Node] 16, [Best] 77.12688501241215\n",
|
|
"[*] Running for: 0.00 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/st70.tsp\n",
|
|
"[*] [Node] 70, [Best] 761.6890898866324\n",
|
|
"[*] Running for: 0.04 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"model = MyDPBModel()\n",
|
|
"\n",
|
|
"print(\"Dynamic Progrmaming\")\n",
|
|
"best_solutions, fitness_lists, times = TSP_Bench_ALL(tsp_path, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 53,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plot_results(best_solutions, times, \"Dynamic Programming (Breadth First)\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Conclusions (Random, BFS, DFS, DP)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 54,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Simple\n",
|
|
"# ulysses16: 77 (BFS), 84 (DFS)\n",
|
|
"# att48: 39236 (BFS), 40763 (DFS)\n",
|
|
"# st70: 761 (BFS), 901 (DFS)\n",
|
|
"\n",
|
|
"# Medium\n",
|
|
"# a280: 3088 (BFS), 3558 (DFS)\n",
|
|
"# pcb442: 58952 (BFS), 61984 (DFS)\n",
|
|
"\n",
|
|
"# Hard\n",
|
|
"# dsj1000: time-out (DP-BFS) 23,552,227 (DP-DFS)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"<p style=\"font-size: 18px\"> 1. All different models get <strong>the same results</strong> every time (except random). </p>\n",
|
|
"<p style=\"font-size: 18px\"> 2. All different models have an <strong>exponential time complexity</strong> (except random). </p>\n",
|
|
"<p style=\"font-size: 18px\"> 3. Depth First Seach is a little faster than Breadth First Search, but Breadth First get better results. </p>\n",
|
|
"<p style=\"font-size: 18px\"> 4. Only <strong>dynamic programming</strong> solves the problem with 1000 cities (Fast). </p>"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 55,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# In the next workshop \n",
|
|
"# Will try to solve the problem with 1000 cities faster, and get better results"
|
|
]
|
|
},
|
|
{
|
|
"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
|
|
}
|