1421 lines
218 KiB
Plaintext
1421 lines
218 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": {},
|
|
"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": [
|
|
"[4, 15, 11, 6, 9, 13, 5, 3, 2, 12, 14, 8, 10, 1, 7, 0]\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 128.48861505039284\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": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[*] [Node] 16, [Best] 103.2048389639759\n",
|
|
"[*] Running for: 0.00 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 0x7fe1058f7070>]"
|
|
]
|
|
},
|
|
"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": [
|
|
"## Uniform Cost Search"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 22,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import math\n",
|
|
"import random\n",
|
|
"from model.base_model import Model\n",
|
|
"\n",
|
|
"class MyUCSModel(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",
|
|
" UCS_solutions = []\n",
|
|
" UCS_losses = []\n",
|
|
" \n",
|
|
" for i in range(0, self.N):\n",
|
|
" solution = [i]\n",
|
|
" UCS_solutions.append(solution)\n",
|
|
" UCS_losses.append(math.inf)\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",
|
|
" min_loss = math.inf\n",
|
|
" while(len(UCS_solutions[ UCS_losses.index(min(UCS_losses)) ]) != self.N):\n",
|
|
" unvisited_list = list(range(0, self.N))\n",
|
|
" min_loss = min(UCS_losses)\n",
|
|
" # For each search path\n",
|
|
" for i in range(0, self.N):\n",
|
|
" if UCS_losses[i] == min_loss:\n",
|
|
" cur_city = UCS_solutions[i][-1]\n",
|
|
" unvisited_list = list( set(range(0, self.N)) - set(UCS_solutions[i]) )\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",
|
|
" UCS_solutions[i].append(j)\n",
|
|
"\n",
|
|
" N = len(UCS_solutions[i])\n",
|
|
" cur_fit = 0\n",
|
|
" for k in range(len(UCS_solutions[i])):\n",
|
|
" coord_0, coord_1 = self.coords[UCS_solutions[i][k % N]], self.coords[UCS_solutions[i][(k + 1) % N]]\n",
|
|
" cur_fit += math.sqrt((coord_0[0] - coord_1[0]) ** 2 + (coord_0[1] - coord_1[1]) ** 2)\n",
|
|
" UCS_losses[i] = cur_fit\n",
|
|
"# if(UCS_losses[i] < min_loss):\n",
|
|
"# min_loss = UCS_losses[i]\n",
|
|
" break\n",
|
|
" self.best_solution = UCS_solutions[ UCS_losses.index(min(UCS_losses)) ]\n",
|
|
" self.fitness_list.append(self.fitness(self.best_solution))\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'"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 24,
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[*] [Node] 16, [Best] 77.12688501241215\n",
|
|
"[*] Running for: 0.00 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"model = MyUCSModel()\n",
|
|
"best_solution, fitness_list, time = TSP_Bench(tsp_file, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## A star"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Heuristic"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 25,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import math\n",
|
|
"import random\n",
|
|
"from model.base_model import Model\n",
|
|
"\n",
|
|
"class MyASModel(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",
|
|
" # 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",
|
|
" closest_neighbour = -1\n",
|
|
" min_f = math.inf\n",
|
|
" \n",
|
|
" for j in unvisited_list:\n",
|
|
" g = self.dist(cur_city, j)\n",
|
|
" sub_unvisited_list = unvisited_list.copy()\n",
|
|
" sub_unvisited_list.remove(j)\n",
|
|
"\n",
|
|
" sub_cur_city = self.getMST(j)[0]\n",
|
|
" h = 0\n",
|
|
" while len(sub_unvisited_list) > 0:\n",
|
|
" if(len(unvisited_list) == 2):\n",
|
|
" break\n",
|
|
" else:\n",
|
|
" for k in self.getMST(sub_cur_city):\n",
|
|
" if k in sub_unvisited_list:\n",
|
|
" h = h + self.dist(sub_cur_city, k)\n",
|
|
" sub_cur_city = k\n",
|
|
" sub_unvisited_list.remove(k)\n",
|
|
" break\n",
|
|
" # Get f(x) = g(x) + h(x)\n",
|
|
"\n",
|
|
" f = g + h\n",
|
|
" if(f < min_f):\n",
|
|
" closest_neighbour = j\n",
|
|
" min_f = f\n",
|
|
" MST_solutions[i].append(closest_neighbour)\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",
|
|
"\n",
|
|
" return self.best_solution, self.fitness_list"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 26,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"tsp_file = './template/data/simple/ulysses16.tsp'"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 27,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[*] [Node] 16, [Best] 77.02641196679659\n",
|
|
"[*] Running for: 0.24 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"model = MyASModel()\n",
|
|
"best_solution, fitness_list, time = TSP_Bench(tsp_file, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 28,
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[<matplotlib.lines.Line2D at 0x7fe1058dd880>]"
|
|
]
|
|
},
|
|
"execution_count": 28,
|
|
"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": [
|
|
"## Hill Climbing"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Heuristic Iteration"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 29,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import math\n",
|
|
"import random\n",
|
|
"import numpy as np\n",
|
|
"from model.base_model import Model\n",
|
|
"\n",
|
|
"class MyHillClimbModel(Model):\n",
|
|
"\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 random_tour(self):\n",
|
|
" return np.random.permutation(self.N).tolist()\n",
|
|
"\n",
|
|
" def all_pairs(self, size, shuffle=random.shuffle):\n",
|
|
" r1 = list(range(size))\n",
|
|
" r2 = list(range(size))\n",
|
|
" if shuffle:\n",
|
|
" shuffle(r1)\n",
|
|
" shuffle(r2)\n",
|
|
" for i in r1:\n",
|
|
" for j in r2:\n",
|
|
" yield (i,j)\n",
|
|
"\n",
|
|
" def move_operator(self, tour):\n",
|
|
" '''generator to return all possible variations\n",
|
|
" where the section between two cities are swapped'''\n",
|
|
" for i,j in self.all_pairs(len(tour)):\n",
|
|
" if i != j:\n",
|
|
" copy=tour[:]\n",
|
|
" if i < j:\n",
|
|
" copy[i:j+1]=reversed(tour[i:j+1])\n",
|
|
" else:\n",
|
|
" copy[i+1:]=reversed(tour[:j])\n",
|
|
" copy[:j]=reversed(tour[i+1:])\n",
|
|
" if copy != tour: # no point returning the same tour\n",
|
|
" yield copy\n",
|
|
"\n",
|
|
" def fit(self, max_it=100):\n",
|
|
" \"\"\"\n",
|
|
" Put your iteration process here.\n",
|
|
" \"\"\"\n",
|
|
"\n",
|
|
" self.best_solution = self.random_tour()\n",
|
|
" best_score = -self.fitness(self.best_solution)\n",
|
|
"\n",
|
|
" num_evaluations = 0\n",
|
|
"\n",
|
|
" while num_evaluations < max_it:\n",
|
|
" # examine moves around our current position\n",
|
|
" move_made = False\n",
|
|
" for next_solution in self.move_operator(self.best_solution):\n",
|
|
" if num_evaluations >= max_it:\n",
|
|
" print(\"Max iteration reached:\", max_it)\n",
|
|
" break\n",
|
|
"\n",
|
|
" # see if this move is better than the current\n",
|
|
" next_score = -self.fitness(next_solution)\n",
|
|
" num_evaluations += 1\n",
|
|
" if next_score > best_score:\n",
|
|
" self.best_solution = next_solution\n",
|
|
" self.fitness_list.append(self.fitness(self.best_solution))\n",
|
|
" best_score=next_score\n",
|
|
" move_made=True\n",
|
|
" break # depth first search\n",
|
|
"\n",
|
|
" if not move_made:\n",
|
|
" break # we couldn't find a better move (must be at a local maximum)\n",
|
|
"\n",
|
|
" return self.best_solution, self.fitness_list"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 30,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"tsp_file = './template/data/simple/ulysses16.tsp'"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 31,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[*] [Node] 16, [Best] 75.20004295930718\n",
|
|
"[*] Running for: 0.01 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"model = MyHillClimbModel()\n",
|
|
"best_solution, fitness_list, time = TSP_Bench(tsp_file, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 32,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[<matplotlib.lines.Line2D at 0x7fe10583e910>]"
|
|
]
|
|
},
|
|
"execution_count": 32,
|
|
"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)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Your Smart Model"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 33,
|
|
"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.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": 34,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"tsp_problem = './template/data/simple/ulysses16.tsp'"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 35,
|
|
"metadata": {
|
|
"scrolled": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[MyModel] Nothing to initialize in your model now\n",
|
|
"[*] [Node] 16, [Best] 148.18952217033015\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": 36,
|
|
"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": 37,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"tsp_path = './template/data'"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 38,
|
|
"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": 39,
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Random Search\n",
|
|
"[*] ./template/data/medium/pcb442.tsp\n",
|
|
"[*] [Node] 442, [Best] 726650.2719896487\n",
|
|
"[*] Running for: 0.38 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/medium/a280.tsp\n",
|
|
"[*] [Node] 280, [Best] 31046.898980759102\n",
|
|
"[*] Running for: 0.22 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/hard/dsj1000.tsp\n",
|
|
"[*] [Node] 1000, [Best] 531016891.20882976\n",
|
|
"[*] Running for: 1.06 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/att48.tsp\n",
|
|
"[*] [Node] 48, [Best] 121918.36235964627\n",
|
|
"[*] Running for: 0.07 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/ulysses16.tsp\n",
|
|
"[*] [Node] 16, [Best] 96.82217370013487\n",
|
|
"[*] Running for: 0.02 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/st70.tsp\n",
|
|
"[*] [Node] 70, [Best] 3084.202093710709\n",
|
|
"[*] Running for: 0.08 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": 40,
|
|
"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, \"Random Model\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 41,
|
|
"metadata": {
|
|
"scrolled": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Uniform Cost Search\n",
|
|
"[*] ./template/data/medium/pcb442.tsp\n",
|
|
"[*] [Node] 442, [Best] 58952.967129705365\n",
|
|
"[*] Running for: 47.11 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/medium/a280.tsp\n",
|
|
"[*] [Node] 280, [Best] 3088.6042241002488\n",
|
|
"[*] Running for: 9.48 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.08 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.17 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"model = MyUCSModel()\n",
|
|
"\n",
|
|
"print(\"Uniform Cost Search\")\n",
|
|
"best_solutions, fitness_lists, times = TSP_Bench_ALL(tsp_path, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 42,
|
|
"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, \"Uniform Cost Search\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 43,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"A Star Search\n",
|
|
"[*] ./template/data/medium/pcb442.tsp\n",
|
|
"[*] Timeout -3\n",
|
|
"[*] Running for: 60.01 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/medium/a280.tsp\n",
|
|
"[*] Timeout -3\n",
|
|
"[*] Running for: 60.01 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",
|
|
"[*] Timeout -3\n",
|
|
"[*] Running for: 60.00 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/ulysses16.tsp\n",
|
|
"[*] [Node] 16, [Best] 77.02641196679659\n",
|
|
"[*] Running for: 0.27 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/st70.tsp\n",
|
|
"[*] Timeout -3\n",
|
|
"[*] Running for: 60.00 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"model = MyASModel()\n",
|
|
"\n",
|
|
"print(\"A Star Search\")\n",
|
|
"best_solutions, fitness_lists, times = TSP_Bench_ALL(tsp_path, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 44,
|
|
"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, \"A Star Search\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 45,
|
|
"metadata": {
|
|
"scrolled": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Hill-Climbing Search\n",
|
|
"[*] ./template/data/medium/pcb442.tsp\n",
|
|
"[*] [Node] 442, [Best] 534598.7236016603\n",
|
|
"[*] Running for: 0.54 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/medium/a280.tsp\n",
|
|
"Max iteration reached: 1000\n",
|
|
"[*] [Node] 280, [Best] 20166.72717957085\n",
|
|
"[*] Running for: 0.27 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/hard/dsj1000.tsp\n",
|
|
"Max iteration reached: 1000\n",
|
|
"[*] [Node] 1000, [Best] 447129851.29925376\n",
|
|
"[*] Running for: 1.22 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/att48.tsp\n",
|
|
"Max iteration reached: 1000\n",
|
|
"[*] [Node] 48, [Best] 48649.76285824257\n",
|
|
"[*] Running for: 0.04 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/ulysses16.tsp\n",
|
|
"[*] [Node] 16, [Best] 73.99982631274877\n",
|
|
"[*] Running for: 0.01 seconds\n",
|
|
"\n",
|
|
"[*] ./template/data/simple/st70.tsp\n",
|
|
"Max iteration reached: 1000\n",
|
|
"[*] [Node] 70, [Best] 1628.8466328473826\n",
|
|
"[*] Running for: 0.06 seconds\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"model = MyHillClimbModel()\n",
|
|
"\n",
|
|
"print(\"Hill-Climbing Search\")\n",
|
|
"best_solutions, fitness_lists, times = TSP_Bench_ALL(tsp_path, model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 46,
|
|
"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, \"Hill-Climbing Search\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Conclusions"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 47,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Simple\n",
|
|
"# ulysses16: 77.12 (UCS-BFS), 77.02 (A-Star)\n",
|
|
"# att48: 39236 (UCS-BFS), 47853 (A-Star)\n",
|
|
"# st70: 761 (UCS-BFS), time-out (A-Star)\n",
|
|
"\n",
|
|
"# Medium\n",
|
|
"# a280: 3088 (UCS-BFS), time-out (A-Star)\n",
|
|
"# pcb442: 58952 (UCS-BFS), time-out (A-Star)\n",
|
|
"\n",
|
|
"# Hard\n",
|
|
"# dsj1000: time-out (UCS-BFS), 542,620,572 (Hill-Climbing)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"<p style=\"font-size: 18px\"> 1. UCS is the slowest one, and gets the same result as BFS, DFS, DP </p>\n",
|
|
"<p style=\"font-size: 18px\"> 1. A-Star can only solve problems with number of cities < 50. </p>\n",
|
|
"<p style=\"font-size: 18px\"> 2. Hill-Climbing gets different results every time (Heuristic). </p>\n",
|
|
"<p style=\"font-size: 18px\"> 3. Hill-Climbing is the fastest one till now. (faster than Dynamic Programming, but worse results). </p>"
|
|
]
|
|
},
|
|
{
|
|
"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
|
|
}
|