{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# The Traveling Salesperson Problem" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Consider the [*Traveling Salesperson Problem*](http://en.wikipedia.org/wiki/Traveling_salesman_problem): \n", "\n", "> *Given a set of cities and the distances between each pair of cities, what is the shortest possible tour that visits each city exactly once, and returns to the starting city?*\n", "\n", "In this notebook we will develop some solutions to the problem, and more generally show *how to think about* solving a problem like this. [Elsewhere](https://research.googleblog.com/2016/09/the-280-year-old-algorithm-inside.html) you can read about how the algorithms developed here are used in serious applications that millions of people rely on every day.\n", "\n", "\n", "
An example tour.
\n", " \n", "# Understanding What We're Talking About (Vocabulary)\n", "\n", "Do we understand precisely what the problem is asking? Do we understand all the concepts that the problem talks about? Do we understand them well enough to implement them in a programming language? Let's take a first pass:\n", "\n", "- **A set of cities**: We will need to represent a set of cities; Python's set datatype might be appropriate.\n", "- **Distance between each pair of cities**: If A and B are cities, this could be a function, distance(A, B), or a table lookup, distance[A][B]. The resulting distance will be a real number.\n", "- **City**: All we have to know about an individual city is how far it is from other cities. We don't have to know its name, population, best restaurants, or anything else. So a city could be just an integer (0, 1, 2, ...) used as an index into a distance table, or a city could be a pair of (x, y) coordinates, if we are using straight-line distance on a plane.\n", "- **Tour**: A tour is a specified order in which to visit the cities; Python's list or tuple datatypes would work. For example, given the set of cities {A, B, C, D}, a tour might be the list [B, D, A, C], which means to travel from B to D to A to C and finally back to B.\n", "- **Shortest possible tour**: The shortest tour is the one whose tour length is the minimum of all tours.\n", "- **Tour length**: The sum of the distances between adjacent cities in the tour (including the last city back to the first city). Probably a function, tour_length(tour).\n", "- **What is ...**: We can define a function to answer the question *what is the shortest possible tour?* The function takes a set of cities as input and returns a tour as output. I will use the convention that any such function will have a name ending in the letters \"tsp\", the traditional abbreviation for Traveling Salesperson Problem.\n", "\n", "At this stage I have a rough sketch of how to attack the problem. I don't have all the answers, and I haven't committed to specific representations for all the concepts, but I know what all the pieces are, and I don't see anything that stops me from proceeding." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are the imports used throughout this notebook. I'm assuming Python 3." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import random\n", "import time\n", "import itertools\n", "import urllib\n", "import csv\n", "import functools\n", "from statistics import mean, stdev" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# All Tours Algorithm: alltours_tsp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start with an algorithm that is guaranteed to solve the problem, although it is inefficient for large sets of cities:\n", "\n", "> **All Tours Algorithm**: *Generate all possible tours of the cities, and choose the shortest tour (the one with minimum tour length).*\n", "\n", "My design philosophy is to first write an English description of the algorithm, then write Python code that closely mirrors the English description. This will probably require some auxilliary functions and data structures; just assume they exist; put them on a TO DO list, and eventually define them with the same design philosophy.\n", "\n", "Here is the start of the implementation:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def alltours_tsp(cities):\n", " \"Generate all possible tours of the cities and choose the shortest tour.\"\n", " return shortest_tour(alltours(cities))\n", "\n", "def shortest_tour(tours): \n", " \"Choose the tour with the minimum tour length.\"\n", " return min(tours, key=tour_length)\n", "\n", "# TO DO: Data types: cities, tours, Functions: alltours, tour_length" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note**: In Python min(*collection*,key=*function*) means to find the element *x* that is a member of *collection* such that *function(x)* is minimized. So shortest finds the tour whose tour_length in the minimal among the tours. \n", "\n", "This gives us a good start; the Python code closely matches the English description. And we know what we need to do next: represent cities and tours, and implement the functions alltours and tour_length. Let's start with tours.\n", "\n", "\n", "Representing Tours\n", "------------------\n", "\n", "A tour starts in one city, and then visits each of the other cities in order, before returning to the start city. A natural representation of a tour is a sequence of cities. For example (1, 2, 3) could represent a tour that starts in city 1, moves to 2, then 3, and finally returns to 1. \n", "\n", "**Note**: I considered using (1, 2, 3, 1) as the representation of this tour. I also considered an ordered list of **edges** between cities: \n", "((1, 2), (2, 3), (3, 1)). In the end, I decided (1, 2, 3) was simplest.\n", " \n", "\n", "Now for the alltours function. If a tour is a sequence of cities, then all the tours are *permutations* of the set of all cities. A function to generate all permutations of a set is already provided in Python's standard itertools library module; we can use it as our implementation of alltours:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "alltours = itertools.permutations " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For *n* cities there are *n*! (that is, the factorial of *n*) permutations.\n", "Here's are all 3! = 6 tours of 3 cities:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cities = {1, 2, 3}\n", "\n", "list(alltours(cities))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The length of a tour is the sum of the lengths of each edge in the tour; in other words, the sum of the distances between consecutive cities in the tour, including the distance form the last city back to the first:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def tour_length(tour):\n", " \"The total of distances between each pair of consecutive cities in the tour.\"\n", " return sum(distance(tour[i], tour[i-1]) \n", " for i in range(len(tour)))\n", "\n", "# TO DO: Functions: distance, Data types: cities" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note**: I use one Python-specific trick: when i is 0, then distance(tour[0], tour[-1]) gives us the wrap-around distance between the first and last cities, because tour[-1] is the last element of tour. \n", "\n", "Representing Cities\n", "--------------------------------\n", "\n", "We determined that the only thing that matters about cities is the distance between them. But before we can decide about how to represent cities, and before we can define distance(A, B), we have to make a choice. In the fully general version of the TSP, the \"distance\" between two cities could be anything: it could factor in the amount of time it takes to travel between cities, the twistiness of the road, or anything else. The distance(A, B) might be different from distance(B, A). So the distances could be represented by a matrix distance[A][B], where any entry in the matrix could be any (non-negative) numeric value.\n", " \n", "But we will ignore the fully general TSP and concentrate on an important special case, the **Euclidean TSP**, where the distance between any two cities is the [Euclidean distance](http://en.wikipedia.org/wiki/Euclidean_distance), the straight-line distance between points in a two-dimensional plane. So a city can be represented by a two-dimensional point: a pair of *x* and *y* coordinates. We will use the constructor function City, so that City(300, 0) creates a city with x-coordinate of 300 and y coordinate of 0. Then distance(A, B) will be a function that uses the *x* and *y* coordinates to compute the distance between A and B.\n", "\n", "Representing Points and Computing distance\n", "---\n", " \n", "OK, so a city can be represented as just a two-dimensional point. But how will we represent points? Here are some choices, with their pros and cons:\n", "\n", "* **tuple:** A point is a two-tuple of (*x*, *y*) coordinates, for example, (300, 0). **Pro:** Very simple. \n", "**Con:** doesn't distinguish Points from other two-tuples. \n", " \n", "* **class:** Define a custom Point class with *x* and *y* slots. **Pro:** explicit, gives us p.x and p.y accessors. **Con:** less efficient.\n", " \n", "* **complex:** Python already has the two-dimensional point as a built-in numeric data type, but in a non-obvious way: as complex numbers, which inhabit the two-dimensional (real × imaginary) plane. **Pro:** efficient. **Con:** a little confusing; doesn't distinguish Points from other complex numbers.\n", "* **subclass of complex:** All the pros of complex, and eliminating the major con.\n", "\n", "\n", "Any of these choices would work perfectly well; I decided to use a subclass of complex:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Cities are represented as Points, which are a subclass of complex numbers\n", "\n", "class Point(complex):\n", " x = property(lambda p: p.real)\n", " y = property(lambda p: p.imag)\n", " \n", "City = Point\n", "\n", "def distance(A, B): \n", " \"The distance between two points.\"\n", " return abs(A - B)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's an example of computing the distance between two cities:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "5.0" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = City(3, 0)\n", "B = City(0, 4)\n", "distance(A, B)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Random Sets of Cities\n", "---\n", "\n", "The input to a TSP algorithm should be a set of cities. I can make a random set of *n* cities by calling City *n* times, each with different random *x* and *y* coordinates:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{(193+375j), (427+384j), (497+585j), (179+546j), (224+543j), (245+643j)}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "{City(random.randrange(1000), random.randrange(1000)) for c in range(6)}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The function Cities does that (and a bit more):" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def Cities(n, width=900, height=600, seed=42):\n", " \"Make a set of n cities, each with random coordinates within a (width x height) rectangle.\"\n", " random.seed(seed * n)\n", " return frozenset(City(random.randrange(width), random.randrange(height))\n", " for c in range(n))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are three complications that I decided to tackle in Cities:\n", "\n", "1. IPython's matplotlib plots (by default) in a rectangle that is 1.5 times wider than it is high; that's why I specified a width of 900 and a height of 600. If you want the coordinates of your cities to be bounded by a different size rectangle, you can change width or height.\n", "\n", "2. Sometimes I want Cities(n) to be a true function, returning the same result each time. This is very helpful for getting repeatable results: if I run a test twice, I get the same results twice. \n", "But other times I would like to be able to do an experiment, where, for example, I call Cities(n) 30 times and get 30 different sets, and I then compute the average tour length produced by my algorithm across these 30 sets. Can I get both behaviors out of one function? *Yes!* The trick is the additional optional parameter, seed. Two calls to Cities with the same n and seed parameters will always return the same set of cities, and two calls with different values for seed will return different sets. This is implemented by calling the function random.seed, which resets the random number generator.\n", "\n", "3. Once I create a set of Cities, I don't want anyone messing with my set. For example, I don't want an algorithm that claims to \"solve\" a problem by deleting half the cities from the input set, then finding a tour of the remaining cities. Therefore, I make Cities return a frozenset rather than a set. A frozenset is *immutable*; nobody can change it once it is created. (Likewise, each city is immutable.)\n", "\n", "For example:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "frozenset({(172+20j), (234+40j), (696+415j), (393+7j), (671+296j)})" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# A set of 5 cities\n", "Cities(5)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[frozenset({(172+20j), (234+40j), (696+415j), (393+7j), (671+296j)}),\n", " frozenset({(172+20j), (234+40j), (696+415j), (393+7j), (671+296j)}),\n", " frozenset({(172+20j), (234+40j), (696+415j), (393+7j), (671+296j)})]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The exact same set of 5 cities each time\n", "[Cities(5) for i in range(3)]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[frozenset({(414+310j), (776+430j), (41+265j), (864+394j), (523+497j)}),\n", " frozenset({(814+542j), (29+476j), (637+261j), (759+367j), (794+255j)}),\n", " frozenset({(439+494j), (211+473j), (585+33j), (832+503j), (591+15j)})]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# A different set of 5 cities each time\n", "[Cities(5, seed=i) for i in range(3)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we are ready to apply the alltours_tsp function to find the shortest tour:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "((6+546j),\n", " (199+147j),\n", " (350+65j),\n", " (737+26j),\n", " (847+187j),\n", " (891+465j),\n", " (554+374j),\n", " (505+548j))" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alltours_tsp(Cities(8))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2509.307587720301" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tour_length(alltours_tsp(Cities(8)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Quick, is that the right answer? I have no idea, and you probably can't tell either. But if we could *plot* the tour we'd understand it better and might be able to see at a glance if the tour is optimal.\n", "\n", "Plotting Tours\n", "---\n", "\n", "I define plot_tour(tour) to plot the cities (as circles) and the tour (as lines):" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def plot_tour(tour): \n", " \"Plot the cities as circles and the tour as lines between them.\"\n", " plot_lines(list(tour) + [tour[0]])\n", " \n", "def plot_lines(points, style='bo-'):\n", " \"Plot lines to connect a series of points.\"\n", " plt.plot([p.x for p in points], [p.y for p in points], style)\n", " plt.axis('scaled'); plt.axis('off')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEACAYAAABfxaZOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGtFJREFUeJzt3Xm0nfO9x/H3FzFFj0QNyakhBEk0hjaoGIsordsbpW6p\nVqnSWG2Vqik5bteqhBp6W+USZSlKlVvjLdWYFTWPx9yQq5yEGA/HzPf+8Xt298l4pv3s77P383mt\ndVZWstq9P5Hk8/zOb/8Gc3dERKQclogOICIi9aPSFxEpEZW+iEiJqPRFREpEpS8iUiIqfRGRElHp\ni4iUiEpfRKREVPoiIiWi0hcRKRGVvohIiaj0RURKRKUvIlIiKn0RkRJR6YuIlIhKX0SkRFT6IiIl\notIXESkRlb6ISImo9EVESkSlLyJSIip9EZESUemLiJSISl9EpERU+iIiJaLSFxEpEZW+iEiJLBUd\nQKSZmbWMgLFTYXgrzO6A9jb3zlnRuaS8QkvfrGVrGHsBDBsCc96A9n3dO2+PzCRSK6nwJ94A00fC\nYKALmLSFWcsEFb9EMXePeWNr2Rom3gTTB3X7B/EhXLVDoxS/GQahX0sEv79yLfZr0q7wyzHp73dF\nF7DTRe53fguRAIEj/bEXVAsf0o/TB0HnjWbMJL4geiqL7jzHr09yfv1GzhOVZVHvO9+vLzFo3sKH\n9PNhrYgECSz9YUMW/g9i0HvAnjRAmbjjtfvvIc3G7KGNoWvdBUf6czqiMokElv6cN6Br6IL/IDpe\ndeexqFQitdPeBpO2mG9Of2b6dZEYmtMXyVF19c4GG0PLUDhna32IK5HCSh/otnqn9dPw8WB4Ymf3\nJ28MCySSEzOGAv8HrOrOe9F5pLxCl2xmI/p1AMz4E7AhoNKXpuPO62Y8CmwDXB+dR8qrSDtypwFH\nmLFsdBCRnFwH7BIdQsqtMKXvzoPAg8B+wVFE8qLSl3Chc/rzM2M8cDGwnjsfRucRqSUzlgBeAsa5\n83x0Himnwoz0Adz5OzAT2Cc6i0itufMJMAPYOTqLlFehSj8zFTjGjCWjg4jkQFM8EqqIpX8L8Arw\n9eAcInmYAexoxqDoIFJOhSv97GiDqUBbNgcq0jTceYk0hTk+OouUU1FL9TrgA+Cr0UFEcvAXNMUj\nQQpZ+tlofxpptD//iZYijU7z+hKmkKWfuRJYHvhSdBCRGrsLWNuMYdFBpHwKW/rZ8rZpwJToLCK1\n5M5HpONGNKCRuits6WcuBYabsW10EJEa0xSPhCjUjtyFMeO7wF7uGhVJ8zBjDdKxI6u583F0HimP\noo/0AS4ERpnxheggIrXizj+BOcC46CxSLoUvfXc+AE5Cc/vSfDTFI3VX+NLPnAtsasbG0UFEakil\nL3VX+Dn9CjMOBzZ35xvRWURqIbs74mVghDuvReeRcmiUkT7AWcD2ZoyODiJSC9m1ibcBO0VnkfJo\nmNJ3523gVOCY6CwiNaQjGaSuGmZ6B8CMIcA/SNM8z0bnERkoM0YCtwOt2fEjIrlqmJE+gDtvANOB\no6KziNSCOzOBt4GNorNIOTRU6Wd+DexpxurRQURqRKt4pG4arvTdeYW0hPOn0VlEakSlLwtl1jLC\nbMsLzfa4Kf3YMmLAr9lIc/oVZgwHHgPGZJdSiDQsMwaTdue2uvNWdB4phlTwE2+A6SNhMNAFTJoJ\nV01w75zV39dtuJE+gDuzgT8Ah0VnERkod7pIxy3vEJ1FimTzU6qFD+nH6SNh7NSBvGpDln7mJOBA\nM1aKDiJSA5riKTkzljdjZzNOMeNhGD+xWvgVg4FhrQN5n4YtfXeeJ120ckh0FpEauA7YRTfFlYcZ\nS5gxzoyjzbgReAloAzqBSXDzpWlKp7suYE7HgN63Eef0K8xYD7gTGOlOZ3Qekf7Kyv55YII7T0Xn\nkXyYsSZpB/ZOwI7Aq8D1wAzg1u49lub097gVTl+zlnP6DV36AGZcBDzizonRWUQGwoyzgcfc+XV0\nFqkNM1qA7akW/UrADaSivz47Ynsx//+rD4Jb/hNmPZ1G+O1tAyl8aI7S/yzp6rl13HknOo9If5mx\nO3CQu+b2G5UZSwGbUy35TUgf0s8gFf3D2VWwvX29Y4Ch7hxZs4yNXvoAZlwG3ObOqdFZRPrLjBWB\nF4BV3Xk3Oo/0LJuWW49qyX8RmEU2kgf+NpA/SzPOJ037nDvgsJXXbJLSHwdcRZrbfz86j0h/mXEb\ncLw710VnkYUz49Ok+fidSJfbL0V1Xv7GWu4dMuMe4Mfu/L1mr9kMpQ9gxrXAVe6cFZ1FpL/MmEwa\n6R8anUUSM5YBtqI6ml+fdCR2ZTT/RB6H5WXfRbwJrOXO6zV73SYq/S2Bi4D13fkwOo9If5jxeeAP\n7ro3IkpWtmNJo/idSIX/ONV5+buya1zzzvEZ4H53htXydZeq5YtFcudOM54D9gYuiM4j0k8PAUPN\nWNud56LDlIUZrcAEUslPAN4hFfzZwN61HGn3wWjgyVq/aNOUfmYqcIYZF7nzcXQYkb5y5xMz/grs\nTDpGXHKQnXe0HdUpm1bgJlLR/6wg93WMAZ6o9Ys2W+nfDLwG7AFcGpxFpL+uA/4DlX7NmLEk8Hmq\nJb8ZcD+p5A8A7ivgQDGXkX7TzOlXmLErcAKwSV/Ww4oUhRmrkG6IW6Uec8fNyoy1qZb8DqRjDirz\n8rdmV7AWVnY0w4nuzKjl6zbs2TuLcS3wMfBv0UFE+sOducBTpA8QpZfMGGLG18w4w4xnSJuitgOu\nATZ2ZwN3DnXnmqIXfkYj/d4yYw/gSGAL3TsqjciMnwPLuOtq0EUxYxCwBdXR/FjSWVyVpZSPNup3\n+9lGvReBllr/Hpq19JcA2kmbGq6PziPSV2aMB6a7s3F0lqLIllKOolry2wEzqZb87e68F5ewdszY\nHDjTnXG1fu1m+yAX+NcKiGmkY0pV+tKI7gXWMKPVnQEdpdvIss83Kkspd8p+eQbpEqUDsqmwZpTL\nyh1ozjn9ikuAz5ixbXQQkb5y5yPSgGXn6Cz1ZMayZkww40QzHiB9oL038CCp9Nd05wB3/tjEhQ85\nzedDk470If2jMeMXwBTSlmmRRlO5Tet30UHykk3FbkR1JD8eeJT0wDsEuLukO+zHAL/P44Wbck6/\nwoylSSOFPdy5NzqPSF9ku0TbSWfxfBSdp1ay4wUqJT+BdFNUZV7+ZnfeCIxXCGY8Seqtx2r+2s1c\n+gBm/JB0G9Fu0VlE+irdlcqkWp6yWG9mrEA6crhS9KuR7sCoXCQyKyxcAWWD1U5gxTxODS5D6S8H\nPAvs7M4j0XlE+sKME4H33PlZdJbeyna/bkq15MeRPpiujOYfKODu18IwYwPgSnfWz+P1m/mDXACy\nCwx+CUyOziLSD5V5/UIzY6QZk7ILjeYC55CuBvwFsJo727tzvDv3qvB7NJqcVu5AE3+QO5/pwLNm\njNKl09Jg7gBGm7GyO69Eh6kwYyjpaIPKRSLLke5+vQr4UZmXmdbAGHJauQMlKX133jbjNOAYYL/g\nOCK95s4HZtxCKtY/ROXI5pnHU52y2QC4nTRd899Au3a/18xo0mceuWj6Of0KM4aQdu9tqnPKpZGY\ncTAw3p196/ieRir2SslvAzxNdV7+Dl1Nmg8z7gN+4M7dubx+WUofINulu5I7B0dnEemt7LTIu4Dh\neZ4lY8ZqzLv79UOqJX9TkaaXmlX2sO0EVnfnzVzeo2Slvwrp9MIN3XkxOo9Ib2Xrtr/pzgM1fM3l\nSSP4SsmvBdxC9ZLvf2jKpr7MWIO0Ia01r/coxZx+hTtzzfgd8FPgsOg8In1QWcXT79LPdr9uQrXk\nvwA8TCr5g4F7mmkTWIPK7fiFilKN9GGeXY6j3Xk5Oo9Ib5ixCzDZvW9nSZmxJtWS35F0s1xlyuaW\nvKYQpH/MOAQY5c4PcnuPspU+gBlnAG+6c0x0FpHeyDYZvkwPc71mtDDv7teVSUspK7tfn88/rfRX\n1k1PuHNabu9R0tIfQbofc92gW+5F+sSsZQQceAe8+Ro8/jC0t7l3zjJjKWBzqiW/CXA31Xn5hxr1\nIpEyMuNmYJo7N+T2HmUsfQAzzgVmufPz6Cwii5MKf+INMH0kDAa6gJ/MhUMegM9uAfwf1Smbv7nz\nTmBcGQAzZgObufNCbu9R4tJfn7TbcR133orOI7IoZlteCNfvkwq/ogs46A646OvuzInKJrWT7SX6\nJ+mKxNyKuenP3lkU939tNNGafSm44a3zFj6kn7/7gQq/qYwGnsx7mWxpSz9zPPCTbL2ySEHN7kgj\n++66gDk636a55HZFYnelLn132oG/A9+LziKyaO1tMGlmtfi7SD9vb4tMJTWX+xp9KPGcfoUZmwJX\nkFby6CwRKaT0Ye7YqTCsNY3w0+qd6FxSO2ZcDfzOnStyfZ+ylz6AGX8BLnfn7OgsIlJOZjwNTHTP\nd4pHpQ+YsRXpEuL1tQ1dROrNjGWAN4FP5X0RfKnn9CvcuYO01nnv6CwiUkrrkvYN5Vr4oNLvbhow\nObvfU0SknuqycgdU+t3dSPr2avfoICJSOnVZuQMq/X/JNkRMBaZkFxmIiNSLRvpBrsl+3DU0hYiU\nTd1G+lq9Mx8zvk66ZGW8bg0Skbxll9t0Aq3udOb9fhrpL+hyoIV04YSISN7WIN3vkXvhg0p/AdnZ\n4ycA2uIuIvUwmjrN54NKf1EuBtY0Y5voICLS9MZQp/l8UOkvVLYr9wRgSnQWEWl6GukXxAXAZ7MD\n2URE8qKRfhFkJ26ehEb7IpKvuo70tWRzMcxYDngW+JI7j0bnEZHmYsZKwHPAkHotEddIfzHceRf4\nFTA5OouINKW6XJHYnUq/Z2cCE8wYFR1ERJpO3Y5fqFDp98Cdt4DTgKOjs4hI06nb8QsVKv3eOQ34\ndzNGRAcRkaaikX4RufM6cBZwZHQWEWkqdR/pa/VOL5mxCvAUMNadjug8ItLYzFgWeB1oqceNWRUa\n6feSO3OB80kncIqIDNR6wHP1LHxQ6ffVKcB+2ahfRGQg6j6fDyr9PnHnReAS4LDoLCLS8Oo+nw8q\n/f44Efi+GUOjg4hIQ9NIvxG4Mwu4GvhhcBQRaWwhI32t3umHbHfu7cA62eYtEZFey65IfAtYzZ23\n6/neGun3gztPATcCk6KziEhDWhN4rd6FDyr9gTge+El2EqeISF+EzOeDSr/f3HkEuBv4XnQWEWk4\nIfP5oNIfqGnAEWYsHR1ERBqKRvqNyJ17gceBfaOziEhDCRvpa/XOAJmxDXAeMCq7UF1EZLHMmAts\n6M6cer+3RvoD5M7fgBeAvaKziEjxmbEyMAh4KeL9Vfq1MRWYkq29FRFZnNHAE/W8IrE7lVRt3AB0\nArtHBxGRwhtD0Hw+qPRrIntiV0b7Fp1HRAptNEErd0ClX0t/Bgz4SnQQESk0jfSbQTbaPx44VqN9\nEVkMjfSbyGXAEGCH6CAiUjzZsS3DgeeiMqj0a8idj0mj/bboLCJSSOsDMyP39Kj0a+9iYC0ztooO\nIiKFEzqfDyr9mssuOf4FMCU6i4gUTuh8Pqj083I+sKEZ46KDiEihaKTfjNx5HzgFjfZFZF7hI30d\nuJYTM5YHngUmuNMenUdEYpmxJOmKxFXc6YrKoZF+Ttx5B/gVMDk6i4gUwlrA3MjCB5V+3s4EdjJj\nveggIhIu7OKU7lT6OXKnEzgdODo6i4iEC7s4pTuVfv5OA3YzY63oICISSiP9MnDnNeBs4MjoLCIS\nqhAjfa3eqQMzViX9YY91pyM6j4jUV3YI4yvAGHdejsyikX4dZH/IFwCHR2cRkRArk45enxsdRKVf\nP6cA+2f3Y4pIuYwh8IrE7lT6deLOC8ClwKHRWUSk7goxnw8q/Xo7ETjYjCHRQUSkrgqxcgdU+nXl\nznOkaxV/GJ1FROqqMCN9rd6pMzNGA7cB67jzdnQeEcmfGbOAHd2ZGZ1FI/06c+dJ4GZgUnQWEclf\ndvjiqsCs4CiASj/KNODw7L5MEWluo4B/ZNephlPpB3DnEeAe4LvRWUQkd+EXp3Sn0o8zDTjKjKWj\ng4hIrsIvTulOpR/EnXtIT/9vR2cRkdozaxlhtuWFcPgk+OaOZi0jojOBVu+EMmNb4FxgtDsfRecR\nkdpIBT/xBpg+EgYDXcCkmXDVBPfOWZHZNNIP5M5tQAfwjegsIlJLY6dWCx/Sj9NHpl+PpdKPNxWY\nbKY/C5HmMby1WvgVg4FhrRFpulPRxLue9L3fbtFBRKRWZnewwFW4XcCc8KPVVfrBslP3pgFt2Znb\nItLwnj4WJr9bLf7KnH57W2Qq0Ae5hZBN7TwEHO3OtdF5RGRgzDgEnvoOHPAkrDo8jfDb26I/xAWV\nfmGY8Q3SsctbFuHMbRHpHzNGAXcA4915JjrP/DS9Uxx/AlYCto8OIiL9Y8ZSpFvyflbEwgeVfmFk\n53IcD0yJziIi/XYU0AmcGR1kUTS9UyBmDAKeBvZx587oPCLSe2ZsAswAxrnzz+g8i6KRfoG48yHp\ndi2N9kUaiBnLAL8HflrkwgeN9AvHjGWBmcBX3XkgOo+I9MyME0gHq+1e9IUYKv0CMuNQYBt39ojO\nIiKLZ8aWwGXAxu68HJ2nJyr9AjJjMPAssIM7j0XnEZGFy/6tPgQc5c7l0Xl6Q6VfUGZ3ngh/3BNe\nnJW2dBdjY4eIVJlxOrCie+Mckb5UdABZUDqW9Wt7whlrw+C1sy3cW5i1hB/LKiKJGROAicCG0Vn6\nQqt3Cmns1Kzws58X51hWEQEzhpDuwjjAnTei8/SFSr+Qinssq4gAcCrwZ3dmRAfpK03vFFLlWNbu\nxd8FrLOBGZu5c29QMJHSM2M3YCtg4+gs/aGRfiG1t6VjWLsfy3rwTPjKr4ErzbjEjHUDA4qUkhmr\nko5Y+I77AgfmNwSt3imo9GHu2KlpSqd6LGu2ROxQ4DDgYuC4RlgbLNLosvsuLgOeceeo6Dz9pdJv\nUGasArQB+5DmF/+rUUceIo3AjG8DRwKbuvN+dJ7+0vROg3Jnrjs/Br4AbAA8Y8b3s6NdRaSGzFgD\n+CWwbyMXPmik3zTM2JR0WNtngGOAK4t+BohII8imdf4K3OZOwy+bVuk3kewv586k8n8bONKdO2JT\niTQ2Mw4G9ifdavdRdJ6BUuk3ITOWJM31Hwc8CBzjzhOxqUQaT7ZK7i5ga3eejM5TC5rTb0LufOzO\nBcAo4HbgNjN+a4Y2d4n0UjZ4Og+Y2iyFDyr9pubOe+6cAqwPvAE8asZUM1qCo4k0gsOBD4HfRAep\nJZV+CbjzujtHAp8DVgeeNuMQM5YOjiZSSGZsCBwB7O/OJ9F5akmlXyLuPO/OfsCXgC8DT5ixl5n+\nHohUZIOhC4Cj3ZkVHKfm9EFuiZmxA3BS9tMj3bkpMo9IEZhxHOm74q8247JnlX7JZaP8PYHjgadJ\nNwA9EptKJIYZmwP/C2zizuzoPHnQt/Ul584n7lwCjAGuBWaYcb4ZawZHE6krM5YjTev8qFkLH1T6\nknHnA3dOI630eR540IyTzRgaHE2kXk4AHnTn0uggeVLpyzzc6XTnWNIVcCuSVvocYcaywdFEcmPG\n9qRpzh9EZ8mbSl8Wyp0Odw4CtiVdGPGUGftmG1ZEmka2b+Vc4EB3XovOkzd9kCu9YsZWwMmk67yO\nBq5rxpUNUj5mnAO4OwdGZ6kHlb70Wnag226kuc8O0jLP+2JTifSfGbsCpwMbufNWdJ560PSO9Jo7\n7s4VwFjgEuBqMy42Y2RwNJE+M+PTwG+B/cpS+KDSl35w5yN3zgLWAx4H7jHjN9ltXiKN4gzgEndu\njQ5STyp96Td3utw5jrTG30jHOkzJ7vEVKSwz9iKtUJsSnaXeVPoyYO687M6PgC2AjUjLPA/U1Y1S\nRNkR46eSrj58NzpPvemDXKk5MzYjnekzjLTS52qt9JEiyBYjXAPc687PovNEUOlLLrJ/XF8mXd34\nJmmlz52xqaTszDgQmARs4c6H0XkiqPQlV9lmrm8DPwfuI13d+FRsKikjM9YG7gW2c+ex6DxRNKcv\nucqubjyPdHXjXcDtZkw3Y7hZywizLS802+Om9GPLiNCw0rSy02TPA04sc+GDRvpSZ2asBEyGZw+A\nUxxOHpo2+XYBk2bCVRPcO2fFppRmY8ZhwO7AF935ODpPJJW+hDDb+Qq4fDfmWd3ZBfz4YTjnN6Qd\nvx3AbODVZruyTurHjDHAbaR5/JnReaJpSZ0EWWFFFljOPxhYbgiwDdDa7WsFM+Yw74OgY76v2cBr\nWiUk3ZkxiHRG/rEq/ESlL0Fmd6SR/fwj/ftvd2f/7v/L7FjnYcz7IBgObD/fry1nNs8DYf6HQ+Xn\nb+jhUBrHAK8CZ0UHKQpN70iI9KHtxBtg+shazelnNx8NZ8GHQ+t8X0vT83cNHUCnHg6Ny4xxwF+A\nz7nzYnSeolDpS5hU/GOnwrBWmNMB7W31+BA3OyaiNw+HJVj8w6EDmF2mw7oaRfbd4f3A8e5cFJ2n\nSFT6Iotgxqfo3cPhExb+ncL8D4euOv8WSsuMk4G1gT313dq8VPoiA5DtPP4UCz4IFvZw+IDePRxK\ndx5MLZmxDeno743dmRudp2hU+iJ1kD0cVqTnh8Nw4F1693B4v76/i+IzYwXgYeAwd66OzlNEKn2R\nAskeDkPp+eEwDHibxT8cZpMeDh/U93cRx4zpwLLu7BedpahU+iINKDtWYCV6fjisRjrwrqfVSnMa\n/QAyM3YhLc3cyJ03o/MUlUpfpIllD4eV6fnhsArwOj0/HF5y56P6/i56ZsZQ4FHgO+7cGJ2nyFT6\nIlI5DXUVev4wemXgFXr+zGFuPc+4MeNC4PXsMh9ZDJW+iPRadhvaqvT8ncNKwMv0/HB4pT/nKlX3\neAxvhaWXguNWh3XHuvPOAH+LTU+lLyI1l515sxo9f+ewIvASPT8cXq2st1/4bu5DXoD/2UYntPZM\npS8iYcxYmoWfqzT/w2EFqBy6d2grTFtzwXObdrrI/c5v1TN/I9KBayISJltO+nz2tUjzHrr39lkL\nP6F1WGs+KZuLbs4SkcJz5z13ZqV7lh9/mAVOtOgind8kPVHpi0iDaW9LJ7JWir9yQmt7W2SqRqE5\nfRFpOFEntDYDlb6ISIloekdEpERU+iIiJaLSFxEpEZW+iEiJqPRFREpEpS8iUiIqfRGRElHpi4iU\niEpfRKREVPoiIiWi0hcRKRGVvohIiaj0RURKRKUvIlIiKn0RkRJR6YuIlIhKX0SkRFT6IiIlotIX\nESkRlb6ISImo9EVESkSlLyJSIip9EZESUemLiJSISl9EpERU+iIiJfL/HNA+gTSXkdsAAAAASUVO\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_tour(alltours_tsp(Cities(8)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That looks much better! To me, it looks like the shortest possible tour, although I don't have an easy way to prove it. Let's go one step further and define a function, plot_tsp(algorithm, cities) that will take a TSP algorithm (such as alltours_tsp) and a set of cities, apply the algorithm to the cities to get a tour, check that the tour is reasonable, plot the tour, and print information about the length of the tour and the time it took to find it:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def plot_tsp(algorithm, cities):\n", " \"Apply a TSP algorithm to cities, plot the resulting tour, and print information.\"\n", " # Find the solution and time how long it takes\n", " t0 = time.clock()\n", " tour = algorithm(cities)\n", " t1 = time.clock()\n", " assert valid_tour(tour, cities)\n", " plot_tour(tour); plt.show()\n", " print(\"{} city tour with length {:.1f} in {:.3f} secs for {}\"\n", " .format(len(tour), tour_length(tour), t1 - t0, algorithm.__name__))\n", " \n", "def valid_tour(tour, cities):\n", " \"Is tour a valid tour for these cities?\"\n", " return set(tour) == set(cities) and len(tour) == len(cities)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "8 city tour with length 2509.3 in 0.110 secs for alltours_tsp\n" ] } ], "source": [ "plot_tsp(alltours_tsp, Cities(8))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## All Non-Redundant Tours Algorithm (improved alltours_tsp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We said there are *n*! tours of *n* cities, and thus 6 tours of 3 cities:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(alltours({1, 2, 3}))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But this is redundant: (1, 2, 3), (2, 3, 1), and (3, 1, 2) are three ways of describing the same tour. So let's arbitrarily say that all tours must start with the first city in the set of cities. We'll just pull the first city out, and then tack it back on to all the permutations of the rest of the cities. \n", "\n", "While we're re-assembling a tour from the start city and the rest, we'll take the opportunity to construct the tour as a *list* rather than a *tuple*. It doesn't matter much now, but later on we will want to represent *partial* tours, to which we will want to append cities one by one; appending can only be done to lists, not tuples." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def alltours(cities):\n", " \"Return a list of tours, each a permutation of cities, but each one starting with the same city.\"\n", " start = first(cities)\n", " return [[start] + Tour(rest)\n", " for rest in itertools.permutations(cities - {start})]\n", "\n", "def first(collection):\n", " \"Start iterating over collection, and return the first element.\"\n", " return next(iter(collection))\n", "\n", "Tour = list # Tours are implemented as lists of cities" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can verify that for 3 cities there are now only 2 tours (not 6) and for 4 cities there are 6 tours (not 24):" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[[1, 2, 3], [1, 3, 2]]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alltours({1, 2, 3})" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[[1, 2, 3, 4],\n", " [1, 2, 4, 3],\n", " [1, 3, 2, 4],\n", " [1, 3, 4, 2],\n", " [1, 4, 2, 3],\n", " [1, 4, 3, 2]]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alltours({1, 2, 3, 4})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note:** We could say that there is only one tour of three cities, because [1, 2, 3] and [1, 3, 2] are in some sense the same tour, one going clockwise and the other counterclockwise. However, I choose not to do that, for two reasons. First, it would mean we can never handle TSP problems where the distance from A to B is different from B to A. Second, it would complicate the code (if only by a line or two).\n", "\n", "We can verify that calling alltours_tsp(Cities(8)) still works and gives the same tour with the same total distance. But it now runs faster:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\ngg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "8 city tour with length 2509.3 in 0.018 secs for alltours_tsp\n" ] } ], "source": [ "plot_tsp(alltours_tsp, Cities(8))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's try a much harder 10-city tour:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "10 city tour with length 2291.8 in 1.636 secs for alltours_tsp\n" ] } ], "source": [ "plot_tsp(alltours_tsp, Cities(10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Complexity of alltours_tsp\n", "---\n", "\n", "It takes about 2 seconds on my machine to solve this 10-city problem. In general, the function TSP looks at (*n*-1)! tours for an *n*-city problem, and each tour has *n* cities, so the total time required for *n* cities should be roughly proportional to *n*!. This means that the time grows rapidly with the number of cities. *Really* rapidly. This table shows the actual time for solving a 10 city problem, and the exepcted time for solving larger problems:\n", "\n", "\n", "
n expected time for alltours_tsp(Cities(n))\n", "
10Covering 10! tours = 2 secs\n", "
112 secs × 11! / 10! ≈ 22 secs\n", "
122 secs × 12! / 10! ≈ 4 mins\n", "
142 secs × 14! / 10! ≈ 13 hours\n", "
162 secs × 16! / 10! ≈ 200 days\n", "
182 secs × 18! / 10! ≈ 112 years\n", "
252 secs × 25! / 10! ≈ 270 billion years\n", "
\n", "\n", "There must be a better way ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Approximate Algorithms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What if we are willing to settle for a tour that is short, but not guaranteed to be shortest? Then we can save billions of years of compute time: we will show several *approximate* algorithms, which find tours that are typically within 10% of the shortest possible tour, and can handle thousands of cities in a few seconds. (**Note:** There are more sophisticated approximate algorithms that can handle hundreds of thousands of cities and come within 0.01% or better of the shortest possible tour.)\n", "\n", "So how do we come up with an approximate algorithm? Here are two general plans of how to create a tour:\n", "\n", "* **Nearest Neighbor Algorithm**: Make the tour go from a city to its nearest neighbor. Repeat.\n", "* **Greedy Algorithm**: Find the shortest distance between any two cities and include that edge in the tour. Repeat.\n", "\n", "We will expand these ideas into full algorithms.\n", "\n", "In addition, here are four very general strategies that apply not just to TSP, but to any optimization problem. An **optimization problem** is one in which the goal is to find a solution that is best (or near-best) according to some metric,\n", "out of a pool of many candidate solutions. The strategies are:\n", "\n", "* **Repetition Strategy**: Take some algorithm and re-run it multiple times, varying some aspect each time, and take the solution with the best score.\n", "* **Alteration Strategy**: Use some algorithm to create a solution, then make small changes to the solution to improve it.\n", "* **Ensemble Strategy**: Take two or more algorithms, apply all of them to the problem, and pick the best solution.\n", "\n", "And here are two more strategies that work for a wide variety of problems:\n", "\n", "* **Divide and Conquer**: Split the input in half, solve the problem for each half, and then combine the two partial solutions.\n", "\n", "* **Stand on the Shoulders of Giants** *or* **Just Google It**: Find out what others have done in the past, and either copy it or build on it." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Nearest Neighbor Algorithm: nn_tsp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is a description of the nearest neighbor algorithm:\n", "\n", "> **Nearest Neighbor Algorithm:** *Start at any city; at each step extend the tour by moving from the previous city to its nearest neighbor that has not yet been visited.*\n", "\n", "So now, instead of considering all *n*! tours, we are generating a single tour. It takes O(*n*2 ) time to find the tour, because it has *n*-1 steps, and at each step we consider each of the remaining cities.\n", "I implement the algorithm as follows:\n", "\n", "* \"*Start at any city*\": arbitrarily pick the first city. \n", "* \"*extend the tour*\": append to the end of a list of cities.\n", "* \"*by moving from the previous city*\": previous city is tour[-1].\n", "* \"*to its nearest neighbor*\": I will define the function nearest_neighbor.\n", "* \"*that has not yet been visited*\": I will keep a set of unvisited cities.\n", "\n", "That gives us:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def nn_tsp(cities):\n", " \"\"\"Start the tour at the first city; at each step extend the tour \n", " by moving from the previous city to the nearest neighboring city, C,\n", " that has not yet been visited.\"\"\"\n", " start = first(cities)\n", " tour = [start]\n", " unvisited = set(cities - {start})\n", " while unvisited:\n", " C = nearest_neighbor(tour[-1], unvisited)\n", " tour.append(C)\n", " unvisited.remove(C)\n", " return tour\n", "\n", "def nearest_neighbor(A, cities):\n", " \"Find the city in cities that is nearest to city A.\"\n", " return min(cities, key=lambda c: distance(c, A))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note:** In Python, as in the formal mathematical theory of computability, lambda (or λ) is the symbol for *function*, so \"lambda c: distance(c, A)\" means the function of c that computes the distance from c to the city A. \n", "\n", "We can compare the the slow (but optimal) alltours_tsp algorithm to the new fast (but approximate) nn_tsp algorithm:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "10 city tour with length 2291.8 in 1.681 secs for alltours_tsp\n" ] } ], "source": [ "plot_tsp(alltours_tsp, Cities(10))" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "10 city tour with length 2381.4 in 0.000 secs for nn_tsp\n" ] } ], "source": [ "plot_tsp(nn_tsp, Cities(10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So the nearest neighbor algorithm is a lot faster, but it didn't find the shortest tour. To understand where it went wrong, it would be helpful to know what city it started from. I can modify plot_tour by adding one line of code to highlight the start city with a red square:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def plot_tour(tour):\n", " \"Plot the cities as circles and the tour as lines between them. Start city is red square.\"\n", " start = tour[0]\n", " plot_lines(list(tour) + [start])\n", " plot_lines([start], 'rs') # Mark the start city with a red square" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVgAAAEACAYAAAD2sW7aAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAG2dJREFUeJzt3XmUnVWVxuHfhkCAkAIFY1IMBgIhiYWiNmqjoEhoENCg\nKGiDtiLSiGADLYhQiC4rIEPbilOM6FIZbbUFGSMRBAVFcGgoSBhCgmAlAUEIKRkM7v7jnErd1L1V\nqeF+93zD+6yVVasqSd0dMW++u885+5i7IyIizbdB6gJERMpKASsikhEFrIhIRhSwIiIZUcCKiGRE\nASsikhEFrIhIRhSwIiIZUcCKiGREASsikhEFrIhIRhSwIiIZUcCKiGREASsikhEFrIhIRhSwIiIZ\nUcCKiGREASsikhEFrIhIRhSwIiIZUcCKiGREASsikhEFrIhIRhSwIiIZUcCKiGREASsikhEFrIhI\nRhSwIiIZUcCKiGREASsikhEFrIhIRhSwIiIZGZe6gMH8s9n8SbD7M2w+wxk/znh+zURWL34M7vi1\n+9Gp6xMRWZ/cBuwk2P1K2A1WE34wDthtTtqyRESGLbctgmfYfMZIvi4ikje5DVhnfMOn68G+LiKS\nN7kNWOP5NSP5uohI3uQ2YCeyevFIvi4ikje5fbv9GNwxB3iGiTP/wabjjRfWtPFU92NwR+raRESG\nw9w9dQ1DMmMH4CHgSncOTl2PiMhw5bZFUGPj+HFm0ipEREaoKAF7P/AKs7VhKyKSe0UI2PGEkwYP\nAzsnrkVEZNiKELAbAy8Ai1CbQEQKpCgB+zxwLwpYESmQIgTsePQEKyIFVISAVYugwMzapprtcbHZ\nITeGj21TU9ck0iq5PWhQo69FsBiYbsYG7vwjcU0yDCFM5yyEedNgAtALHPNGs7bZ7quWpa1OJHtF\neIIdD7zgzmrgCeAVieuRYevo6g9XCB/nTQtfFym/IgRs3xMsqE1QMFPa+8O1zwRgcnuKakRarQgB\n27fIBQrYglneE9oCtXqBFT0pqhFptSIEbN8iFyhgC6bnTDj9+f6Q7QWOWQLdnSmrEmmVIi1yQQjY\nDyasRUZk2SGw6A7Y9+HQFtj5VXDoee4XLUtdmUgrFCFg61oEZpg7+R4DVnFm7AScAjNf737bQ/Fr\nc4AzzZiv/35SBYVqEbjzOPAP4OVJK5IhmWHAfOAsdx6q+amrCP+oH5CkMJEWK0rAPl/zufqw+Xck\nsDnw5dovxv3LXcAZMYRFSq0IAVvbIgAFbK6ZMQU4GzjKnRcb/JIfA1sC+7S0MJEEihCwtbsIQAGb\nd18F5rtzV6OfjKE7FzijpVWJJFCUgFWLoADMeDfwSkIbYCiXAduasVf2VYmkU4SAVYugAMzYEvgK\n8FF3nhvq17qzhtBG0H5YKbUiBOzAFsEjwBZmbJGoHmnsXOCn7vxymL/++8AMM96QYU0iSRUlYNe2\nCOJK9H3AjGQVyTrMeCvwduBTw/097rwAnIOeYqXEihCwA1sEoDZBbpixKfAt4OPurBrhb/828Doz\nXtP8ykTSK0LADmwRgAI2T84Efu/OT0f6G2Ov9nzg9KZXJZIDRQjY8ay7iwAUsLlgxmsJhwo+MYZv\n801gTzNe2ZyqRPKjCAGrJ9gcMmMccCFwijsrR/t93OkFvgSc1qzaRPKiqAH7ILCdGZskqEeCk4C/\nAN9rwvf6GvAvZuzchO8lkhtFCNi6FoE7fweWgv5CptA/KYt/b8ZUrLg49jXg02P9XiJ5UoSAbfQE\nC2oTJDFgUtbSJn7rC4A5Zkxt4vcUSaooATtwkQsUsKl8hAaTssbKnScJwT3svbQieVeEgG20DxYU\nsC0XJ2WdxeCTssbqi8BhZmyTwfcWabkiBKxaBPkx5KSssYoD1b8LnJzF9xdpNXPP980dZqwCth14\nSsiMCcDjwMSMnqakRpyUdRaw2/qGuYzxddqBbmDmWLZ/ieRBEZ5gG7YI4v7Jx0GLIlkbyaSssXKn\nhzDO8KQsX0ekFXIdsHHFerAWAahN0CrnAleOYFLWWJ0DHGXGVi16PZFM5DpgCRfkrYkTtBpRwGas\nZlLWqa16TXf+BPwv8B+tek2RLOQ9YAfbQdBHAZuhMU7KGqsvAMdq7q8UWd4Ddqj2AChgszbqSVlj\n5c4S4FrguFa/tkiz5HoXQdx3+Qd3Jg/y81sBS4CXNOPIpoBZ21To6IJp02HqrvD4nu7z7kxTCzOA\nW4Ad3VmdogaRsSj0E6w7T8SfbxjAMjIhXOcshBsOh4t2h1M3gd7Lw9dbz53FwE3Ax1K8vshYFTpg\no0XArBbUUgG7dsG8aTAhfj6B8HnH+m6JzdJc4KTYDxYplLwHbKNh2wOpDztGZmxmxsfgLe/qD9c+\nE4DJ7SnqAoinxm4HPpqqBpHRynvADvcJVgE7Cma0mzEXeBjYDxbfCr0DflUvsKKn9dWtows4xYzx\niesQGREFbAWZsZsZ3yMcSW0D/tmdg2Hh0XDMkv6Q7SV83p305ld37gTuBj6Usg6RkRqXuoD1UIug\nSczYADiAcAR1OuHo6wnu/LXv17ivWmbWNhuWdIW2wIoe6O50X7UsTdXr6AIuNuM7ceC6SO7lPWCH\n8wT7KLC5GVu681QLaioUMzYD/g04AVgN/Bfww8FCKobpES0rcJjcudWMpcDhhIlbIrlX+BZB3P+6\nGD3FrqO+v8pHgX9y59ICPwF2AaeZsWHqQkSGI+8BO5wWAahNsNZg/VV3binBYYybCBPUDk1diMhw\n5D1gh9MigIoHrBkbmHGQGTcCVwP3AtPcOd6dBxOX1zTxH4jPA6fHnrJIruX9/6TrG/bSp5IB279/\nlUXA54ALgR3cOad28apkFgDPAgenLkRkffIesINdeDhQpQK2pP3VYYlPsV1AZ5wXLJJbRQjY4TzB\nLgHay36csuT91ZG4irAD5oDUhYgMJbcBGwaMHHkkfOIgsz0uHmrgiDtrgIcI+ztLpSr91ZGIA9i7\ngDP0FCt5lstxhf1TnfoGj/SdKLpy9mCb3s34EfAjdy5vYamZGen+1aqJW7XuAY5zZ2HqekQayekT\nbMdopjqVog9b5f7qSMSbhOcCZ6SuRWQwOQ3YKe2Npzrt9kYzOgZ5W1jogFV/dVQuA7Y1Y6/UhYg0\nktOAXd7TeKoTLxIWOB42Y54Z7zBbm8SFC1j1V8cm9t7PBpIOoxEZTOF6sLDqYWAGYQX5AOD1wG3A\nL4CzgI3iX7zcUn+1eczYGHgQeK87t6euR6RWLgMWau+GGnqqkxltwGxC2H4kfvnLhAvzbnYf1j7a\nljCjHfg4cDRwK/BF4JdqAYyNGR8H9nfnHalrEamV24AdDTOuA35NaCUcAHQQnmyvBa5z50+J6toN\nOBF4B3AJ8GW1AJrHjE0I2/QOdOcPqesR6ZPTHuyo3Qs8785cd94E7AhcDuwJ/N6Mu834ghl7mbFR\nloWov9o67jwHnA+cnroWkVple4I9Cnize/3k+7hvcnfCk+2BhPC9AbgGuN6dlU2qQf3VBOJi50PA\n29y5J3U9IlC+gH0T8EV33jCMXzsF2J8QuLMJCyXXEgL3znhaaCSvrf5qYmZ8Guhw5/DUtYhA+QL2\npcBSYMuRBFtsF7yJ/p0Jk4DrCYG7oG8yVf/C25T2sJWsuxNWbYn6q7kQFzyXAHu480DqekRKFbAA\nZqwEXuvOn8fwPaYCbyeE7VuA/4Pbfg0Xvg++sl3/1rHTnoVPPA3TvgTML/GIwMIw47PA9u4cmboW\nkTIG7C+ArmadT48r1G+FY78E5+2y7gmzXmC/S91/pbekORHfxTwAvM6dZYnLabpG76JycimlNFC2\nXQQQTnTNatY3c+c5d66HlT2Nj+9OmtKs15Kxc+dJYD7wqdS1NFv/AZwbDocf7x0+zlk41KQ5Saus\nAZvBkdnBju+u6Gn+a8kYfRE4zIxtUhfSXKMagiQJKWCHrbszHNftC9m+47vdOgefM+48Trja++TE\npTRNuIPsla9p/C5qcnuKmmT9xqUuIAOZBKz7qmVmbbNhyXqP70ounA90m3F2s/Y4p2LG3sD58JJJ\n4R/2gesAz2hxNafKuMhlwNPA1NiPk4oy42vAavdi9mPNmAWcS1hT+DS03V4/BOmTT8B/9sJOe7vz\nUNKCpU7pAhbAjN8CJ7pza+paJB0ztgf+AEx354nU9QxXPATzOcLNuWcDX+8bWtRoCBKs2p8wsnF/\nd7qTFS51yhqw3yOcorowdS2SlhnfApa785nUtayPGZsDnwSOB74DnDXcvdVm/Cthce+d7vw2uypl\nJMq4yAVhsEqhhm9LZr4AHGvGFqkLGYwZ48w4Grgf2Jmwh/fkkRxccedSwvVCV8eereRAWQO2cLcb\nSDbcWUI48nxc6loGMsPMOAi4C3g/4enz8NEekHDnKuBQ4Admmo2bB2VtEewM/MydHVLXIumZMQO4\nBdjRndWp6wEw43WEnQ4vB04BrmnWYCAzdidcrXRSfLKVRMr6BLsUmBxHB0rFubMYuAn4WOpazJhq\nxiWEALwMeJU7Vzdz6po7dwD7AOeYpf8zV1kpAzbeyfUgsEvqWiQ35gInmbFpihc34yVmnAf8jjAr\nYbo787O6Py7OxH0L8EkzTs3iNWT9ShmwkfqwspY7dwG3ExaCWsaM8WacCNwHbEGYV/vZVrQq4r7Y\nPYEj4k0eja67lwwpYKVKuoBTzBif9QvFBazDCDta9gH2dudod5Zn/dq13OkhPMm+DfhGvNlDWkQB\nK5Xhzp3A3VB/pVAzmbEn8BvC4tVR7hyU8hqbeMhiH0LL7KKs76OTfgpYqZou4NQsQsaMXcy4ArgI\nuADY3Z2bmv06o+HOM4QB8psDP0nVi66aMgfs/cCOZqUcaCOjFI9PL4Xm3dtlxiQzvg78inAf2wx3\nLhnpvW5Zc+dZ4BDCrI7r4hU7kqHSBmz8P1MPMC11LZI7XcBpY+1HmrGZGZ3E6+IJwXpevEY8l+Lt\nxh8gvMP7uRlbJy6p1EobsJHaBNLITcDjhFNPI2bGhmYcSXiXtCvwBndOLMpAmfhkfSzh2vpbyjeY\nPD8UsFI5cVP/54HTwyDr4TNjP8KErg8Dh7hzWDyOWyjuuDunQRiMZKZ3ellQwEpVLQCeJYwEXC8z\ndjPjZ4TFq88Ae7lze4b1tYQ75wDnADeb0ZG6nrJRwEolxafYLqBzqA34ZmwXx19eD1xBOChwRTOP\ntqbmzjcJ1+ssNOP1qespkyoE7AydYJFBXEW4NumAgT9hxhZmnA38EXiEcLT163GRqHTcuQw4Co07\nbKpSB6w7TwGrgW1T1yL5ExZ7rv0mnPJds0NuNNvjYrPpO5lxHGEB6+XAq93pdGdV4nIz587V9I87\nfGfqesqgCntE+9oEj6QuRPIlXL8y50SYtzVM2DvccdV5KNx7G8zaN84vqBR3fmHGgcBVZrS5c3Hq\nmoqs1E+wkfqwMoiOrv4LBCF87NoIjnq0iuHap2bc4dlmHJu6niKryhOsVkelgSnt616BDeHzye0p\nqskTd+4xYy/ghnjdzhfKtLDXKlV5gp2VugjJo+U9oS1Qq5dwW6u4s5Qw7vBw0LjD0ahKwKpFIA10\nd8IxS/pDtpfweXdnyqryJI5XfAvwVmCexh2OTCnv5KoV/9V9Cpjmzl9S1yP5Eha6OrpCW2BFD3R3\nuq9alrquvDFjInAlsBL4YFm3qzVb6QMWwIzfACe788vUtYgUlRmbAP8DbAi8152/JS4p96rQIgC1\nCUTGLE4JOwT4Kxp3OCwKWBEZttga+CDQDdyocYdDU8CKyIjEcYfHEQbmaNzhEKqwDxYUsCJNFffE\nnm7G08CvzNjXnQdT15U3VVnk2pAwk+BlrbguWaRKzDgaOBPY3527U9eTJ5VoEbjzIvAA4VZNEWki\nd+YD/0kYd/iG1PXkSSUCNlKbQCQj7lwOHEkYd7hP6nryQgErIk3hzjXAe4DLzJiTup48UMCKSNO4\nczNhgPk8Mz6Qup7UqrKLABSwIi3hzp2xTbAgzpT9WuqaUqnELgJYe8zvKWCizlGLZM+MHQhXg38H\nOLuK4w4r0yKIx/weAXZKXYtIFdSMO3w/cG4Vxx1WJmAjtQlEWqhm3OFewPyqjTtUwIpIptx5EpgN\n7AhcasbGiUtqGQWsiGTOnWeAA4FNgCvM2CxxSS2hgBWRlojrIO8BngSuj3d9lVrVAnYxsItZ5f7c\nIrlQM+7wLsK4w5clLilTlQoad54Gnga2S12LSFXFcYfHA9cRxh1um7ikzFQqYCO1CUQSc8fd6STs\nkf2lWTm3TypgRSQZd84DzgJuNuNVqetptiodle2zCNgtdREiErjzLTNWATeYMced36SuqVn0BCsi\nybnzA+DDwFVmzE5dT7NUNWBnVfHYnkieuXMt4dbaS804OHU9zVDFgF1J+HOXenuISBG5cwvwduAb\nZRh3WLkerDtutrZN8FjqekRkXe78zoy3EcYdbunOV1LXNFpVfIIF9WFFcs2dRYQBMf9hRmdRW3oK\nWBHJJXeWEcYdHgacV8SQVcCKSG7VjDt8M/Ctoo07VMCKSK7VjDvcgXChYmHGHVY1YB8GtjJjYupC\nRGT93FlNGHe4MXBlUcYdVjJg3XkRuB+YkboWERmemnGHjxN2GOR+3GElAzZSm0CkYNxZA3wI+CNw\nkxmT0lY0NAWsiBRKHHf4CeAawrjD3I4fVcCKSOHEcYdnABcSxh3unLqmRip3kquGAlak4Nw534yn\nCeMO93fnrtQ11TJ3T11DEmaMJ9xu0ObOC6nrEZHRM+Mw4ALgYHd+nbqePpVtEbjzPPAnyOdbCxEZ\nvppxhz/N07jDygZspDaBSEkMGHf4rtT1QLV7sKCAFSkVd24x4+3A1Wa0ufO9lPUoYGG/1EWISPPE\ncYd7Az8zYwt3LkhVi1oEeoIVKR13FhPGHR5vxhmpJnFVdhcBgBltwHJgYty8LCIlYsZk4GfADcAn\n3Wlp4FX6CdadVcBfgVekrkVEms+dFcBbgT1IMO6w0gEbqU0gUmJx3OG+wFTg8rgHviUUsApYkdKL\n4w4PAjYijDuc0IrXVcAqYEUqoWbc4Upggdkhu5rtcbHZITeGj21Tm/2aVd+mBXAvcETqIkQke+6s\nMePD8Ptvw3Z3wPfHwwSgFzjmjWZts91XLWvW6+kJNj7BFvFCNREZubBj6LiNYG4MVwgf502Djq5m\nvpYCNkxHd8j34F4RaaYp7dS1YScAk9ub+SqVD9i4L24RMCt1LSLSKit6QlugVm/8evNUPmAjLXSJ\nVIQZ4+Abm8Fpz/aHbC9wzBLo7mzqa1X5JBdAWDl8z49h4iS442bo7mxmk1tE8iNe+X0psDnseQK8\n2BnaAit6svi7X+mADeE6Z2Fobq9dSVwCVzZ1JVFE0jNjU+BHwAvA++JM6ExVvEXQ0dUfrtC/knjg\n982YEd5KiEjRmbE5cDXhFpNDWxGuUPl9sIOtJG4zk/Afo92M+4Fu4O74sRv4U6uHRojI6JixBXAt\nYa3l3915sVWvXfGAXR5XEmtDthe4bYE7R8TjdDOBXYEOwlXBHcBEM+5hQPC681hLyxeRIZmxNbAA\nuBU4odVT89SDHUUP1oyXEoK29seuwN/pf8rtC9574tQuEWmhOKpwIXAVcFqKd52VDljoC9mOrrGu\nJMaTYFPoD9u+4J0F/IX64F0cz0aLSJOZsR0hXC8C5qZq6VU+YLMW509OZd3Q7QCmAQ9TH7xL3FmT\npFiREjBjGiFcL3Dnv5PWooBNI+7Hm0598E4B7qN+Ye0RLayJDM2MGYTbC+a6My95PQrYfInbSWoX\n1vp+TICGC2uPJypVJFfMeDVwHXCqO99PXQ8oYAvDjK2AV1IfvC/QeGHtmUSlirScGa8nLGYd584P\nU9fTRwFbYHFhrZ36hbWZhClhA9sMi1u1wVqkVczYE/gxcKQ7V6eup5YCtoTiwtoO1AfvjsAyGi+s\ntWzztUizmLEvcAnwfnd+nrqegRSwFRIve5tOffBOBhZT/8T7qBbWJK/MeCdwIfBud36Vup5GFLDS\nt7A2i/r+7mbUP+12u/OXRKWKAGDGYcCXgYPcuTN1PYNRwMqg4jHDRgtrz1EfvPdqYU1awYwPAWcB\n+7lzd+JyhqSAlRGJC2vb0HhhbSX1wXufFtakWcw4FjgV2Ned+1LXsz4KWGmKuLC2I/XBuwOwlPr+\n7kNaWJORMONk4GPAPu4sTV3PcChgJVNxYW0X6oN3Eo0X1v6shTWpFd81fQZ4PzDbnUcTlzRsClhJ\nwoyJhIW1gcG7CY0X1p5IVKokFMP1HGB/QltgZeKSRkQBK7lixssIC2sDg/dvNF5YW52oVMmYGRsA\nXwF2B/Z358nEJY2YAlZyLz7FbMu6s3c7gBnAChovrL2QplpphtjTvxDYCTiwqDOVFbBSWPEv4TTq\ng3cq8BD1/d2lWljLPzM2Isxx3Qo42H3t3dqFo4CV0jFjExovrL2McC/TwODt0cJaPsT/dj8gXMj6\n3qIPpVfASmWY0Ub/wlpt+G5M44W1wvX8isyMzYArgKeAw935e+KSxkwBK5VnxiQaL6ytpvHCWmHf\nsuZV/MfvakJr56iy3OqhgBVpIC6sbUf90+4uwHLq2wz3a2FtdOIlotcBvyPMc23pza9ZUsCKjIAZ\n42i8sPYKYAmNF9ZKExjNFt893BB/nFy2XrgCVqQJ4uLMDOqDdysaL6wtL1uYjJQZ2xAuJ/wB8Lky\n/u+hgBXJkBlbUL+wtiuwIY0X1v6aqNSWMmMq8HPgm+6cm7iczChgRRKIb41rR0DuSlhoe4b6p91F\nZVpYM2M6oSVwnjtfTV1PlhSwIjkRF9a2pz54dwH+TP0T7/1F28pkRgewADjDne+kridrCliRnIsL\naztR39/dHniQ+ifeZXlcWDPjdcA1wAnuXJ66nlZQwIoUlBmb0nhh7aXAvdQH74pUC0lm7AH8BDja\nnStT1JCCAlakZOLCWt/BidqFNaO+zXBP1gtrZrwNuBz4gDsLsnytvFHAilRA7O8OtrD2NI0X1v7W\nhNc9APguYa7AzWP9fkWjgBWpsDhztdHC2nTgUeqD94GhFtbM2qZCRxdMaYeNx8HcmbDjQe7cnvEf\nJZcUsCJSJ44MrF1Y6wve7YAHqA/eh6Fte5izEOZNgwlAL3D8I/CjvdxXLUvwx0hOASsiwxYX1mZS\nH7xbwinPwZlbh3Dt0wvse4n7bUe0vtr0xqUuQESKw51ngd/HH2uZsSWs/DlM2Hrd3zEBmNzesgJz\nZoPUBYhI8bnzFDywiLoDZ73Aip4UNeWBAlZEmqS7E45Z0h+yvYTPuztTVpWSerAi0jT9uwgmt4cn\n1+7Oqi5wgQJWRCQzahGIiGREASsikhEFrIhIRhSwIiIZUcCKiGREASsikhEFrIhIRhSwIiIZUcCK\niGREASsikhEFrIhIRhSwIiIZUcCKiGREASsikhEFrIhIRhSwIiIZUcCKiGREASsikhEFrIhIRhSw\nIiIZUcCKiGREASsikhEFrIhIRv4fFiVKSewtlOQAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "10 city tour with length 2381.4 in 0.000 secs for nn_tsp\n" ] } ], "source": [ "plot_tsp(nn_tsp, Cities(10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that the tour moves clockwise from the start city, and mostly makes good decisions, but not optimal ones.\n", "\n", "We can compare the performance of these two algorithms on, say, eleven different sets of cities instead of just one:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[1.0,\n", " 1.0,\n", " 1.0,\n", " 1.0,\n", " 1.0118279018107388,\n", " 1.0121039193389436,\n", " 1.107851821362778,\n", " 1.139713084817861,\n", " 1.1531140497779002,\n", " 1.1972133336642432,\n", " 1.2160497559961319]" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def length_ratio(cities): \n", " \"The ratio of the tour lengths for nn_tsp and alltours_tsp algorithms.\"\n", " return tour_length(nn_tsp(cities)) / tour_length(alltours_tsp(cities))\n", "\n", "sorted(length_ratio(Cities(8, seed=i*i)) for i in range(11))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ratio of 1.0 means the two algorithms got the same (optimal) result; that happened 4 times out of 10. The other times, we see that the nn_tsp produces a longer tour, by anything up to 21% worse, with a median of 1% worse.\n", "\n", "But more important than that 1% (or even 21%) difference is that the nearest neighbor algorithm can quickly tackle problems that the all tours algorithm can't touch in the lifetime of the universe. Finding a tour of 1000 cities takes well under a second:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "1000 city tour with length 21275.9 in 0.145 secs for nn_tsp\n" ] } ], "source": [ "plot_tsp(nn_tsp, Cities(1000))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Can we do better? Can we combine the speed of the nearest neighbor algorithm with the optimality of the all tours algorithm? \n", "\n", "Let's consider where nn_tsp can go wrong. At the end of plot_tsp(nn_tsp, Cities(10)), we see a very long edge, because there are no remaining cities near by. In a way, this just seems like bad luck—we started in a place that left us with no good choices at the end. Just as with buying lottery tickets, we could improve our chance of winning by trying more often; in other words, by using the **repetition strategy**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Repeated Nearest Neighbor Algorithm: repeated_nn_tsp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is an easy way to apply the **repetition** strategy to improve **nearest neighbors**:\n", "\n", "> **Repeated Nearest Neighbor Algorithm:** *For each of the cities, run the nearest neighbor algorithm with that city as the starting point, and choose the resulting tour with the shortest total distance.*\n", "\n", "So, with *n* cities we could run the nn_tsp algorithm *n* times, regrettably making the total run time *n* times longer, but hopefully making at least one of the *n* tours shorter. \n", "\n", "To implement repeated_nn_tsp we just take the shortest tour over all starting cities:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def repeated_nn_tsp(cities):\n", " \"Repeat the nn_tsp algorithm starting from each city; return the shortest tour.\"\n", " return shortest_tour(nn_tsp(cities, start) \n", " for start in cities)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To do that requires a modification of nn_tsp so that the start city can be specified as an optional argument:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def nn_tsp(cities, start=None):\n", " \"\"\"Start the tour at the first city; at each step extend the tour \n", " by moving from the previous city to its nearest neighbor \n", " that has not yet been visited.\"\"\"\n", " if start is None: start = first(cities)\n", " tour = [start]\n", " unvisited = set(cities - {start})\n", " while unvisited:\n", " C = nearest_neighbor(tour[-1], unvisited)\n", " tour.append(C)\n", " unvisited.remove(C)\n", " return tour" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nFBH/D6i9NWsGaMGjAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "100 city tour with length 6734.1 in 0.002 secs for nn_tsp\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "100 city tour with length 5912.6 in 0.157 secs for repeated_nn_tsp\n" ] } ], "source": [ "# Compare nn_tsp to repeated_nn_tsp\n", "plot_tsp(nn_tsp, Cities(100))\n", "plot_tsp(repeated_nn_tsp, Cities(100))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that repeated_nn_tsp does indeed take longer to run, and yields a tour that is shorter. \n", "\n", "Let's try again with a smaller map that makes it easier to visualize the tours:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "10 city tour with length 2381.4 in 0.000 secs for nn_tsp\n" ] }, { "data": { "image/png": "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\nSEoUsCIiKfl/otWLcOBvkAEAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "10 city tour with length 2297.7 in 0.000 secs for repeated_nn_tsp\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "10 city tour with length 2291.8 in 1.619 secs for alltours_tsp\n" ] } ], "source": [ "for f in [nn_tsp, repeated_nn_tsp, alltours_tsp]:\n", " plot_tsp(f, Cities(10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This time the repeated_nn_tsp gives us a tour that is better than nn_tsp, but not quite optimal. So, it looks like repetition is helping. But if I want to tackle 1000 cities, I don't really want the run time to be 1000 times slower. I'd like a way to moderate the repetition—to repeat the nn_tsp starting from *a sample* of the cities but not *all* the cities.\n", "\n", "# Sampled Repeated Nearest Neighbor Algorithm: revised repeated_nn_tsp\n", "\n", "\n", "We can give repeated_nn_tsp an optional argument specifying the number of different cities to try starting from. We will implement the function sample to draw a random sample of the specified size from all the cities. Most of the work is done by the standard library function random.sample. What our sample adds is the same thing we did with the function Cities: we ensure that the function returns the same result each time for the same arguments, but can return different results if a seed parameter is passed in. (In addition, if the sample size, k is None or is larger than the population, then return the whole population.)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def repeated_nn_tsp(cities, repetitions=100):\n", " \"Repeat the nn_tsp algorithm starting from specified number of cities; return the shortest tour.\"\n", " return shortest_tour(nn_tsp(cities, start) \n", " for start in sample(cities, repetitions))\n", "\n", "def sample(population, k, seed=42):\n", " \"Return a list of k elements sampled from population. Set random.seed with seed.\"\n", " if k is None or k > len(population): \n", " return population\n", " random.seed(len(population) * k * seed)\n", " return random.sample(population, k)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's compare with 1, 10, and 100 starting cities on a 300 city map:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def repeat_10_nn_tsp(cities): return repeated_nn_tsp(cities, 10)\n", "def repeat_100_nn_tsp(cities): return repeated_nn_tsp(cities, 100)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "299 city tour with length 12752.7 in 0.014 secs for nn_tsp\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "299 city tour with length 12070.6 in 0.127 secs for repeat_10_nn_tsp\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEACAYAAABfxaZOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXm8TlX3wL8boQwVDaRyRYNSKalIoQylQRqNoRQqQqNc\naVBvr7fprbdSb2/1K9GseaI0UdHsonC5JDPV5aKS9ftjn9tzn+c553nOc55zzj4Pz/p89od77zl7\nr732OmuvvdbaaykRIQ95yEMe8rBjQCXTCOQhD3nIQx7Cg7zQz0Me8pCHHQjyQj8PechDHnYgyAv9\nPOQhD3nYgSAv9POQhzzkYQeCvNDPQx7ykIcdCPJCPw95yEMediDIC/085CEPediBIC/085CHPORh\nB4K80M9DHvKQhx0I8kI/D3nIQx52IIi00FeqdoFSfRYqVSZKIfrfPguVql0QPi7spRRDlLr+N41L\nYjtjtQm8/ARN79YTlDr3A/1vbs8nFUSJt5xAr0FZAp+ViVKtJ7jvw35Nleox3Z6Pz50W2IR8gFxY\nt8iDiES2QasJsFFAKrSNAic9G874UgOkF8hbIL+CTIDz3rfH6UyBs0ugVoFpunmba60C6L0wNreN\non/Ozfl4561WE0zjFsPxnA/i8Stvw1eC3AkyGOR0kMNBartb0wHLYc5UGP27/fxHbQK5A6Rxcl+t\nJmicWk0wxRe5sG5Rb1XMbDVuof4+UCPhdzWAk85XipbAbKDI+nc2MF+ErdmMqBRVgI5AL+AMYAYw\nAThfhDKl3i2AAd/DY7U0LmXAGOCfwMSGsGos0DsbHMIErSE1GwstOsD4vWP0rgGMbwzFOTUf9+DE\nWw32NYGNPaxYrvmrIp5lwKqFQClwJHAWsD/QUCm2AkuApfrf81rDA43j1/S++jCwBH5uDotf12tc\nzseDiqH5IKAL8LlSfA88Bsd8BV3fSnj2eKVqdxApLQmYCAngtG4t2ylFX2AW8KMIf4WLV+5AZIW+\nJYwKoBDYCegHNEQz3LRngduAw612ITAWaKAU84ltAuXtZxEkoe+xmoFWLIeiQijdCy3cLgQWA88A\nI0RYXREvkdISpTrPhrtawza0hWyIhVsloN4+QdAjCNB06DpVf8zjsP+Ycmc+mYGTQG3aSikeBB4W\nocgMbuVQVAiDW8HDB8QL5td7i1BS8UmlUMDuaEbcX/9b8yz7Nd20RWTaPKVqd9Cber19YOVyKCoU\neboEmKoUI4GzgQFw2hNwQ7VoKARO67ZhFXAqMBrYSym+Qm8AM61/l1aUATs0mD5q2B/h7I6lVwvM\nTWlysMwxLUEuBrkXZCrIKpBfQD4BeQimFcLFy+L7HvYHLFgMMgbkQO9HzMKcOmbGz+Nm2ZGOzc7m\nrGHHgdwMshzkY5DuIFXN4NdqAvSeB2dsho7TMzWr+GUKgR4z7M1M3T6IzrrF6AJSF6QzSCHIayAr\nQFaDvGF9411A9jTNg6aacQTsF9aRWRd5sSWC7AVyMshVcMWCbD8EzXg9S+IZb3jO2fTjbcYl1sZa\ncU5XboADm5jGM7j51yqAU1+FkZsSBSrITiDngbxvCY2xIPuHh1f2/hX/+omWHV3Pa1QZdHe1EYIo\nkH1BzgH5h6UM/gqyGOR5kGtA2oLUMs2TodDPNAL2i+TkwMpes/Crb6jVBtqth65/QdtNcMQ7uSTw\n9RwSP+YS67Ry1lZo9SrMed/SlKqbxjU4GkgByJI0zzQF+TfIOpBXQDqBVHLBIwVenJ9+CtkYDt08\nO2DtN48rSk0pBCBVQf4AqZJFH5VADgbpDXI/yGcgZSBFIE+AXA5yjIlTXuD0M42A/YIEp1n40ff2\nEumi59G91N6M1mqC9XE9a2m7NU3jGwwNpB7ISpfP1gC5FORbkAUgI0Dq+M0jQSo92fFK+eZx0iSY\n84GlEOxsYM0apduovfV7YBM4400Y+IO2CMyfZ20EM0H+A9IX5FA3G36Um3EE7IkfnFD1o++oHXe9\n00LqQb8V2p5/k+h/S+IEDEhlkP9amtDupnEOgAa7g/yS4TsKpBXI02h/0eMgx8TzWKtFXnnEmb/O\ne980vSrQYCeQZ9B+j11DHrstyCf+9ukkF9o1BWljbfCTQBaC/AYyDWQc2gTYEESZXhPXczWNQOpF\naDUBuhXBmVug6wy/4oOzPfJGURNLP9eYiQFkV5Dbtbli0Nx0wskScveAfAeyt+k5+Usf2QVkcxbv\n7wlyPdo+PBOmXAN9imGUDX+IwOULQfZJv2aJAuiS5VawwasgB5immzX3SiAPWCefeiGO2wfkGX/7\ndK/I4cFRHJV7DiIRFvoxQvUpjpoZJVc0fXvhMXAtFK+1tNP93Z58LME/BuRHQnJohkMjqQyyLVtN\nzeqnCwy3IsOcoqFOK4VFv1oC4hwcbMZ2iglINZCRerOWW0B2iQD9FMhNlgYcymYEMgrkH97ft1OE\nen5uv0kXbgX5GeQHkFmWhv+adcp5BOQudLTXvSDvgJRUeH8xyPPwye3JEYPm5JhRhkm/ONEUrvaC\nsnsp1Gpjmmbu6Hfaa8nzcXfyARluMXba0NZcaSBbQXbyp69O07XAv0qgv8TzSLm/pE8xvDsC5ENL\nQ7wHpFn8WjhrhCD7gTxnrUO3bDcsn2h4OcgykCNCGOsRkMHe3rX7dodugmFb7L+Vds9Z9D4U5FiQ\nU0C6oh3Ag0CuBbnVWsP/ok1Ab1hr+xXIfH3LOTpyzCijxBbBnsmh9xf2u695M4qO3um0UR/jb5Z0\ndwjM4HjBJ0HQD2SApf0E/oGHQycpwwdHdbJjfK5AO4nxSEnSBw/SBB0Ougx+/BYuW+1WI0SHIc8B\neQ/kkAjQsTv6XswJAY/zNsjp3t51UoRavBKcHzFa5mDDTOKkMddrCzIaCjeHuUO6tbuB1IMLP4rS\n7p2AX1WQN4O8cAVyofWBH2d6vtmv+ejf4YKPs7W12gsUJ9t+/AcPUjk+r1OJtVGMklT3U9AO1WEg\na9CORaOx5iCnWrh0CXCMOSCHe3u3+3Sn9fAjvNU9X+ygmr4zMc7YCnOmwdXHhxUa6WzbbtgYpLl1\nfJ0AUgyyHq5ea3r3dnDS3h7D5fP7gqQfOtnXapB2JvnI/zX3Rh97jc79xht73+6iXGq8tCIiT+oT\ng/TEoMkHHdm0CqRXAH0rkA14iBgC6WjC1BK1EG8jTBEjhtOxZ5TEjr/B7L7JuDhtQKP/AJkL8hjI\nJeiLOpVM797OqSpKBORlLBt1jH4DiuDqFX7TD6SdJfjPMMlLGeBbFeQIkN4wcI6fa2jPE3Ml+S6E\n/Qcfe9/7CQ2kNcjX6FBKY+Y3kMNAfgIZ6nO/u4P8muE7ldFBCD/DxB4mBHBYcswVLqYG1oRwEpw3\nh6oxa1ycNqDzP3ZeRHO7tzPt2tqmnbaE3QqQpv7jIsdamt2F4a5ZKn+QKLQD7nSQG0AmgswG2Qwy\nD+Q5uLzYz9NaCp5o4+aDj73vZBIqz7+T1vxYGWSgtSb3Y+h+Bfq283y0o9OXkwf61P29e75o/wLM\n/RjtWK0f/3fzAtjIuhgdPOWN0LPeDheXzDV3k8zjxTkEchvIA8HgI4drTUoGhMc7iQL2stXw9f9Z\nWu4vICvRTs670bcpj6bCDdIgTmvZ3wFxutg1V+CiPzM0+dQFediiwyX6hBpuvDg679XXIA+BVPah\nv7NA3siMLwavh4aNsx17e2nmEaBWG+hQGh8FM2CFFUs+3C8NwQUekbK7pcfXyyYl+4KsJyBnH8iB\n6DDCEebm3+9LdFjdXrm65vZ4ddiQhcnnaJAZ8MM3cPFP4Zs2pLalaT9LFrlsNF36zoSrljmHswaZ\nwiU6F6yymodpBOKJGXcR5QB0zovXcMhvEhwehVuh3fNRXlSvAgvkJTzGOLvDS/ZDX+C6OagNG6SZ\nX470qB71k/HqmlV6Y63l95phyg8FUh1kMsi7IDW80cPNJcJgwiOjqiB4motpBNIwSlX0pYclBBz7\nmzDuZyAnmp5/ejwzF1jo2O6iIE9QIHujr+bf4+c41obyBMgq6DsrSmFwwa+1H4kCzcaLg1RB3wT/\nHKRuEPN3fq79C6bpH5VmHAGXzHKW/tDlBkLIcIe+WReYNmyYlgodjdQ24HF2tzbP/5KlLdfqaxw6\n/cDtILtuT5qXOxrUKtDpjL3PNwqCy+K/cehY+33dv+duw3Kw6f8CC1eQRWgxnP+xyQ3TzxbZcokV\nQYTXlOJbYBLQTikukoQyhj5DEboM43YHIohSPARcAXwU4Di/KEVH4BXgGWvN/sikD6WoDlwJXGf1\nc7gIy/VfS3+zL/cXds3WsKB0JSwW6PoS1K7jbb4t/g2jL4TbqsSXXywqDAjpJBBBgOuUYg3wqVJ0\nEmF++jedyiSuXB7ff2mJHV/AQwcDk5Tiv8Ct4rKWtlLsDFwJB7d0M35OgOldJ0MtYSd05ZtlMOHC\noJwqlgnENlRze2hox9ovIA1CGKs6OjPkm7jMvY4OOexrmfUmE0CYaa41dI4dz1qlZSr9FD67Oyo+\nDHRZ0xUgLdI/60dKdKkHMgVdOnW/NM9WQacb+QnkZRh3SvL4w/6AWY+EYX3wle6mEfDGLC/0heFb\nA7xpuhc6ysV4IqvgaCgPgdwS0ljludc/JEXkkHX07wLyPch0QvTjRL2hE6xdlsX7D6CDIiIloEDO\nRl/ua5/+2VoFcP0v0OsL71XApJJlJl4F0tXhVvu56Kya06iQZiTZh9a7ubWBPEcOVZczjoA3Rgne\nNmkxYsq857nc0DcmlxNSOThLex8PMlN/LEkfWkvrI5unP8btd8P1QLua6JquGTk/K7zfG13pazfT\nc3HAr731vXVz8ewCkIN8GLMVLFwKl/8arzxetQV+LELny0/Lg9ZJ9jlL+Htan9DpbRoBbwt23odB\nO1XQJQI7u38+92J4Lc07tFu0WpOfNR6G/R7/oV25wXK0DSCLuqfba0Pn0nnT47vN0QnQmpmeRxo8\nj7ZMPReneW4pSEN/xmz3nL3y2Doj5dE6PYyzTgeRKHCTquWEI7ciKMU+0OiwEJwqRUAz4N30ONUu\ngK5TYXzjCg6y45Wq3SHijsUHgSHAc2EMJoIoNbQmTKkaW7sawJ01ocsbIh89FgYeer2ajYX6+2gH\nYTQdwDE8W3eGlfOVeq0gEzyVog7wEjBEhKKg8PQDRPhaKdoC7ynFHiKMc3i0GvC7P6PW2TNehoD+\nee99MulFhG1o5/QStHO6qwiz/MExADC962S4o7bUjpUZdwUdrocugP2Eu2edzE1dXrfTXKNyKrBs\n7T/jMU2ttzFNx4rnRqhn+jw+rvLvvA1yj+m5ZDZv2RcdzjnOzrximbl8ySUUTBoOOcs6WZ1lmpaO\nOJpGIANi9rKI2U3/HOxNSpDjQb508dzOcMVie0E2sgxkI8gMtCOtH9zXGfpERuigsw+OD28809lJ\nzceqe8dzrkCPDW54B53k7EN8qggW7tylLvoC1/8SlSaQLfhUJjIoBcBSTpeDXGGalrb4mUbABQEr\ng9wJsihcjVRqoysqOV4sQheMWAhXLXESJOgi5O1ArgaZCCN/i5LQgStb6iIi538UTgIu09lJnU4a\nVywiAtWnUuPpLuUyyJn6RJy7RezRzut30SG71a3fKWveWSdui+fHIAqnSCPLxv8vohYxZRqBNISr\nTaze5B4Gxi8BaWLz+wYgL6ALqpyaiSAzbd6Ix8WMADabndRJ0x/8g6WdfQdyI4jRrIxeq3Chk96t\nBjneJP7+0ECqopO0TbNkQVWQrabxygD/OkQwpNM4AikI1gSdLuBhU0dUa8PpVuHnKiAjQNaC3EJc\nml53gixK5oUo4RLenJ03OutU2RZ9h2EVyJfowtcNMx8jO5+NQ6bN0lTrZWnHs0EGmaazf+sllUEe\nhB9nQ+dXoPCvXImOs/Cvbm1ckQnpNI6AA6E6WB+dsfw3+qO7rEgf+1tNgCfOsbTAqWQRJ2zavBGP\nS3ROHeGv7fBlcPF3zil6pYrFh49am/xn6Fq0DZL7ihPwbfxaXxtFoo2TP8gyfTyLTki3Xd1x0PMb\ntC4K34w3/KUSyD+JSEincYIkEEeBDEUXfUh7Qy84POwE8/A/4a0hfnxQuv8z3oQbNpqN3rnoix1N\n04/NXZ7H5R0FdJTTqZZAXY8u0nIFDDwmmU+6l2qHazA0hacvgOvWJp4o0bUnvsJlqotcatvLiRRd\nZ3s5SEujeJgnRLk2c+6HcMUCmG98Nwzpxu9+IMvMzE8UyB2wYBH0K8lVDSpLGjwJ0t/De9XQjtIJ\n2gFuxyc325yeRv2JzvtyJ8gFlvkyYwUCZCzI7Qm/a2cpStvluuXyiTT5JDj5ErTPxVhIp9HLWfaX\nmi5fDJO3QalBzOrvY39po15GlzbSwDqgro/9uQKlqAr8D2gCTY6Fl2rCjztIpso42ATsnOlLIvwO\nvA68rtS8faFG2/gnagB/JrxVBnz+KvA40ALoAfwL2FUpvgG+Br6y/l0gwl+J48Yuap10Fsz/XKmp\nBTqjJPsCE4E+IpRkOp/cAHcZNqMGTpc2Yc0AuHS8UuwnwoOhI2Z2F4zmsS0kTV+hY45DO46jw0en\ngryCT7HOudpA7gK5Jhg+6eAq7z3IniCd0AnAyqPBNqCdfv9GZxptBg0b2/sJjjwIHc8+0jQ9g12r\n6PjB/OGPVhMwGNJpmCjRPLaFxWTo27CuC0lkOVYDtCP6QXyMc87Vhr68dFNAfNLGa0gqumBMe5Br\nQCZqwXDTn/bC4/L5IC97MRPlWotqWcvUOHefnkq+YSik03DunWge25wKMQRg9ig38Szzud84UIpm\nwJvAQ8A4ESTI8XIENgG7ZdNBGj751Fuf/AJMsxoASs39CGqcFP9kDWDXBsAxO8J6WjTtbRoPN6AU\newAjoUkLe/m2ZiWACOutQkNPAlOU6jMEiq8JOieUYaFfVKhtXBVtXqO3wk0zzeIVGpOtB+oEOYBS\ntAOeB4aL8EyQY+UYbAKy9tGEwyc//2QvPL59X8So8ysPFUApagEj+DuJ4a8nwqBJ8fJt5CZ4/Eil\naC7Ct1C7Hhy+FZo0gipfwZRKgSdtNH8ESjy23d3RCmvqaRq34OcuL4GcF2D/3a1IgZNNzzVqDZ1Q\n7zHTeLjD1c6MNGBFLpg4doSGvoA1zIqgepoK0Yd2ZimQi/R3+fl9sXsX7lJs+NGMp1a205SsI88U\npTNtTDSCWDiwngAieJRCAVcDQ4FTRJjt9xjbAWwCdjGNhBuImZEW3w6tToMNK+C503eQKKtIgF06\nbihdBlwEjAG+BTomfmsOJ8ESpZgKz82EhxtozX4bIUQMAsbNO/YgwpwdRPCvw2fzjlJUBu4F2gOt\nRYL1F+Qw5IzQh3LBz1LgG6CzyHhXhb3z4A5S1ViwD70cdgosLIMmy4DuInyWyXgiLFdqyXyo0UD/\nphJh+TcjKfRhhxH864C9/epMKXYGJgC7AyeK8KtffW+HkFNCXynOAXqiHbd5ge8jpC+C1Gxs7G+g\n/72vHvT7AF7oIOLVkV4xkKUf+sBwCxVwKNYnCn8hskIfdgjBvx5o6kdHSlEXeA1YApwm4ld1oe0W\nPF3OMgFKcQjwCNBFhDWm8dn+wE6oj28M1V7Rl+dOPMPe9PKX8i7wIT6QpSFwCXD2BthlNqxZvJ1G\n76SHRMEPtWfkQqk7l+DLrVylaAS8A0wGbhRdvi0PDqA1u3Yj4dAjlfp4QpR5yIoImQyMlCiX4Mtp\n2Hd/e6G+827AdFi4L5R18Nv0EmJoeOLA5r3fLj3kh0HxKrh0Za7dzEsxpxNBPs2yjxZEuEqPuzmE\nVz4yl253Wre2XwR51DQu21tDZ75sr6NtnHIolaeszh2ecTV30whktlBdXo9i2gbv87m7I9zwq1dh\nB3IauoTk2c7PRKMeb2r8wvugopr6w2F9rwOZCVLNNC7bS7Nupo9Cp7woAhkO/Y9Ox4O5eCPYkQam\nEchswaKZtsHbXGoVQN/FXoUdyCVWXHCr1GNEW0MJWwjDOdNygYdATgFZAbKfaVxyvaErbp0D8iY6\nNfYjIMdWTF+xPQn1dC3yNv14iGbaBm/QbCw8WJDsPCoeS4obnlYM/higD3CSCPNTj2HnoEo9hldI\nFfbmDI0PCis+WSlaQ5Mjos5DSrE/8AzQU4SfTOOTC+AQR78z2jvaB/gRnV32AhHKEt/PpTQPWYPp\nXSezHbtWAQxeH2XN1f1cMj+1oIt5PA4yCxdFr8M8GWV6qkBn/LwfCjeHkNF0H5CnQJbB20OjfPqx\nbnfOIssMoDtSs+e9oZu1D1D+QRaV7rbHllOavvZ2L1gFvWZCpaq5nf89s1OLFcXxAvAX0F6EjenH\nqF07PK3W3anCOqn0AsYBb8JPrWHQC/Ex0oV/Qt07M8UgWdvbdCt8ezZwHfBf4BCRUzcqdcFroUdM\nuIf/AIuBu00jkgugFLtCh0eTee+O6tD5ZZFPR5rEL5JgetfJbEeXfUHWsR2kBrbXTvotcci7Xg9d\nCu9RkCouaTUMFiyBviVhaLVuThU6Aks+BPka5Ph4WlS0p379NDrnv+s84/b0HPYHzJkKcqDp9Xa5\nZpeCzAGpZRqXKDbrdNgOnXZ6Esh8kI1w3W+54KeJSjOOgLvFLhcKl82DoSVROYr7N69uH0CvGbBw\nKche8c/IISCLQQpxmTddC3wpBtlfj3HhR3D1miAdVCkcsougw6Eg49CRRlem27Qtx9t0kNE+jB+5\nqByHOR+LTo53sGlcgp9r+oiyCgL+6ngBLzO0WbC8wIxUyfW1D53+phFwxyDubLBRD09MP1e5FeQz\nrGpaIG1AVoH0y6CPvwV+hd+1Avki/HW6WnSR8OF/wncvufFDVMB5H3SRmS7uns/dyC6QvUCWkiL0\ndntp9nxy0SJ4prsbAe++z+j4aaLWjCOQnklSlRyrKOSbT4aeoZgygpurKJBn0KXzzrc0v84ZvJ8k\n8K3fF4AsDR7/WgVasx8lOlVsSVZaF8gJ1qbXJBs+Mb2uaeZYBWQaCcXOt9fmvE7XrgZ5IJ2AT8N7\nO0TIZdZrYBqB9IvppMFdMF9rCOUMVCi5+NEnz1eqVZjDURm8Zyvwrb9VB/ndrXkomPXypnGDDEZf\noqmZ+rn3b4CrtuTapo+ukfpuOpPX9tKg52e5eiLbXloORO84RbmU7QOP14j9vhJhxXsHBUpRCbgd\nWI0u5XcMOpVuuveGoav1tBdhaeLfRdiiFGXoPD9rvcXTuwXf71KMR9PhcaW4UCQ5wZWOaz/5apjd\nFTr2iWhUzt8Qo/9hzWGvhrD0RJGn/zKNV5CgFHsDY+CAo6J+T2K7B9O7TrrmbK/rOiNeUwiv8kww\n85RqIM+iCyXXATkQfeO2U5r3HDX8hOfmgBzu1v7p1T+i3+vjq33VOqnMBLnO5m8K5D2QUabXMDt+\nNnMiCdoPBlIL5GZ01N090PeoKM1/R2zGEXCFpG3JsUTbYInAcMlFZgLZHR3K+AJI9Qq/b2PZ9Q93\neM+VwLeenQrSyY3tO1vBpN+/ZhX0+8YvQQKyHzqxXMeE3w8A+TJTG7C5tc7e9+CXoA5yA0JfJLwC\nnUpiAkhBMv55+7uJZhwBz4hrjbI4nmHPLoFjJ+cSM4Hsb2nh92ITlw7SA2QJSP2E37sW+NbzT2sn\nmZPNfeQmkM9B3oAri7MXTPIPkJt9plVbffoZ3Uavb/fpULgF7nPt7DbdsvV5+Cmog3B+WyevC0AW\nWL4K136pfAun5YBN3wlKt8L8jXBjCfy8BJYvi6oN1wmU4kjgTeBuEe61e0aESUrRGOa/q9Slc2CP\nvfVN21F7QpMTxcaG7wArgPradmpnU/1mCnAnsAf8/k8f/CMz0DV6fQMRPlLq40egdCpMqVahwtCD\nsSpHUQcnn8eutZWisghpbPt+5lNqsK/9Ou9fkFk/GpSiHfqmdWVgsAhTvfSTh4DB9K7jpYEcj47h\nvp4QIlICmkMHy3RzfvpnaxXAFaXx2l3fkszMLf2+hKE/wQXfQf+UUS7+mCCkLkip32aXXA3NjF8L\nu5vY8z5Hx6WnvJzlfFK4dG5F06CL9TkVbtxgT8vRv4O8BtIVZCcXfR0B8hbIIutk6vomdb4Z4EHT\nCGSMMNLPEpZnmMYlizn0Qcefn+juee+Czl7I9Fmm7zXYm8H8MiGAzANp7i/tcvcSVjx9E31UUgl9\nW3ktyLU4hHA688KIny2eGgvSIHmscvv/gBbouyCL4Pk+9uvc4VCQ/iCfWjb5f2IlLYvvr+PL8O0L\n1rhDyef9z4lmHAHXiOpLLPdYtsJDTePjcQ4K5EaQkkzmkI2g87phwPWttb3cu7MQ5H/4XNEr1zV9\nFzRrBPIByBd2PJJqQwY5GH3BaT3Is/DkucnPDt8Ksx4BqRHrz9mpik4D8i+QlTBvJly2Kr6/wevh\njGam6ZZvGfCYaQRcIamjW94DmQJSxzQ+HudQBWQ8yDcg+2T2bjaavrcNAx0VMzHLOV+cbR/JfUYr\n5DEgXqkEMgidq2gkCSaymKAevQ3aTLQR1LW15j2y1K8NEmQnncNp+91wd5RWyRfHQICgFE2BmcAc\n4DQR1htGKWNQihrAy8ABQFsRMryIUlQIg4r5u/ZDGfrnosL075Y7DiuCq8swnYH3MsMzCaYDrbPs\nIw60s/bVDtDxGV0Fq+Mz8GqOOHHdgQjbRP6+lHYy8JlSNIv9vbREZEZvuPU3+OSKxLmLUCrC/fDj\nV35dWBThT/jzr1y/ABlFUKp2gVKtJyh17gf639oFgQ5oetdJ1UBOt+z3/U3jksUc9rKO6k/iwinm\n3I+32GYvmrF1Klmf6YnEfuzCLXDhp7kSQhu1ZpkEB1ha/+iKPIQOZmjg/K6/prDt3bRmZn3DP7ka\nn7Q9IUShI3N+JkUN2Kg3kCYgC9HZM41FGWW6YaCjo77Pfszt2wwT7hrKfiBvo2sRHGn9bgEpagX4\nvQb5NQ1iXcPfSCMXp68UOwOPAQcDx4mwzDBKtpAuf41SHAe8AowR4VFTeEK5SSR9DHdsTke3hq1b\nlJpY4N1sEm593lwCL7mPRPhJKboAfYEpSn0xEV7ZE5Y9o1TxfLs+dKW52h38qhLmd395AM0DIZvM\nTO908btwmCA9AAAgAElEQVSe7IuuDzoRK6d8FFs6jQfkLOs4njNhpf6kXqgYGnjuHC8O5O29+aEt\nw7DjYEhZXuPO/eas6R87OagxjWr68RrP1t/hnqOg8b3AOJHkbIrRgYpa7BLgSaBhY2j2gVIfPg7t\nLge6iDDLKJoZQdN7vWrmeh27To2vc3vlNpgHNK3wZDjZFK1spZWBKhVa4s9efu/Ds306wbgEOt/Y\nGIo/UOrcEifN35pTE6AFbBkNd+2SP0VtD1BUCJe1gUcbxr6d0cA+RylVuyCIU5QxoW8vKIatgOee\nEymNsMAHaHZ0TOA/ANyCNYdGUHgTfNRBZEzOCHy9Fp07ez9m2ply/lMJLvgDnq8aW9/rS2H8zkox\nkUAFKwrYii4iv9Wm2f0+iGf/ADbH/+6vTvF0XgL8D5jSCGo0siKzjlfqjkvhxnroCJ4WwFHAL8BX\nUKma/Vo1OTjlMuUhcqBNZkd9A3c21OnhKwFXAXs0hI6BbOIGNX07QXFffZgTWW1FKXYBHoC6DfTH\n+SQxgY/179idoONlMObj8PHzmie/2Vg4ZGfvec4d7ZLL4Yq1UL02bPoF+r4MR6wieIG7LdOTYrA1\nBiqO8/2xUHZQjF5PksxD4xvDHa8D7wBfAXcAX4uwVvfxzQQoOyB5rRo2U4p/ALeIsMVv3PMQFByw\nK9xm8/tg7PoGhb4BB0YWoBQHAS8CRfBlKxj0mjbpRGMO9ienQce7S0RWfx8YAIyhwqkFGLg5s7sA\niUJo3nQdTx5tyI52mUJRIQw6PjbWn9jz0LyZIpznro/yexs1ugMjga+Voj/UXhXGRpaHbMH3wkOp\nIXoOjOjF/KJTxa6xbkkq/bvyerDRmEN2t3bL3y0RXYzmJtHlJ5u7cibleihf2LyYEELriYecwnD5\nO7Vx8WoY/EuursmO1PRa9l0cv1b9fwpqrQxPNNqCAl3N6gF03vqjozwH53QLHaenK7gBvZvD8D+z\niyjJ3cIYJpO4BcVD0P6FqCgk+eZmvboeDqP/0N9P31lQ9F5QYxkz78TH/LbqBCvmwxu9o3L8VIoC\n4HngZ6CFCL8mPhOtuGW7I+I8YJ/j4MHWqc0WT18HXz0FHat5nYfbuwDRhNJfTNVtDY6Hdq8bFdNj\nthCWv8UsvDIPHZhwClANKFaKo0X42vehTO9wepeT4SAPm8ajAj5nodPFDjd5kzYznO00xo5pE26B\nnAvyI8gupudgaK13gR+/h0Fr42k3dDPMfMg0ft7nddpr24OmH6XTdPBzlS3l95NAhoC8Gsg4pidq\nTbAFSFEE8NgJZBzI0lxM/6A/kFFl0GOGNrEkFo8vb9psgc4LtDIX55o9nVpN0AnbhpbAd5OTzVO9\nm6PrAQwzjW/m85NDYOHK5DTIuScsc8n358O6rQXZw/p/db2GZ7zpd9H6qKRh+A7YTyn2ECssLWxQ\nigbAs8BG4GhTeGQHpZWA34ATRBClWk+AslZ2ZgulUMB44EkRPjOBrQmwj9QZ/BdAYqSRUnQGpiv1\nzja49dhcMC8oxSHA+9D4epj0EcyOgOkxG8itKL8soQyoCayF2vWgZ2V4tovvEWWmd7cKu9zbIGcb\nGrsjukLQKHK01JvWVHvNgBGrYtWYUhbc6AVSxA5W7ShTzRHu6aQLj0RfY9YavvwM0tc0LqbWK5cb\nyByQZkHPOyqaPjBjNjx9h1Krh4alTSlFZfSd50uBniJMC3K8oMBGe+2l47hf7aBb8VjYryEcfCzM\n7gKlfwL3ousT/G4W+7AhU83xhYtgSuWopzyIafjcKML/mcbHL2jBZ5Vq0XCrUONvWVWJDb+X8kuo\ntUBCciZv5G9G22//oE44kRD6mqDn94T7G0CNpsFejikfk72AZ9A0aCHCyiDGCQecM1paJovemsb7\nz4SjX4ARe8CFE0WO+8oczuFA8se61+6ZRepE37ywvQp8gAbQ9FXWVYF1FX9drWt8UqdAIYzLe3qM\nyxrCuvFKLfoBmh0WWESZ6SNNWEe4+CyQ3d6DhSvQRaSr+DWGoSNhJRhQlNpha1scPZImCn9pYzfv\nK/+Ec39ya66JunlhezTpVGztqbnZhrGlPTU3h0djJx4YvgxdHOkudFnLS0G6gZwEcqgVKJFWvtjz\n6UWl0LMkCLNiJDT9mDZVnrFyGzrxUM1GfvRuv1NftQKef0ykdKsfY4QNliO2E/AP2L1eaq3A7iTw\ncGNYGDEThd9HaLt531kFTv4SOn7kzsFZVAgjOsE9e8anPHCTniIYiNGpURNodDi0vUmkY+AavtP6\nBGn6EKrtpK0eSb8PUXY5nfZ+Wwd8COxhtcZA3Qo/1wXqKMUGYC36uLI2+f9deifz6UO1oM370PFT\n3x3xpnfy2E46V+Bqid/Zupf6sbNFXVvLfD5yPMg0kB9Azkmf39/cjVP3c/I/HhvO+yjbeYPU0KFz\nZ74VhdvGpuLW7cfttQmOeAfOLgkCH5Cz2lLXbgEjoum7SXEilUDqgBwI0grkTJD+INeA3AnyGFy9\nJszvMxSiuWOoDmkvEnnvP/pCz54m8ekTrCPjZPQ9gosrHh1TpUGI+qYHopwvE3X/BKQAh0tyDnRq\nBHK3rs+b3bzREV3PmaaR6bV0HrdQYLjovE3+4INOf3IfyJIu1PrRTuifBd+ER/NgN9rQcz+FybCp\nJ576IlEuETUYJruiFIrXgIwAqZ59f2bDDkGqgpxifdzFcOMW+/UfsRpkOchqkDdAbgLprLUnW5v9\nRiheD/IvGHlCdtXAZA/0hZkmpnkihpOTAtP/W6eNMdhxb7LoerMv3y1IY5AvLeWmzrFUe7wtR25r\nT83N7aj7Z3tqbj4LvjkeHg2X7rUK4PL5MPBHv097YX+foREt/cSbT9Zaw00WA5X4qOnbEXX4Vvhf\nN9PztsfXaZNq61njDCshmp3mHfub1AXpA/IcyC8gM0FGgzRPtzGjS2meYx2Jp4GUwkiH0+FJk7zO\nOx7/QfPgq/8zzQ/ueOP6X0C+B7kIpGp445YL+5sSft9mYuZjSHd0Ntsh/J3NVg4F+cE03S1c/gcy\nIJi+axXAxd/AlSVBmxCNEzI24URP9XDRtkK/jlCJH/9L/Szt8XjT80/GNffMUTEaJ26u/ZbAp/8A\n+UQLankF5BKQeunfTRVVI5Wh1xd+0skhimJRlKKc0ly46wwyFeQntM24tr/j9lsSP+7VFZSzwgq/\nv3Ij/DgbpLG7vmUXkP+CLCAhmy1IF5B3TdPdwmUCSJ/g1rXvTBi6bAcR+umLA6fSILNYxC5RFPzO\n9Dg1kARMweN9+Y8gp5HGLJW5Vu6v2S5XzIDp6ARyNMhEkHXoXFIN/Bn31cvgshVw7iYt5MsFfs8S\nfVLvVtGvMsT6ts5L3accir4Z/gxILZu/DwYJ1ZSTAtfnQS4MZj13MPOOs2Z79RqtsTx2to4rDyRC\nIHKC354JBq2D4nUgT4EcFHvO343QHW7JY4LUg8ELwjyh+P2xOPPhOZE+YTnPRwrQPpP16HjyZln2\nNxLkX243Z5CWIItAHoAjD7JxuF9imXP6Y+OP0M9cVgSXF5uOmrLm8yoBpIrZIR25zpPu/gnIf7S9\nMjiixAT//7qFLUSdcUr+sEB2RdvA18J3LyUft4N1ztoL2QErYM5UkF/hyuKwNWU/fRXOfHjDr+iL\nN9W9bLQmNucE/q6DjkJaAfImSDs7Ieuin6dALs7wnd1g9ttw1ZZ4vrlyA8z/AeRQ97xmPPjgHZDT\n/O83XHOuEeJlusBhEEXb+HMmsdaucMm34QtYJ6HYawZIzSh+qP7w4aQeWlgWr9YnLvfzixJN9KYl\nl6LrJ8xClwGtEsPTyQFf/rfrS6HrO5ni7sw3MYe7+3fMmdpAPgA5xf9+d0BNP56xzMSZR5HJUuMb\nvrMXLvwk3Zi5XDYxPR9mXpgkinyFvjDUFeRTbX758CboU2y3MfmxaXnh1SgGM4BMB2kTDM+FpxhE\nJA0DpC63V1QIQ9vC/fsGdxU++om14sGuPGIwJf6sbKQD4cCW6cbM7bKJ6fDfuWbmPOLEVw3284pj\ntiDCNuBV4FWlaA2vPAsP75ecsO9PK7WDfTI/XK/z+rWZ82p4/O0GdKqJwQfDinuVWvijr6km4kpm\ntj8PvnwbPhseWJZhU7tm5rvh1Ou1zTgYDTKKGlkUtAOQY9GXZT7WueWjYaowQ/PMecT5ndG/gzwE\ncrj5eTlp1SNWW5fjPGvcIK1h4TK4/Jd4vkkdCqv5+5Kfo8BrYWri+juTdoHOxzTDZUCMu0Gu3x4W\n1l+cW02AKxbBwDn+3hKUOiDj0c6/Pvx9WSa3zTf+88iwP+GjMZnz1dBjQcagM2R+jL6YVNVMRJbT\nxnTVEjjrbS/KkGVCGomuNX1mPN8M/gG+eiI9Xp/crp81y2thKoRoZ3m/QOdjgogeifE2yJnBjvHY\n2TDyN9NM5oE2J4NM9/5+RUHTegJMuRZdO/c/ILuZnl+UWvKmN6oNyGKQIc7vtDkEbtrqcEt5J3Rx\n+ve1o3jw+rAVD/uNqU8xfDQGFi7VReIzcV7L3iDvoS/k7Wfz9z3QoZoHpcZLniSgG7CZ0Sc8/wLI\nrSA3Bzof0wTNgBhLcHnDL4sx7gua4AHhXQOkDGTnzN+1++Cv2gIPnW56XrnS0PHwjoIf5DCQeen7\nydxR7N8cyjezQfN1jpm/719UgbeuhOvWwQ1l0OdzaOEorEE6WKeX20iRSx7kOpDJqXGSr4jA/Rln\nTb/zKwHw0sUgTwY6H9MEdUmImiCbQCoHOEZldGKvg03P1yP+s0BOzPy93PJlRLWlEvwgZ4G8mb4P\n8xErIEeC/GjzewXS3jpxr7BMN7vHNotzp8Gls3Ua6vRhjejw0RKQk5L/VqsATngGCv+Cts+aPnHb\nK0YD11qJ/a4H2clH+p8M8mGQ84lM9E4aOASYL8JfAY7RFlgpwo8BjhEkfAqcAHyS2WvRiy4ph5Dq\nkvoyjgglStEemKYUiPBAhT8fACxK30skIlZmA3WVYl8RlpX/UgQBpqHndzhwDSxeDH2AcbvGouqu\nKIGXi6E05SAibFGKkTD/fqX6F+kIqBXLoWg8dH2yQsGjC2HQMUGWTk0H8dE1sYImMF4B44EeSjFA\nhC99GK4EKPChH2cwuYNmsPtdBJJx1r4Mx/gvyLWm5+od/9cH6fJtmTkAnTX9UZssulcyM5+wopP8\nTuWQrPGD3A8yPCpzdjGHF3GRWAw6vJTNKRHqNkq+qdtrky6o5K3P8PlUFEhvtA/sHpCaWfZXFeT3\nVKaxbFuuaPpNgblBda4UVYFzgKOCGiNI0JrqOdfDgw2gRoPMCjcXFcKg4xOKPhdD+2uBG4GBSjFE\nhK8DnkYCOBV7rz9TKeYAvwNbrH9/t/nZ6f8JP7e7Mfs49BhInMb/cR244UBofSr8VKTU25NTrUe8\nRtn6VPh5HrzZx4CG+wFwMvB06sdq757d3ZaDboPbq8XT/pGd4S5gjMc+wwURBJigFO8A9wCzlWIw\n1P7By+lRhD+UYhWwL1rr9x1yRegfCjwVYP+dgbkiLA1wjACh2Vh4sMBGcH2gVO2T3QuairU4ny5R\nileBi4G3lOIVYJQI64KejVJUgubH2QuUVUuB24BqVque4v+10z936OF+X8rTgr+wD5RNgylVrM20\nLQyamm4jLr8cphRDgKNEgvnw08AHwPVKoSyh5gDZmqOcTIt/JvzO3KUstyDCWuAipegICx+DvrvD\nnbUqKFIulTAgZuJx86wXZM0fkVwceeaDNA2w/4kgl5uep3f8nRyAo3wxD2iHndyPzkZ6ecAO9f1A\nPoBrVofhYA7KkZ1tv+iaqj8TYDWsFGMrK6jhgNTPZWeOcqZRxdKp0b8vkzyvkyZlufaBxuobJ1B6\npmozEUb/pb35mVQ9cpsBUWqA/Aqyp+n5eqdTqqpGvmYjPRzkQ5Bv8RAp5KL/HtbGciPUPyAXbfqx\nfrOLxLEE7yKyTIfsHf/vJuvwzNTfUjaX9VLQvk0uXwD0Ye0DjdU3TiAPDGHLAF4/XvRNyHdMz9d/\nWpVXNRLXzOZuLFEgF6KrMz0Dso8Pfe5unbbmgbSIn1eYJR57zNDF1Acek32f2Z8gQB4GudoMP122\nKpy0A9vfDW8fTnmBxuobJ5BfhPNKaHRhhL6m55s9vWoVQKtF2qRTXmPYHQ28jSc1QG5HFw6/Do91\nWdFxyUtBHgDZxTwd5R6Qh/xZj2yzU8rZIO+FT4P83Q2Ta0/AsfrGCeQ88cQjUoklzLqtT6jYtD/I\nYLh6baZHKkvD/A0fa4lGj9kuWxVsYRVpAvI6Okf7qRm8Vx2dT+nnTN4LnoZSF50iIOtLetlqsSC1\nQTaEuRmCFMAVi7MxT+Rb+dqXXzA7aVKGm/0BICVB4Rbh6J2KkQFLgAeAW4Aau0NZL7j2dKUWrIID\n6wLvwPJ5UNYmw0iCc4CpImlukuQIJEfi/LEJ7j8eHvkjuDFZCJypFKcDDyjFXGC4iPNlJKU4ApgA\nLACOFB35EAkQYZ1SjAPuBLpl11e2aaZr14GBm2DdDKV+KPLjcprdRTQo/Rk4HRgItIRtHlIh56Ei\nWOvUSykOA+6WzKKwlgH1laKKCFsDQM78rui8U5ZrreUOSUk4bp71NlYkiZcjFchU0hRuzvUGcgvI\na4QQBQJSDX09fy0698ouycncPhlradL9wsDJ4zyqo3M9+V4wwz0O/juY7fscvN5KnfApOpvqzlG5\nJLY9NMtXdZGH95aCBEJv40RJPfG/j8fr3Rw39fOdX4Ebt6Q7ToPUA/kFD0nKcqmhb/jNBukR4pj7\ngkzSedQvXREvPIZuhjG+R/4EMIfeIJ+Z2pic7erHTvaaetm5zy6vJz+7/TlYDfHRKJB/engvsLz6\nxonijgDuHUuaWQs3Q/fpqUPNZCjIU6bnFg79pCX6mvhe4Y7b7b1cdQiCVIIfi6D7xyYKmjuH/V3w\nh3cHofmEbvZ4mS0cHzAfdQN5w8N7gcXqR9imXxGcUgXEl0vU9squU+GG6lCjNZS1TnETrgdwazj4\nhwcOycNmKcX/oR0jF4aITZXcKkFZEWrvDxfsDo8d5vFWZZbgdNv1oJ28p4yIREK3OIh9s3Hfdoh0\nDhru+BU2tlXqxw8yTOZXQlCJ10zvhJlrA87HTbcnApBGll3Zt5SoUWipbLHaVis/gJwTHj65G/pn\nGnf7tey1KRaKW7G5vfRj12fqsoXBzlEUnPFmDJ/yCL1RosOPc1vj1/Tu48k3QoCx+sYJ4yMDHQZD\nf3Jn+5eRIA+bxtl/GqQWVCAnoK/X1w0Hn9x1CEbBFJKs6DSfnP2Fr4p9Di2BT8aGT1vZF52Hfg6M\n3BwT+FdLLvKK8zy9Kw4EGKufI+Yde1CKasC5wCCgCWxeC2X7uji+9gCu9DZmODnevYFTAquWbZXi\nSBGmK8Xz8P2jSg3aHPQcnJO5RYVeqcC8KSQx5FPz3qDD05k53fapFMcALyvFLSJJWc58BaWoiQ6R\nvgg4GngRGAgfDtIh2E9ihWRbb2SX7TQa4PQ9ujJvlrCjm3cSdsHGIP9EF11+D+QckJ3caJb6RCA/\n4SFPfNQ1V2fNYsD36BCwWTpkcvjWqM4hKi2qa63x6jsThi7zw+kJ82ZAz0+zcaI6OWLR1eg6gjyN\nzm/1Osj5INWT6TzK5lQloZ6s/F+rHp9moekHllffOGHcE1CqoK+lv2vZ4/8FcqAzA9rb/kHGgtzl\nDYdo26j13C9a5GDTrwxyKly1JMpziFKLF2YjS+H/jN/p0Dhd/A1cuSRboa/7GrA8u1QRdptj/6Uw\nazz6tvUsdKScY+RYLIXI9sOXIGfpQvf9l2aRjiGQWH3jxHEx8X1BbgZZhr5A0ruippBhXwqkmApJ\nvTJ737ydNz2Oky+BEcudN73ozyGKDZ1SOmUh7+Bx8LvKlx9J4Zz6uKwI5FBTczPMKx3Q2WKPyS4L\naTCx+sZt+g7XwpcCHYHBwEnAROA0EWZnOVxL4C/wWgXKyc5bp45S7CnCmizx8wHOPgjOHi/iFI5q\n3lado/AkcLNSHCjCAjMoOFUT82r3zsrmnKaPNatF3Fe7i/f/1G8AB7eA0wpFni5xj4t5UIo2wCTg\nHBG+tGoFe/VJlBCAXd+o0LeP0b3mVFhYBk3WAQ8DvUXY6NOQPYBJIqmqAaWCokIYdT7cXjWG75Cf\nYOgPwHylmAz8W4TvwJjTtw0wOvUc0t95yEM8iLBJKR4FhgFXmMHCDyFdEZwUgE0Z5KLyT4lIcDJf\nBFyhFM95/17DhXLHONBLhE986LKEIJy5Zo9BTkfDM9/C5+vvlk17OcghWfTREhYs0TlkuiU6rfYA\nudEyQ30Irw0M+7iKjsUvA6mR+rn8FXuP9K2PTt0RSshr8vj++pTsTSoD10LxOpBL3XyDwRWhkcro\n+gqdTK+7S3yboW+9d/Wxz0Bi9Q0TKjz7Mkh7kG+y7ONRkJFpntkJ5EK4NpRyfwljnwgy0+Sabu8N\nvn0eLvnWTGqGWgVw1Rb/k7DFKwDoCLevQd4AqeeujzYTYfQ2P2mivyP5wm8F0P91+bu0pa/5rQgo\nVt8wscKLhrEE9nVZvF/T0vLqu3s+fIcp+tLZPSbXdHtuWrh5j8bwYX3PhPlz7U6aAYxVFR3pthLk\nXBfPVwP53WccKoF8D3KGufVOnRMIpCE6I+sl/o8/5kS4caPfCkbohEwmahh1UKUqOt3v/ln0MQDk\nFffPB7ehpYiLfpMQ0yzsSE2bzswlkENHnn0V9vqCHA+yAOQpOOdwJyEYhNC3+j0b5Bs83KvJblxX\nd37qgywEuSqY8b2lcEjbd5iEdJ5cOSPd8Cu8kHHuaReMcwbIp1n28QXI6dkxTR8fbJ1OzFi3kXUS\n2dv0mmbPB+b9DOiqVaeC3IEOFS6D634L+/RWAZ8zQb4LW/hZY9eAr5+C4X/a3wEJxrxjja1AvnRz\n2vB3zmlTmuwBMgfkRhPjZ9V32AyUZoG7g8zw24aHLuB9RRbvH4G+xVs5s/cq2ktH/AwzPF0Kc8cM\nXV4HmW96Db3NyXyMtvURn42ukfslyEaQD0FuRcdd1zR1Oc+Ulu+O745+Jei1A+kCUpTp95cZ/8Ur\nHND7C6cNHmQ3tM/jjuDoHZx52AgDpVjcyuhMkKf42Ocu6CvgrnPJJzPBV0+A3JolHvujbxK7vrCS\nGTMM/AHkcdNr6G1O4QtTkH0sJeMhS6CUgryDjsBqA1LNni/C35xMavnp+e7sv4JeO2vT+4wACgHZ\nr+nQzXDVJvt5nT8NZDrI/X4rp/F47SCavrXAffDRYw1yAci73pigRKBQoMc2aPeOD2Fog0E+96qx\ngFSC/l/ZM8OQRQTgTApnzYN1eltC4wB0icbH0XbYdSCvgIwAOQaXOU7CDneNgpav8XASQl1XB7l2\nsfEn9YSRv8G50/yNEMrkBDNgRYXU1p6yArjHKzgFwxgTOU9Wqlgf5Uk+9TeZDCrQxJjA/1SvWmjL\nRyDDPby7B8gb8MM30K8khtdcgY4bYMQWOPVV07Zwb3SpmFNdKtDba/y5KJBDQQaha5QuQ9/RmIRO\np9DMpNac4VyMa/kaDychdGzW6Z69j+2DAEyhcMRv8G0mwpz3QaagE8d9A9I0eJqP2bZdRe84T1Yu\nBpniQz+7gfwGspv7d877UC+6UzH27JgZHdO7FqRxBu+ciPYp/AukaowZO06HPp7L50WhgbSF4rVa\ni7KfRzonL9oseDTIMJCX0Wa0YpAnQPqjs7KGUBjeX2d0VLT85PlVjOkP3uQVbCRc+r4t/noe5DX0\nPRyFvry2xlIiAuEttGl6s+/9mmYkh8nuBLIYpFWW/fQngyRZIPXh2jV60W+y2f3Fl2MryDUgH6TT\n3ixmG4WOlU6KHIp61k8XdOiKTkx1ckyg9CuGLhugU3mN4zb2UVBPnANyA8hbaJ/NHJCHQXqA7Jt+\nbL8FtP/CLypavntaBmPyctbGb9wMchc6rNQTjTTu/ZY4KxxSyVIeppBg0gE5GO30fwNkrwA2/T1B\n1vq+XqYZJsWEB4K8lWUf74Fc4PLZllqbnnGXXvTCQDR9a6zK6BDQgSmeqWcx2sdOQiwIW3hYoZPW\nhrwC5Jj4sRM/wO6l2oSVuA7XrQO5F114es/M5+hOQLulB3TyxcwRP9516+A1Rx7ZUVqaiLVb0I74\nZSD/Rp+KM4yy++BG7RNLSq2iQP6DDtm1TW2CvgN0BxSvgkuySlNt03cByBLf6Wl6QVNMuJoWwtLS\n4/t7WxrgLi6e7Wkd1brpn2sV6NJ0vTYFdWxFX3VfA7JfbMzyj/3cqZqJ5DZSOBjDycUSyGW5a0FK\nQA52N5+bfd7Y3NZSTllzuACkr6UFLoZRvyfjWCLQbqXbDTQKoatRbC4vSjUFKQT51lImHkKnMUjr\noEebbvol/E6B3Glp8rum78P/i3tov9Rc3+lpekHTTPpKkNeyeDclwdFHtzv0RytH2DNbkMdWuQnk\nTXumvuTnsIVE0OYi60P6F9oUk3R6cT65JFZVyvZjchrnut8sAXAPyAjo/rE9PW7cgDa5PYt2Fh+S\nTLsSgeGSydqkon/ULq+F3TL5FkGaoGvwzkKbDx8F6QyyU3KfrSfAqD+g48sJm8go9Alij+x4Khvl\nRFqCfOk7LU0vZppJV0cnMjrKw7vTqWAHT/5ozmiGdsx8RIbmAR/nVxXke+g53auw9XNjgq4z/Gbc\nCnOtgg6X/ByHLJXOQq9Dqb/HZsfww3fQsfvXgPwbRjiEI/b8jATnXfIGnLl50FlwDFoFl66M8gkg\nqpsS+kR2NTrOfx36ZHY6HHlQilPcMHTqCVd5tlLzVFaafjuQj3ynielFcTHxYSAvZfhOQ3SETFX9\ns51GPOx3+HpC+TMG53eM1jTE5mMPr5qVplFF4Sq+MK41x53RMfHvgtRMjYPth9jGzxOX2xNSph9y\n/AZ85spM19R5vI5ro+ywzxWzFMh+IFeBfAyjf7enaZ/P0abHjPJ0aRoMXOOzTb8LWfo1bfs1vRAu\nJn6/2/gAACAASURBVL4L+ijdLIN3rgd5JPZztKNcggoPzQyHVhO0wzTxbkL30iwZd1frNDXJzQYb\n1uUnPU7hFrjgE+cMit6FmReecx6v03TTSoHfczXd4MJP7Wl64xZsam+n708UzJ+vbft+KSdyPsiL\nfs/daOUsNyC6YtHdQCHQ3eVrPdAVjixwqjjUqHHF35iodKUU50KfdXDT7nBrJXPVrOrvA02BIcBd\nwDagErButlcaKMXewDvAdGCoCNvSvVOxelKwUPon8JsIJ6bCJVbCr94+uhqUW57IvEKZ03iaJ8ta\nR6HEpX150877+lvRKwxYWgJlJyTT9Nsp4q0c5vFwIPByZxHfKn2VM46/YHrHdbnj1dQXeE57LX3o\nnDRF+wEqx37npImMKkPn+hkHT50fTuRKRdvnGW9aVYqO0uOPKoPzPzJhE3Wm0Xnv4+HyCUgj9M3q\nMV7eD4GnTgOZGuwYtQp0or2Lv8tmTe1PAIPWhc8jtpW21sCwzbmn6dvNpf9P3tdIHieLeh0OfV4B\n8pDvczdNfPcLNGitG4GMzop4T/L7jk6bFiC3wPXrg2ZcezwuXVEhLvgBkCfM0TgRt6vFyjXyNTqH\nkav4Z5DD0XHTl5vmnRQ4XpfIJwGNswwkiU+9rU+52avDS5aykFXyvsxxcFIM2n0AfRdH3aZvT9Nu\n72mfWlfPubXQabh/xee05ujQ5n/5Pm/ThHc3ebdx1aLQXvek2P50tuIwKl25yNFdEx0+2tkMnRNp\n9O2z6NDXM9Epr+eji8kkZaCssAZtQFaBdDfNN6nnKhPIICeTxzHqoLN3+n7SQSfvm0GIt3VT56l5\nbSAMX5ZLdZdBjkWHdGaV1Rd9kTSjYBOX/d4Mcovf/Ubepq/BySafZDNsASjgy8Qe0tuKVyzX5rMg\n7aap5yHCRqUYCPxXKZqJsMG/sdNDIo2Uoj/QSYT/KMUbwEnASOBmpbgHeBRq7xGz8VYG7jwSDugh\nwnth4u4WYjbptmfDnDpKffhhgH6bw4EiEd9svBXhEaAXMBh4MID+bSDVN3JmIzjzURFuDQeX7EAp\njgBeBy4R4X1vfZTz0klnQfEspd4t8JmXagBrfOxPg+nd1t2O51rTvxvkNm9j9D0Khm8N8oiawTwe\nB3nQPN2liWWeSIhJl6NBntd+lkHr4ml2sWe7aPDzCTe00DolPRJE31b/TbWZp+PLYcTHpzGTTjN1\nQvVAt4PRWVcvjDIvoW8Vey7+5Niv6QXwi8Do27XLvNo5QR6Brx4P9gbulS3dbCwgu6Od0b6kl/aO\nryh0uGxD+7+f+mouOfDCDi3UPCVXZv6e23w/tQqSN91gbel6zBOegcK/oO2zlsCvbJmx6pheYxdr\n0ghkKUj/YHipw0t+mfNAngzCBJkT5p34ULajjge2waudEo5SJwLrRJibaf9K0QLoCkcfIjLjV5/Q\nThyjEjxwB3zxH+i4R6oQQBF+UYorgMeU4kgRNgeBUzoQQZTiU6ANsCT5iV1q5VaonmszYVYQO/af\neCYsaKTU1DfcHvv1u12nJoR6Hq9U7Q7JfTQbC3fVic2pBvq94rEEFPZq4dBLKQ4AHhahRCmaAStF\nWB/EmH6BUjQApgLjRHgiu96ceOm4M4H1SlEEzAaKylsq+tiHwpbWADZlh2cy5ITQh5i9WSn2B76B\nB1cmPNIDmJRpv0qhgAeAUSIEIvAtuAaoDsddIzJja7qHRXhFKXoAtwDXBYhXOvgUvaE+k/ynMPwg\nfkLw+NoI7Y4waKq90LaDZmNj70JqQR7OJuYAs4CWwEfAccDMEMb0DEqxJ1rgPyrCf7Lv0YmXPnge\nGAE0s1pzoA9wmFJsgKTNYC7U3stuo4e5S+HQHTNOP/nYM2+GToZVfvw9sIm2bXaanKltE12ecVaQ\nURBWlMAqMr7aLXtB8Ro48y1TOU3QIa1F9n/Ljev3MVybT4a+f0XBb+P8vvsoMpM3Ya3v5jnr/4+C\nDDG9xilw3R1d6Wqsv/zknvctU2lDkDPQdSAmoGslbIaRDulPrl4J0s53epheEG/EvmxVPLEvWAWX\nb8n0YwapZdnOjwuQ4WqjqzhlXP1Iz9Vsoi10ojRHe21YaROy55nEusfnbtKl/sIq+HHpHHSqXNu7\nDjE6tlvpVpCb3HRBDgFZZP3/W5BjTa+zA5610MnW7vPL1p68Zt55H2Qn6PW5Pc9cXxoEXY0vSuZE\nstNuvBU8ARlHgJehrN19IsjD/s01fEcpupjLGabX3l+eCYaOzmMNLUHfUN4A8oklhProjaD+AfGb\nkvuUzJYSVASXLwxz04W6jWD0H9B9Otz0Jxx5kOl1TsZRdkZXqPuv3wI/HJ654VeQw3wfz/SEMyeQ\nnSaVeWlDdNjWWpB6weEqfdE5uXf2b66p5xXQPMaA/NP02vvLM8HQMZ32ja7bfDL6RvBzeiMY/Uf8\nR19+GjljpbviKzIO5Hr/52EfQZQLZj102vI3LaUro0pa4eNaqwCG2hRsWujLbe7EljOO3BjYOVC2\nYe9UOaSFUtwOvAB8J4LEvOQnnAbrSuDF6lDqC2bxHvhNG+DBNnBAW/EcfRMZR+knwG0hj+kjhEfH\ndEnaRAcLfGA1AJT64WOoUSHxW0M0uc+ZKzLDTRSOgvTJ7NwmFEwfQXTUP9w7m8OB+LmtWgHjd4Nm\nfwJ9RfjLBE7uobQFLCiBzt/AXvVjifaensWOmnAteVdM1DJ6rIGeJck75SNnWlrQYpD58MUD0H9p\nEBqKPV6Xrc4uLXE0NCqQGiBlXk8spps9HaNziSx756/cDXKNH7wEsqtOBGiHz8jftHlq9F9ROIGm\nntuQTVE0OdmsXXVLPrW3+dsmHGrzZjWm6Ul7X+RWE+C8j/TR+JzDUzlVLNv6MTBwTlC23aDsxrF5\njf4LTprk3waVWZUjkJkgJ/oxjokqS/H80f1jmFoCJ06KQqUne6F10aIMItDuARnhjT8HzgF5EeQr\nkPUgG+GGjfZCvednelOIhq8p/dyieUkwYe1uBHnZ5veVQLYRQFSh8UlnSbB+IK+4fz44227QdmN0\nNZ8Dsu/H2+nBEiwjfRinjenTi8btyg2mT1DJODWfDB3WQc8/MoksQjuFh3njz8sXglyIDiveUytI\n6RIDmj2BJisNwZX5DHYesg/ar5j0XaOTL5YFMq7piWdJtHfJIH9GkBpBCEXFPwdpbQpPkHPIoHSb\n8zhdNpjWypxxO3ZyWDgk45RNlS75N8hVqZ9xX4fZXdqTWgVwwYdwzbpwo4bscDtti2me8jYXeRLk\nToe/7QWyOpBxTU88C4Lthc5hvUt2DBOkTb/3Zl3qzpfSaa+AdMseT28nkgr0dplT32mcC8pMa2XO\nuJ27yZS2n43SgK7DYHs5Cn3P4m5YsCQTf5abGHSQ2wkg9W/mdJor0HNjlE5uLtasJTrpWy2HvzcC\nKQli7ByM3vkbzgfeFHGfmyK78neZ9L1nI9jSHO7bBZq21qXunPKnuIaVQL1s8YQtZV4iWURYrRSr\ngMOA79OP4xQx89MqKGtkNiLJCbemO8NyQxEoTikVWrZVip7ADGCJiG2a5kqQ/HulqAM8CyhochS8\nWBt+cMX7LstWHgfcm+YZn8GOTk2BNd9Bx8V+f9dBgJX65T6gUJzTpwdTKhFyWtP/lIheGArC1ANy\nS7ZaFUg7ndYh8Zbv8K0wbbSL9/+Hy2pYKezmEbHp90qIiy6vEmYqAsWJZ/p/hXa0rrA0wxdBRoAc\nh1VoHp2C9/J4W3eX13UYoNwNUsV/fKUSyG8ge0aDTtE25STQrgface7opEX7WGYGMr5pAngk2v5o\nB0hV07jY4+e/UxddKWl8Fu93R+f/aZ98dB9zIsg8yzbsaL4B6Q8yyeV4e8Ki36Dtc4kmAj3+KS/q\nMnVmIme007RQ9MW+my2BbzICJe2lLmUd+XuBPIjOJbMRfbtXYM6HOuKn4vuXrgywVkBTrDQM4dOp\nT3EumXIS6LYLOrVzykg4/Z3Kh4HgYJoIHgl3HcijpvFwxs9JGznhmSzm3I0MIpUS3h0B8hPI4Sme\n2Q1kCsx5X+dJt7uJaV9UxaG/YSBPpfj73iCrzK1R+Lno3eHkPpcLOq/MKRr/myVMDRgdOedKAfB/\n7CnX5lppxgp0G4OVqC7Nc2eAvBkEDrlq0++BTl8aUSgq1KlRK95oHLkZHq6hFFVESJta2QZWkaFN\nX+fw526gI9BahJ+cnhXhV6UOGgydvoI3azvkci9Gp+PeH9v8+n+Pq4BLgCGZ4BsulC6BhaXQcyZU\nrhYFO7BLO3qF59kAvK8Uj8HyE6HGwfFPBJpm+Tjgi4D6TgMdzoYOl4vwmpnxvYFS7AcMBY528Xhg\nNv2cE/pKcQiwN/CxaVycwN5hLLfB/Q/A7BeVGlwGe9dPdRXeBlai5+0KlKI68BSwF9BGXNUK2ONm\n+Gft5Ov1vz6oFF1F2Jq6qMrfcAywMzrXelThOGjyB7zaRSSQGrZhgoLNv4acsuNY4OmA+nYEpTgM\naAS8FfbYPsCdwEMiKb+dctiFvND/G3oAz4lNPg23uUXCADutTalWQ6DlN/DuzumrIiXBKqCeUqh0\nQkopdgdeQW8UnUX43R3WThEkzdqhqwF9gS6c0VwpXpOEyIMY/Y9tDxvXwPMNIZoRFOjCFhO2A4EP\nUAn6vgyD9kjIl1OsT53+gV7j5v+Ats3hoyFKfbs85G/sEuAJj6fl0CH2TRx4COzXFL5oCVPcvBpI\n1Swgt2z6ljNrPjY5pk3fEnSHf9Y5VjaA7Jrmmf1B5lhRGxld4U6FH0hdy844xfrbRsuZ+B8djXB9\n6wyLShiz6aMzMK4BaWSaJ3yazxPayR5sbQPT3xhINWvdGpumedD0ArkeZFwgeJkmTIaL3gKdkzzJ\nkZgLoVzZRvWALAA5OMXfj7ActsO94eeqAH15UZV6IK1ArgGZDIWbM6G/YaF/FsgnpvnBx/n8H0jf\n4Mcx+42hI9CmmqZ3GPQCuRVkTBB45Zp5pwfwrIjdkbx+A3vTxJ6NQsDLJWSd4rfcrv9j4h/U/7d3\n5mFWFFcb/9UACrK4oOIWQBaNCy5ssmkAAVEJEBGNILKqQ0QWjSIwqF8CMQZ4TPwENbjHJfqpI0GD\nfsggIJsLOwjqwCAim0hYBhTEkz+q8c6duX1vd99e7nDrfZ5+GGa6q04tfar61HvOUbRHO+IMEeE1\nL9I5cV4TbddfDDQV4W1gITBRqTUFULVdfIkZmyS9DxHYowOEgjDMVJHm5AUYBDwVUl0+IK3+Og79\nvvuOcqP0LSbKjUDnUr8/FrgFzm2cWKHub6RUjbqZ4Z2XiNXjzO6qbYMDakPxFKVWLyupjC2PzUeA\nniLpHZ46ZJAcOcx9O/arjIn9nxRKcQLQCbgtall8RA4O4umnj+jGWCnqAxcD+UHX5R/S6q/AbPo5\nQRQaENoAu0RYDaAUNZTiXmA9cB1ccBsM2hs78C4GHgAera4PUqKHVqjTOkD7t/Rms8s2WLUy1XOx\npBbja8PUC2Bmb+j2vlI16lp98BDQPl2F7wIfApfH/2pVnl7ASva//weJPqAn8L4Iu6IWxEckDMPg\nPxKN8ejv4fSHg6+bAeiDd4ekhEzAH1fAmB88vhPZS9kswQhpC/t2KHVMU5jSA7gVeA+4RoTl0Bul\nXhgKE1vpTU8OmiZeh1SfU25ZP+mzhM5pBE8AVWtBcXfIbZScwXPhuMSZiqq/CxwEWovwtfP608Yi\nNIOnilhZwdzENdL913witDhRqYIXQ2ZZ3Uzo8WICh6PMWeki8Rg/dggaP6sUV4mwM4h6laIi0B/t\nb5LRiOmGOmdDgyaw73bo2NFDTKDAKJuRH3YkP8xIdLB412H49PlEzAsvByduT9jTZTB4k9HuAPh+\nQcdgcZX02Y8kJnhIquJH/6U3n6QuGRy+w+u4oXPt/jYamUShs9MtBznVrzaVqqMryIKo+99ZW/yZ\n2yAzQK4ORM6oOyp5w90pSC+dniIT/VKQhSAfgLwLMg2GFqVxIq+g/zK3DB57GYcUosMifImOm9MJ\n5Nj4/oh/ofyamLhMquJ1TP2dTzIGZErU89qb7PbjBvIayA3RySbKYpusATndjzaVKn86SP+oxyB1\ne/yb2yBzQX4ViJxRd1TyhrunOMYU3ahiuPpfqeOX2NXRaxHIpWhaYluQziDdYdCqxPeP2AZyM8hJ\n8XIcUbiv9wNZDCN3+fk1Yr1wl1gKbQE68mE+vD8S+m6If2bAJrh+iR8TE5dJVdIZU3/mkiiQtSAt\no57X3uRP6kPxOkjP6GWUMWg/ml+k26YSZZ6JTuPoe65Y/9vv39xGR+FsGoScGW7Td3/6fYR9ohQz\ngL+LUOStjg1firC09N1Krb4eii8oe/+O9cD1wBSl1q6GXg1hUs3YeUxeT6g8Ap6aAZtnumHwaFvq\n5KHw0P/Bzs2w/KNStsFl1jVeKU4BOsO//giT68SfAzx6Fgys6RPt7kPgGaWoIAm8o+1h19/bt7is\n3y2aos+wFgVcT0BISv/bRSjsneQQYbxSHADmKMWVImywu1ez7pq0cTAX+wOviQRk3/YV27f6yG4y\nNn23pgh0+NmhDupoAzcfLFXHQajexotMIFWg5+xkOxgP0RQ7gmwH6ZH+rqPt1sSytXnZw25kHchF\n6Y/pnfth9WyQGt7nSUq78KMgD0Y9p72/C0l3+vkg10UtY4m+vgNkI0hDm783A1kNw75K/p5IDsgG\nkCZRt8lZuz+ZCnf6ksELHX65ThByZvROP81MV4VAvdS3XZgLoyvBRGKsn9GVoDAXvZt1JZMIB5Q6\nLMl2MG6iKSpFH7RwPUSY5+QZDbsd9X8WQm6jUhFAi+HJWkpRWYTvndfxM1/fQSYtjcT9980D8Ojd\nwHyl6CLOAlIBJemscV9OcfGMlKIS2sejtYu2RY54lliVH2H4YfhrhVg7R+yGA1Xh921g04lKzViS\nCf4oIkxWih+A2UpN6Av5/XUbtm+FSd9B857AcHhmIewsPXa7ofhkpdpthZOOgdMVvLAT9kTbqBRQ\nii7QpBNMag0d7/Ehg5fJnOVhpewO8q/U99ntiLvO9153+gc6lg16FEgRyHnuZUh2DlD6S6NhA5B/\ngswCqeZCxv4grr8QkrR3GMg38PRvnLKLoM3LDuzC11IO2B+px2/gTp385TcFcPm/YeChzI419d4I\nGFFKxiH74PamsXtKzsUW70DfQzBC4p/pVZRJ7YqX+7oC6PAGFG4Hae1f+fI9SJVAZI+684IbFLkI\nZHXq++wUdIc9Xida+rROqYBOgbcM5AzvfeDcjGTV+QzIfLiukROlC+PawpjidKifZcvMH6jTN5bs\nu/6bYNptIENBJqLZKov0AjH2p1SHZ9aCNjj4OZc+FTb1vDxi+rD7e7d3Ey3cfsrmVxsS358n6W6Y\nwhnn0u937rd+9an1Lv6ESyq24/Kj7sDgBkaqg+xP1XF6AH+7J34A7xZYk9ZE8xrxEKSKZaN936uN\nO40+y4FPn4Nh36em0QXDt7dXFMM3oSN63osOvNUK5Exo/VIKu/DxaEZTzWD7zt/+SMUEsf/7vbut\neb8W5GWQe+CVXmVTKQb/VeCWzaLvvz/B/fbPRHEFTTu2dNe+oOTPaJt+OhBhr1LsRWebsmWGaBvz\nVSu9ePImr99dFiQApagJTEeHlrhRhINe6/cCEX5SakhFmHlsWe/fwnHEtefCcTC6fqmzkAT3uYUd\nS2XjFyIMKX23UivGQO5lSdhQPYDZEpC3aAx2XtNe+yMVc83u7/Omoxkv5wGXAo3h09/DlFP9k82v\nNiS6/3wyP4ZT4IHngrPnw9G707dWzIVO7GxROQzFf3J3yocvCkEewmUcfH9lcrY7g07z9RdR6S+k\njp7PQryORawf+3ys/SDiQkHPxgXrKeh+czc3Bn9nzxJz/mURnW+EF2/37kWZbtMPYadfjwCTzkfe\ngcEOjrwEckvq+8IPDZC4ztt3RD25nU5oaLne5r60JmuaNN1K6Fj/loOc1AbZSQkv5fD77XfrvJjp\nQM6Fwp36kDCxiTC22P1+J1w/y16Z2snW9+Og7MZlZXRKT65eVx9Wt90KXbZC8/yo34myMva9FIYH\ndogO0ghkZWDyR92BwQ6O/BGH3OzY5Oy/DO4JXPlGnZAieT/Y7zBj93VbkHj36J31VHYs3GeAAvl/\nkK7Wz/eBPBlev5VerG5ZD0v/ieZcd3HRBoU+0xnm8P6ZIB3dydZvI6xdgg4v4jh0QrZf6Kxrc+Cj\nKUFlKQNpAbI4qDYctTZ9C4VAeyc3lvDkrQBshL9UC1Iwv+2C/uUH3pMD6xV0fxOqn2jPNd6+Hopb\nJvBM3uBF/pLwch5SAnOBK5RiOjp+9e3pyuME+mzokmtgwmewci5s2az77fkiK8HNVCvvwTARdqQo\n7kbgZGCyw+qThla28y2BZzcDecBSpcgV4S2H9WUllEKhx2Q3NBsisiAoL2hj009jxbwCxPXOE2Qc\nyCPByuZncCZfo/u9ATImzDoDGPPFII3R3pyBmi9K1d3QzhYLchzIBJAjMZpU/JlO83xt1ug5R9Ng\nn3XsYQtSANI+DblbghSCTMWFn0a2XWjK8EqQ6gHX82uQ6YGVH3VHBtx5Z4Fs8fBcPXTYg8Bswf4q\n6nQTrh9RPv2Wwqi90OQcZ8/1bwxjD4bJ/U4tU5Nz4P5DMGwz3LoyTJnQUU5npbinGchyWF0AfYvi\nx3+EQJHruYCOAtsuTdmro/00vgBpHvU4ZtoFchXIFpBA55N+F2+aB3dtC+qdirwzAx6oHJADIMd5\neLaAgCMXxpTtnV/BgKX+c7rv/Arkl6ll8Hxw2g3k3ajH2Y+2+DTfbgd5ysF9lWDgssQL9YMeFm3/\nwvCCXG99jYyFOvXDdujKxAvkl9Ym0HX+CHf1hDN/I+/QEAbsM5ALPDx3c1gKDaQvaYQzsN/p37YK\nZKs+eJJeIJVjk+vnl3m9dkQr/ayj/AATQPKiHuPU/RDO4TjIn52YxvS9SRPjWJczSiXIPD8VEsiZ\nsOZDGHog08x34c8pOcn6+hkYfF3hzN/ylCPXK9YD9T089wbQTClq+yxPIqwAGnl5UB/gHq4KAw7B\nWGAjMQelV7oAtYH/RTvsbFLqk79Djzk6z+4b7WDm2fC09dwROD5QvpwEQemiQ+BOM6lQD+zDCcfj\niONSSRQTS1vtyiHJ1xy5ImyGQUXwp8plHboyI990GLAC9b0GTBfh6eBrDGf+ZovSdxBtMx6ic7++\nCvTzW6AE+AxooGOMO0cswmRBd3i1EtwHjDkAbd6CaR1E9hSJcFCE10XoCLSAqa3gsdrxL/P/AM+V\nKDm1wlGK49AL1UduZA4Wdoo0NG/Os3Gs9BMlGR+Lnm6uk8oHkCP3tKgX0EzAI8Ah4J5wqgtn/h7t\nlE1wHGI5IZ4GXleKcSJBJqmocRrc8QN8PU+pws+d0y0Tuf4/WQU6Fid6XoRCpb7dDlUviP9LVfTc\nBhcKpzmwQoT9qeUMC6vyILeFmwQ1PsOx0i9Lo9y8W+e4LzreQ0heX3f6Gu4TGB1NUIrBaLp3S3GV\nJCgdhDR/o7aZhWCT6wrytsdnFTrSZYfg5Et9eJM4161Utk/d6CXfbsv1bhxNQPJAJkQ9von7Mxin\nmRT94SjAX0B1Lwa5LOx5ebReIO2tw+wG4df9c7rXA9B5mmHveBvAC0E+8/78nAdg6IagGAz2SvhX\n/+RnLnfpl++O3VC4C+7a4i1OTTphn0u6/t/wQTYoAYfz7CKQNRHV/XEQNEs91g8chh6zs4W9g/a1\n2EaaFFgf5HgbpFsgZUfdySF0XlWLtuk6iJme9MGGpLVnceQdBinWvPlEir3jm14VuPewz9m7+3Mw\nz7qBvBNR3Z8QQBJtdCyjH718vUQRv9+H9p5gsf1yM0CWv4CMCqTsqBsXUgduATnT/XPBU6hS5D6t\nBr0WJjPhhGXOAMmBa6ZnYrygTLhAhoM8FlHdSwggj6ylBHe7f678bA5i70+P2XDXZvj0uahlsvq+\nH8g/gig7Gw5yIUbb3OzusTAoVPaHNyLsU2pDIRS3sDtQSzNOjS2sOCP10YdZ1nVxNcPosIUL5o7v\n8J29o5lhl02C5pWVmv2iu4Nlv3MLBIPE+ZUHt1HqrboZkGt4DTqxh+/IJqVfDx2MywWCZzCkTv4e\nHiNFKc4kTslTCZgFvAeMhA/GQ3HvbGV0pMDZwJyI6vaVvZNAGfaG37VSavwATQmmZonrpLL/b3d+\n+dgcJFqcHq8PX2bC4vQZ8EulyBGfmYPZpvRdIhyFm2y3nnpR8A4rU1db4Eq0kj8FmA0UAA8D60Ri\nykSpyCmRmYwod/o5+LrTT6QMp5wN46ejldFO4Dvr353W70r8/9M8KO6W+ZuDyJ35bCE689936BR+\nvs6rbFH6hUAntw/FFO7GKVD7Kti8A/6zMgD5UsqBDzsPpaiO9qJtj1b09dEetbOAqcDyZLuKIBeg\n8gzLFBa1ece3nb69Mlz7sUjqUOVKLRgOuRdm/ubg+BMy3BdhDTp/pFH6HuA1FIOFuufC4zlQtRYU\nd4fcRkrV6JDpyk4pKgMtiZlrLgY+Ru/k7wA+FvnZK8sRgjpDKOc4GTgkwn8iqt/nnX56Zs34zUHL\nTrCzCKbdkCnvi7VI3w+ja8AdRTC5boYuTkeU/ju+lhr1KXVIJ+FngGzz9mxmZriyaWdFkMtARqMz\nL+0FWQTyJ5AOIFWilvFouzT7o+sMGLk3KmqiRTM8z982+Zaf4XKQz71QpgPqK4UOjLcCpFZUznwO\nZb0V5Fm/y82Wnf5WoLpSVBNhn7tHM9fupxQ5wIXEzDWXA1+hzTV/A+aKsDs6CZ3Dv8xf4SHxgWdu\niwi+An0OuOarGe9DYB/QGfi3XzJ6gbXD/yvQBmgnwk7YA5n75boGGOR3oVmh9EX4SSk2oO2uLm3y\nmRODxJq0DYiZa9oBu9Hmmn8AA0XY7l994SjixNS5SJSnS2QMNdF3yqZfZjwRRCn+BgwjQqVvrnNP\nAAAACL1JREFUbZAeBy4CrpToTHFu8BlwnlIoER/PbKL+hAnxU2k6SHf3z0WemOMskFtAnkMn2N4M\n8oLlvFE7uHrDa3d5MqHFy23nTe0sDr6Pc+RLkIZR90cS+Y5F53XwzQTlsv6KIM+j80oEmuowANm3\ngJzlZ5lZsdO34DHEcslP3XMvgNPqwbyrgtqBKsXJxNMoaxKjUT4EfC7id0TFRAhzF5u5JrTkiP4r\nUH8lDakFG1/QjnyZZxYT4QeleBIYCgwOs24rJv6LwInA1ZJRUWEd4chh7te+lRj1ShbiijksXTd5\n6xCoAGSQj3LVALkWZBI6oucekHdA7gK5JKoDMLhxXli7WJ0qMtFOf/Q+dHaupkQQvTK13FF/BZan\ncAdyGsgukBNDrPNYkLesr/zKUfeBt/EdvBZyP/fzkDmbdvqF6MMkzxBBlGIUOsb+S6ITrbiCRaNs\nRcwufxGsXQ4Tq8KhH6FwOqwYE+VuTWcLq3dR0LvYGHVuVLXE1Lmmd6APp18BcpTiVXQmo+UiYXzt\nJEf8V+AVXWHtAijIDW/s7L7Gdk9RitFoO/9h61+7n53+7qd0+lyErUrxNvpgcoLXcpxCKaoAb6In\n0w0iHAy6Tj8RO+eacOScq6Ff51xKryhHP5TifCBfhHN9KOsNYJFI6smrFBWBpsTMNc2BVWhzTQG0\n/BoavFPWkWVaJIeYSnEOMBPmPgdTe8fLNeYgrGssMmO1D/UoYDzwa6AD1KiilVhZtoh17yXAjdZ1\nEJ3V7DURVqUrix9Qir+jF6PJ4dXZo0CnvCyN+/bBnwuBCmhmT06JnxP9LtXfKxBzAHO1UJT6e0NL\nwLXoMfS0+Dh45jjgJquuJ6y6gqgnwGeufhhe71p209XxJZEFaZlXs2mnXwTUUYoKkn4mnDxgjlJM\nlVIsAIsl0Ih4GmURmkb5CJpGuSd2v3rRxnZeoFSPoqDpi/EMnR/2w6PNoN4okSueUarLs/G0vcnA\npZOU4tfi0qkrvk4UMBGLgSTCt8moc9YOcymw1PrSaoZW/jOUYg96AXhVhHWp2xhYfy4FmvhcZgrY\nnSnMnSbi77mLNWaK9BeSBejxyk/xvJfFKQdtu59kiT0MvVClev6YNOtMd0FN8MyltQM754rabhWu\njUy+AfmFT2U9BYsf07a2Xguhz2JY+TbIDssZ5QmQniCnJC/HjgFys8CDAmsCZM0ksgnfusWuLosF\n8Y5uuzcbO0gOyGMgH6Vr37XKagXyN2tsl1mOafVj7WueD9fvhzyBoji7t58x39FOcUvCnc/lx6Zf\nop96gswLqOyT0AllJmeKM5j3tgTHaIu8ceF2pMwDaetDOWfBgglwt8S/cLdtg3ta+jO4D1r/3m0p\nfv/pi3Dl6+4zb0k1kE9B8jz0Ww7IVJD5IMf7PLYVQH5lvfDbYN0KyP02fnzuLqH4m+f7qTBBjkOn\nSzwm3DmduR6lNv1UEU09buxzuaeCLAeZmImH/t7GNZgFPfLGhduR8jzIAA/PnWLtUJ6wdvE7YGiR\nHytx4sE9opyO/P9Bgb5L0p3M6ExIV6DDMiyBvENeGDoWE2MDvHeX052ypZSfB/kApFrA41wRrptp\nv5iKwLXb9e7/fut3RZ7GL34cR+6Cmz8qD8o3ygtkJMjzPpZ3BsgakD8cDQo/1q5gFvRssumDQ66+\nUtQAriBml6+LjsVfgPbqWwlfvw9V68Q/6d7mFs8AqXcTNMzRuROOFF0VOAScUR9YpBQPA9NEOOzE\nVq0Uv0CzljpbbSkEZgBDYfZgKO7llqEjwlalJt0Km9+FmRVSedFaXOkX0D4H10jAXGkRflSKColt\noj9Zsh46Ge4jJvsD6H5vfbVSPAN8A2wpfYnwQ+n6YkyLsSdA1WZQ3Kx8eBRHhqlAoVLUEmFbOgVp\nphmzgGdF+JMv0mUIAgtuGPVqFu6q2Xs+jNhaetUEqQJyJch4kIUg+0BmWfbhFiCVypbnv80NRnyd\nuMwOe+D0eiDXgSwGWQfvj4Q+hWU//y4+x2rLBJBVIN+CvAzSB6RW2T7x9gnptP0gx4C8iT4LCI0r\nbS9fnsBNe7XJLNHfes5GB7q6H+RxNM97sWWS+AHkO6tfZ6I9ox+Gfp+UR4/iKC9Y+hIMWp7OeQpI\nPf3FKSOibk95uiIXIJRGJlRuAzbBgoloZ6t9IAtAxoG0c6KcEpc5/CCsngVSz5uMt3wBNxyMP3T8\n7R6o3iZ2nyiQtjqfZyJFM/agtXA9ANIcpELqer0kSbc7gO46P2byafOy1R/5RGLrLj0+vffDJfnQ\naX5i2XvsT2GiygE5GaQRSCeQviCjYOgmL2aybL302PTb6HazEX/w3nkafLkZZHDU7SlvV+QChNJI\n211f7hq0N6yneBxlFeb5DUHus3bXY/WuO7XNO7mCsnvGTun2nBttn157KL4dQ/ZCwwbRjHviBc1e\n9ub5/vaF2em766/WLyUfy9LvyG3bzNmJh/6PWoBQGhlyYCyQOrDqXb3zLzlJb1kPEztY5pc+IPeC\n/NXLoXDUiibxS3jTnsRmk8xSfn4zI8ojdTLa/rd7H8f+ZG2Y1oDMBnkV5FGQPOizyCys/lxZcpAb\nbmAsETYqdeu3MLNS2Tyj494AlhA7KPwK9u9z74gRbb7axDHXq58N57WKvzPzAqf5nfbRpJF0C7v3\nseAV+MNwoBZwqvWv9XPN4JyVsg1RrzphXFHsxNx8XXjdtWcaRzvqrw9zlY/Ly/to5paP/R+1AKE1\nNGQF6WaSHi3mgaOlHeYK/nL7Ppq55d+VNQHXDAwMDAx0cB8DAwMDgyyBUfoGBgYGWQSj9A0MDAyy\nCEbpGxgYGGQRjNI3MDAwyCIYpW9gYGCQRTBK38DAwCCLYJS+gYGBQRbBKH0DAwODLIJR+gYGBgZZ\nBKP0DQwMDLIIRukbGBgYZBGM0jcwMDDIIhilb2BgYJBFMErfwMDAIItglL6BgYFBFsEofQMDA4Ms\nglH6BgYGBlkEo/QNDAwMsgj/Bd7vYgV5PruUAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "299 city tour with length 11598.6 in 1.285 secs for repeat_100_nn_tsp\n" ] } ], "source": [ "plot_tsp(nn_tsp, Cities(300))\n", "plot_tsp(repeat_10_nn_tsp, Cities(300))\n", "plot_tsp(repeat_100_nn_tsp, Cities(300))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we add more starting cities, the run times get longer and the tours get shorter.\n", "\n", "I'd like to understand the tradefoff better. I'd like to have a way to compare different algorithms (or different choices of parameters for one algorithm) over *multiple* trials, and summarize the results. That means we now have a new vocabulary item:\n", "\n", "# New Vocabulary: \"Maps\"\n", "\n", "\n", "We use the term *cities* and the function Cities to denote a set of cities. But now I want to talk about multiple trials over a collection of sets of cities: a plural of a plural. English doesn't give us a good way to do that, so it would be nice to have a *singular* noun that is a synonym for \"set of cities.\" We'll use the term \"map\" for this, and the function Maps to create a collection of maps. Just like Cities, the function Maps will give the same result every time it is called with the same arguments." ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def Maps(num_maps, num_cities):\n", " \"Return a tuple of maps, each consisting of the given number of cities.\"\n", " return tuple(Cities(num_cities, seed=(m, num_cities))\n", " for m in range(num_maps))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Benchmarking\n", "\n", "The term *benchmarking* means running a function on a standard collection of inputs, in order to compare its performance. We'll define a general-purpose function, benchmark, which takes a function and a collection of inputs for that function, and runs the function on each of the inputs. It then returns two values: the average time taken per input, and the list of results of the function." ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [], "source": [ "@functools.lru_cache(None)\n", "def benchmark(function, inputs):\n", " \"Run function on all the inputs; return pair of (average_time_taken, results).\"\n", " t0 = time.clock()\n", " results = [function(x) for x in inputs]\n", " t1 = time.clock()\n", " average_time = (t1 - t0) / len(inputs)\n", " return (average_time, results)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note: Each time we develop a new algorithm, we would like to compare its performance to some standard old algorithms.\n", "The use of @functools.lru_cache here means that we don't need to to re-run the old algorithms on a standard data set each time; we can just cache the old results. \n", "\n", "We can use benchmark to see the average call to the absolute value function takes less than a microsecond:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(5.00000000069889e-07,\n", " [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "benchmark(abs, range(-10, 10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And we can see that alltours_tsp can handle 6-city maps in under a millisecond each:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(0.00032370000000003785,\n", " [[(574+214j), (236+141j), (556+348j), (677+277j), (833+33j), (578+224j)],\n", " [(433+6j), (396+143j), (527+431j), (167+227j), (113+100j), (127+105j)],\n", " [(571+206j), (724+42j), (703+269j), (797+331j), (543+474j), (310+248j)],\n", " [(12+30j), (344+45j), (693+77j), (548+186j), (279+508j), (171+229j)],\n", " [(243+271j), (379+72j), (859+331j), (840+411j), (651+478j), (8+369j)],\n", " [(672+502j), (820+460j), (887+489j), (853+65j), (422+69j), (433+135j)],\n", " [(38+119j), (644+90j), (622+288j), (602+511j), (509+424j), (275+536j)],\n", " [(18+208j), (832+456j), (483+477j), (314+533j), (314+539j), (23+596j)],\n", " [(274+560j), (213+594j), (248+84j), (550+317j), (508+577j), (377+575j)],\n", " [(813+467j), (438+216j), (270+118j), (71+18j), (125+320j), (199+578j)]])" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "benchmark(alltours_tsp, Maps(10, 6))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Benchmarking Specifically for TSP Algorithms\n", "\n", "Now let's add another function, benchmarks, which builds on benchmark in two ways:\n", "\n", "1. It compares multiple algorithms, rather than just running one algorithm. (Hence the plural benchmarks.)\n", "2. It is specific to TSP algorithms, and rather than returning results, it prints summary statistics: the mean, standard deviation, min, and max of tour lengths, as well as the time taken and the number and size of the sets of cities." ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def benchmarks(tsp_algorithms, maps=Maps(30, 60)):\n", " \"Print benchmark statistics for each of the algorithms.\" \n", " for tsp in tsp_algorithms:\n", " time, results = benchmark(tsp, maps)\n", " lengths = [tour_length(r) for r in results]\n", " print(\"{:>25} |{:7.0f} ±{:4.0f} ({:5.0f} to {:5.0f}) |{:7.3f} secs/map | {} ⨉ {}-city maps\"\n", " .format(tsp.__name__, mean(lengths), stdev(lengths), min(lengths), max(lengths),\n", " time, len(maps), len(maps[0])))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How Many Starting Cities is best for nn_tsp?\n", "---\n", "\n", "Now we are in a position to gain some insight into how many repetitions, or starting cities, we need to get a good result from nn_tsp." ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def repeat_25_nn_tsp(cities): return repeated_nn_tsp(cities, 25)\n", "def repeat_50_nn_tsp(cities): return repeated_nn_tsp(cities, 50)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " nn_tsp | 5668 ± 488 ( 4674 to 6832) | 0.001 secs/map | 30 ⨉ 60-city maps\n", " repeat_10_nn_tsp | 5232 ± 374 ( 4577 to 6172) | 0.006 secs/map | 30 ⨉ 60-city maps\n", " repeat_25_nn_tsp | 5159 ± 394 ( 4620 to 6069) | 0.014 secs/map | 30 ⨉ 60-city maps\n", " repeat_50_nn_tsp | 5118 ± 386 ( 4512 to 6069) | 0.029 secs/map | 30 ⨉ 60-city maps\n", " repeat_100_nn_tsp | 5113 ± 384 ( 4512 to 6069) | 0.034 secs/map | 30 ⨉ 60-city maps\n" ] } ], "source": [ "algorithms = [nn_tsp, repeat_10_nn_tsp, repeat_25_nn_tsp, repeat_50_nn_tsp, repeat_100_nn_tsp]\n", "\n", "benchmarks(algorithms, Maps(30, 60))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that adding more starting cities results in shorter tours, but you start getting diminishing returns after 50 repetitions.\n", "\n", "Let's try again with bigger maps:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " nn_tsp | 7789 ± 458 ( 6877 to 8632) | 0.002 secs/map | 30 ⨉ 120-city maps\n", " repeat_10_nn_tsp | 7316 ± 334 ( 6646 to 7870) | 0.021 secs/map | 30 ⨉ 120-city maps\n", " repeat_25_nn_tsp | 7242 ± 287 ( 6725 to 7870) | 0.053 secs/map | 30 ⨉ 120-city maps\n", " repeat_50_nn_tsp | 7189 ± 295 ( 6646 to 7742) | 0.106 secs/map | 30 ⨉ 120-city maps\n", " repeat_100_nn_tsp | 7173 ± 289 ( 6646 to 7736) | 0.213 secs/map | 30 ⨉ 120-city maps\n" ] } ], "source": [ "benchmarks(algorithms, Maps(30, 120))" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " nn_tsp | 8668 ± 485 ( 7183 to 9636) | 0.003 secs/map | 30 ⨉ 150-city maps\n", " repeat_10_nn_tsp | 8220 ± 364 ( 7290 to 9197) | 0.033 secs/map | 30 ⨉ 150-city maps\n", " repeat_25_nn_tsp | 8117 ± 326 ( 7222 to 8918) | 0.083 secs/map | 30 ⨉ 150-city maps\n", " repeat_50_nn_tsp | 8086 ± 300 ( 7237 to 8676) | 0.166 secs/map | 30 ⨉ 150-city maps\n", " repeat_100_nn_tsp | 8062 ± 284 ( 7174 to 8603) | 0.331 secs/map | 30 ⨉ 150-city maps\n" ] } ], "source": [ "benchmarks(algorithms, Maps(30, 150))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The results are similar. So depending on what your priorities are (run time versus tour length), somewhere around 25 or 50 repetitions might be a good tradeoff.\n", "\n", "Next let's try to analyze where nearest neighbors goes wrong, and see if we can do something about it." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# A Problem with Nearest Neighbors: Outliers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Consider the 20-city map that we build below:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "outliers_list = [City(2, 2), City(2, 3), City(2, 4), City(2, 5), City(2, 6), \n", " City(3, 6), City(4, 6), City(5, 6), City(6, 6), \n", " City(6, 5), City(6, 4), City(6, 3), City(6, 2), \n", " City(5, 2), City(4, 2), City(3, 2), \n", " City(1, 6.8), City(7.8, 6.4), City(7, 1.2), City(0.2, 2.8)]\n", "\n", "outliers = set(outliers_list)\n", "\n", "plot_lines(outliers, 'bo')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see what a nearest neighbor search does on this map:" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "20 city tour with length 38.8 in 0.000 secs for nn_tsp\n" ] } ], "source": [ "plot_tsp(nn_tsp, outliers)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The tour starts out going around the inner square. But then we are left with long lines to pick up the outliers. \n", "Let's try to understand what went wrong. First we'll create a new tool to draw better diagrams:" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def plot_labeled_lines(points, *args):\n", " \"\"\"Plot individual points, labeled with an index number.\n", " Then, args describe lines to draw between those points.\n", " An arg can be a matplotlib style, like 'ro--', which sets the style until changed,\n", " or it can be a list of indexes of points, like [0, 1, 2], saying what line to draw.\"\"\"\n", " # Draw points and label them with their index number\n", " plot_lines(points, 'bo')\n", " for (label, p) in enumerate(points):\n", " plt.text(p.x, p.y, ' '+str(label))\n", " # Draw lines indicated by args\n", " style = 'bo-'\n", " for arg in args:\n", " if isinstance(arg, str):\n", " style = arg\n", " else: # arg is a list of indexes into points, forming a line\n", " Xs = [points[i].x for i in arg]\n", " Ys = [points[i].y for i in arg]\n", " plt.plot(Xs, Ys, style)\n", " plt.axis('scaled'); plt.axis('off'); plt.show() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the diagram below, imagine we are running a nearest neighbor algorithm, and it has created a partial tour from city 0 to city 4. Now there is a choice. City 5 is the nearest neighbor. But if we don't take city 16 at this point, we will have to pay a higher price sometime later to pick up city 16. " ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nmpklcGmamSVwaZqZJXBpmpklcGmamSVwaZqZJXBpmpklcGmamSVwaZqZJXBpmpklcGmamSVwaZqZ\nJXBpmpklcGmamSVwaZqZJXBpmpklcGmamSVwaZqZJXBpmpklcGmamSVwaZqZJXBpmpklcGmamSVw\naTYRSWsl/ULS3ZKulLRP2ZmstUlaLuk+STskHVzz2Ofyx+6S9NKyMrYal2ZzWRsRL4iI44DZwHvK\nDmQtbx1wKvBA9aCkNwJdEfEnwF8Cq0vI1pJmlh3AxkTEt6vu3g4cWVYWaw8RsQFAkmoeWgysyde5\nTdKBkg6PiIeLzthqvKXZhCTNBM4Fvr27dc320BHA5qr7D+VjthsuzYJIlV6pZxAuQuoZlCq9E6x+\nGfD9iLilqHzWeqRKp9SzVlrSl91WOsvONB1497wAWUEu7oPVs6ADuPBoWNYnVRZGDK/beV39PXBo\nRLyvnLTWCrKCXHwTrO7K5tQIsOxkqbIoYnjTOE+JmvsPAc+pun9kPma74S3NQnSvGStMyG5Xz8rG\nx0h6D/B64O1FJ7RW071yrDAhn1Nd2fi4lC+jvg4sBZB0MrDNxzMnx6VZiHlzxyb3qI58fCeXA4cB\nt0q6U9KKQuJZC5q/oM6cWlA9IukCSZvJjldukHQFQET8N7BR0v3AvwN/VUDotuDd80Js3QYjB+08\nyUfy8TERMavYXNa6tgxlc2iXOTVUvVZErAJWjfcdIuL9jcvXvrylWYj+pbBsezapIT/+tD0bN9sT\n/Stg2UDNnBrIxq2RFFF7fNgaITsZ1L0GTjsabtwI/UtrTwKZpchOBnWvzHbJtw5B/4o6J4FsCrk0\nCyYREdReaGxmLcK752ZmCVyaZmYJXJpmZglcmmZmCVyaZmYJXJpmZglcmmZmCVyaZmYJXJpmZglc\nmmZmCVyaZmYJXJpmZglcmmZmCVyaZmYJXJpmZglcmmZmCVyaZmYJXJpmZglcmmZmCVyaZmYJXJpm\nZglcmmZmCVyaZmYJXJpmZglcmmZmCVyaTUTSckn3Sdoh6eCy81jrqzenJB0r6YeSnpL012VmbDUu\nzeayDjgVeKDsINY26s2pR4ELgE8XnqjFzSw7gI2JiA0AklR2FmsP9eZURDwCPCLp9FKCtTBvaZqZ\nJXBpFkSq9Eo9g3ARUs+gVOktO5O1NqnSKfWslZb0ZbeVzrIzTQfePS9AVpCL+2D1LOgALjwalvVJ\nlYURw+vGeUoUndFaS1aQi2+C1V3ZnBoBlp0sVRZFDG8a5ymeU1PEW5qF6F4zVpiQ3a6elY2PS/li\nVkf3yrHChHxOdWXj45poTnmuJSi9NCe4JGKupK9K2iDpVkkvKjPn3pk3d2xyj+rIx8dIukDSZuAI\nYIOkK4pKaK1m/oI6c2pB9Ui9OSXp8Hz8Q8DfSXpQ0gFFJG91zbB7vg74BvC9mvGPAesj4ixJxwKX\nAosKzjZFtm6DkYN2nuQj+fiYiFgFrCo0mrWoLUPZHNplTg1Vr1VvTkXEw8BzGhqxTZW+pRkRGyLi\nQXbdRXgR0Jev80ugU9Kzi843NfqXwrLt2aSG/PjT9mzcbE/0r4BlAzVzaiAbt0Zqhi3NejYAZwG3\nSDoJOAo4Evi/UlPtgYjhdVJlIQysgdOOhhs3Qv/SOieBzHYrYniTVFkEAyuzXfKtQ9C/os5JIJtC\nimiOk2qSNgIvi4jH8vtzgM8CLwV+CrwAeG9E3F1eyr0nERE+8G7Wqhq6pZldFtG9MjtovWV3vwl3\nau+I+B1w3tj30kZgsGFhzcwmoWGluQfXke10SYSkA4EnImK7pPcC34+IxxuV18xsMhp4Imhy15FN\ncJnNC4F+SfcArwc+0LisZmaT08Dd88ldRzbBJRG3Asc2Lp+ZWboGbmmOXkdWbdfryMzMWkkDS9PX\nkZlZ+2noJUdjZ899HdkoX3Jk1tqa5jrN6cKladbaSv8zSjOzVuLSNDNL4NI0M0vg0jQzS+DSNDNL\n4NI0M0vg0jQzS+DSNDNL4NI0M0vg0jQzS+DSNDNL4NI0M0vg0jQzS+DSNDNL4NI0M0vg0jQzS+DS\nNDNL4NJsIpI6Jd0q6V5JX5TUwE8LnXSm5ZLuk7RD0sFV46+WtE3SnflS2Gc/1ctU9fgrJG2XdFZR\nmSbKJekMSRskrZd0u6RXNUGmd+SZNkhaJ+klRWVqdS7N5vIvwCURcQywDXh3yXkA1gGnAg+M89jN\nEXFivqwc5/HCM0maAXwS+E6BeUbVy3VTRBwfESeQ/Zte2QSZBoE/i4jjgZXAFwrM1NJcms1lIXBd\n/vU1wJklZgEgIjZExIMw7ucalfJZR7vJdAHwFeDXxaaqnysinqi6ewDwTBNkujUifpvfvRU4oqhM\nrc6l2SQkHQL8JiJGf6B+BSwoMdJknCLpLknflPSissNIWgC8JSIup6RCr0fSWyTdA3wDOK/sPDXe\nA3yr7BCtovRjZtay7gCOiognJL0RuB44puRMnwE+WnW/aYozIq4HrpfUS7Y7fFrJkQCQ9FrgXUBv\n2Vlahbc0CyJVeqWeQbgIqWdQquw0SSPiUWBufkwO4EjgoQZn6pR61kpL+rLbSucEq+/0Wc8R8fjo\nbmdEfAuYNd5JmSIzAS8H/kPSRuCtwKWSztjbTFOQa+yBiHXA85rgtULSccAVwBkR8Zu9zTNtRISX\nBi8wpxfOeRoeD4jIbs95Gub07rwe/wm8Lf/6cmBZAzN1wjn312S6H+Z0jr8+G4FDqu4fXvX1ScCm\nsjPVPHY1cFaTvFZdVV+fCGxugkxHAfcBJzdqjrXrUnqA6bDAKYNjkzuqJvkpgzuvx9HAbcC9eYHO\namCmtXUyra3JdAGwGXia7DjrFfn4cqAfWA/8EHhl2Zlq1rlq6kpzr1+rC/PX6k7gFuCUJsj0BeDR\nPNN64Payf05aZSk9wHRY4MzHdp7co8uZj5WX6ay+Opn6nKn5czVjpumy+JhmIbZug5GasZF8vCxb\nhupkGiojTaYZM0Fz5mrGTNNE2a09HZbJHtMsOFNnyjGx6ZqpWXM1Y6bpsij7B7BGy86Wd6+BeXOz\nLcz+pRHD60rO1AndK2HegmwLpX9FxPAmZ2qNXM2YaTpwaZqZJfAxTTOzBC5NM7MELk0zswQuTTOz\nBC5NM7MELk0zswQuTTOzBC5NM7MELk0zswQuTTOzBC5NM7MELk0zswQuTTOzBC5NM7MELk0zswQu\nTTOzBC5NM7MELk0zK5Sk5ZLuk7RD0sFV4xVJX5d0l6SfSnpniTHrcmmaWdHWAacCD9SMLwd+FhEv\nBV4LXCJpZtHhdqfpAplZe4uIDQCSVPsQMCf/eg7waET8ochsk+HSNLNm8Xng65KGgAOAt5WcZ1ze\nPTezKSNVOqWetdKSvuy20pnw9NcD6yNiAXACcKmkAxoSdC94S9PMpkRWkItvgtVd0AGMAMtOliqL\n6nwee+3nh78L+GeAiBiQtBF4AfCTBsZO5i1NM5si3SvHChOy29Vd2fi4lC+jHgAWAUg6HDgGGGxU\n2j3l0jSzKTJ/wVhhjuoA5i2oHpF0gaTNwBHABklX5A+tBHok3Q3cCFwYEY81OnUq756b2RTZMpTt\nklcX5wiwdah6rYhYBayqfXZEbCE7rtnUvKVpZlOkfwUsG8iKEvJjmgPZePtQRO2xWDOzPZOdDOpe\nme2Sbx2C/hV1TgK1LJemmVkC756bmSVwaZqZJXBpmpklcGmamSVwaZqZJXBpmpklcGmamSVwaZqZ\nJXBpmpklcGmamSVwaZqZJXBpmpklcGmamSVwaZqZJXBpmpklcGmamSVwaZqZJXBpmpklcGmamSVw\naZqZJXBpmpklcGmamSVwaZqZJXBpmpkl+H8nmwKHqbW4/gAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_labeled_lines(outliers_list, 'bo-', [0, 1, 2, 3, 4], 'ro--', [4, 16], 'bo--', [4, 5])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It seems that picking up an outlier is *sometimes* a good idea, but sometimes going directly to the nearest neighbor is a better idea. So what can we do? It is difficult to make the choice between an outlier and a nearest neighbor while we are constructing a tour, because we don't have the context of the whole tour yet. So here's an alternative idea: don't try to make the right choice while constructing the tour; just go ahead and make any choice, then when the tour is complete, *alter* it to correct problems caused by outliers (or other causes)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# New Vocabulary: \"Segment\"\n", "\n", "\n", "We'll define a *segment* as a subsequence of a tour: a sequence of consecutive cities within a tour. A tour forms a loop, but a segment does not have a loop; it is open-ended on both ends. So, if [A, B, C, D] is a 4-city tour, then segments include [A, B], [B, C, D], and many others. Note that the segment [A, B, C, D] is different than the tour [A, B, C, D]; the tour returns from D to A but the segment does not. \n", "\n", "# Altering Tours by Reversing Segments\n", "\n", "\n", "One way we could try to improve a tour is by *reversing* a segment. Consider this tour:" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cross = [City(9, 3), City(3, 10), City(2, 16), City(3, 21), City(9, 28), \n", " City(26, 3), City(32, 10), City(33, 16), City(32, 21), City(26, 28)]\n", "\n", "plot_labeled_lines(cross, range(-1,10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is clearly not an optimal tour. We should \"uncross\" the lines, which can be achieved by reversing a segment. The tour as it stands is [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]. If we reverse the segment [5, 6, 7, 8, 9], we get the tour [0, 1, 2, 3, 4, 9, 8, 7, 6, 5], which is the optimal tour. In the diagram below, reversing [5, 6, 7, 8, 9] is equivalent to deleting the red dashed lines and adding the green dotted lines. If the sum of the lengths of the green dotted lines is less than the sum of the lengths of the red dashed lines, then we know the reversal is an improvement." ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_labeled_lines(cross, 'bo-', range(5), range(5, 10), \n", " 'g:', (4, 9), (0, 5), \n", " 'r--', (4, 5), (0, 9))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we see that reversing [5, 6, 7, 8, 9] works:" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tour = Tour(cross)\n", "tour[5:10] = reversed(tour[5:10])\n", "plot_tour(tour)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is how we can check if reversing a segment is an improvement, and if so to do it:" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def reverse_segment_if_better(tour, i, j):\n", " \"If reversing tour[i:j] would make the tour shorter, then do it.\" \n", " # Given tour [...A-B...C-D...], consider reversing B...C to get [...A-C...B-D...]\n", " A, B, C, D = tour[i-1], tour[i], tour[j-1], tour[j % len(tour)]\n", " # Are old edges (AB + CD) longer than new ones (AC + BD)? If so, reverse segment.\n", " if distance(A, B) + distance(C, D) > distance(A, C) + distance(B, D):\n", " tour[i:j] = reversed(tour[i:j])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's write a function, alter_tour, which finds segments to swap. What segments should we consider? I don't know how to be clever about the choice, but I do know how to be fairly thorough: try all segments of all lengths at all starting positions. I have an intuition that trying longer ones first is better (although I'm not sure). \n", "\n", "I worry that even trying all segements won't be enough: after I reverse one segment, it might open up opportunities to reverse other segments. So, after trying all possible segments, I'll check the tour length. If it has been reduced, I'll go through the alter_tour process again." ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def alter_tour(tour):\n", " \"Try to alter tour for the better by reversing segments.\"\n", " original_length = tour_length(tour)\n", " for (start, end) in all_segments(len(tour)):\n", " reverse_segment_if_better(tour, start, end)\n", " # If we made an improvement, then try again; else stop and return tour.\n", " if tour_length(tour) < original_length:\n", " return alter_tour(tour)\n", " return tour\n", "\n", "def all_segments(N):\n", " \"Return (start, end) pairs of indexes that form segments of tour of length N.\"\n", " return [(start, start + length)\n", " for length in range(N, 2-1, -1)\n", " for start in range(N - length + 1)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is what the list of all segments look like, for N=4:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[(0, 4), (0, 3), (1, 4), (0, 2), (1, 3), (2, 4)]" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_segments(4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that altering the cross tour does straighten it out:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_tour(alter_tour(Tour(cross)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Altered Nearest Neighbor Algorithm (altered_nn_tsp)\n", "----\n", "\n", "Let's see what happens when we alter the output of nn_tsp:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def altered_nn_tsp(cities):\n", " \"Run nearest neighbor TSP algorithm, and alter the results by reversing segments.\"\n", " return alter_tour(nn_tsp(cities))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's try this new algorithm on some test cases:" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "10 city tour with length 93.2 in 0.000 secs for altered_nn_tsp\n" ] } ], "source": [ "plot_tsp(altered_nn_tsp, set(cross))" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "10 city tour with length 2333.4 in 0.000 secs for altered_nn_tsp\n" ] } ], "source": [ "plot_tsp(altered_nn_tsp, Cities(10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It fails to get the optimal result here. Let's try benchmarking:" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " nn_tsp | 5668 ± 488 ( 4674 to 6832) | 0.001 secs/map | 30 ⨉ 60-city maps\n", " repeat_50_nn_tsp | 5118 ± 386 ( 4512 to 6069) | 0.029 secs/map | 30 ⨉ 60-city maps\n", " altered_nn_tsp | 4820 ± 233 ( 4450 to 5346) | 0.008 secs/map | 30 ⨉ 60-city maps\n" ] } ], "source": [ "algorithms = [nn_tsp, repeat_50_nn_tsp, altered_nn_tsp]\n", "\n", "benchmarks(algorithms)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is quite encouraging; altered_nn_tsp gives shorter tours and is faster than repeating nearest neighbors from 50 starting cities. Could we do better?\n", "\n", "Altered Repeated Nearest Neighbor Algorithm (altered_repeated_nn_tsp)\n", "---\n", "\n", "We have seen that the *nearest neighbor* algorithm is improved by both the *alteration* and *repetition* strategies. So why not apply both strategies? " ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def repeated_altered_nn_tsp(cities, repetitions=20): \n", " \"Use alteration to improve each repetition of nearest neighbors.\"\n", " return shortest_tour(alter_tour(nn_tsp(cities, start)) \n", " for start in sample(cities, repetitions))\n", "\n", "def repeat_5_altered_nn_tsp(cities): return repeated_altered_nn_tsp(cities, 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see it in action:" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "100 city tour with length 5701.6 in 0.541 secs for repeated_altered_nn_tsp\n" ] } ], "source": [ "plot_tsp(repeated_altered_nn_tsp, Cities(100))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That looks like a good tour. Let's gather more data:" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " nn_tsp | 5668 ± 488 ( 4674 to 6832) | 0.001 secs/map | 30 ⨉ 60-city maps\n", " repeat_50_nn_tsp | 5118 ± 386 ( 4512 to 6069) | 0.029 secs/map | 30 ⨉ 60-city maps\n", " altered_nn_tsp | 4820 ± 233 ( 4450 to 5346) | 0.008 secs/map | 30 ⨉ 60-city maps\n", " repeated_altered_nn_tsp | 4640 ± 194 ( 4298 to 4991) | 0.148 secs/map | 30 ⨉ 60-city maps\n", "----------------------------------------------------------------------------------------------------\n", " nn_tsp | 7789 ± 458 ( 6877 to 8632) | 0.002 secs/map | 30 ⨉ 120-city maps\n", " repeat_50_nn_tsp | 7189 ± 295 ( 6646 to 7742) | 0.106 secs/map | 30 ⨉ 120-city maps\n", " altered_nn_tsp | 6589 ± 202 ( 6188 to 7016) | 0.036 secs/map | 30 ⨉ 120-city maps\n", " repeated_altered_nn_tsp | 6402 ± 185 ( 6015 to 6779) | 0.701 secs/map | 30 ⨉ 120-city maps\n" ] } ], "source": [ "algorithms = [nn_tsp, repeat_50_nn_tsp, altered_nn_tsp, repeated_altered_nn_tsp]\n", "\n", "benchmarks(algorithms)\n", "print('-' * 100)\n", "benchmarks(algorithms, Maps(30, 120))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So, alteration gives the most gain, but alteration plus repetition gives a modest improvement in tour length, at the cost of 20 times more run time. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Non-Random Maps\n", "====" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I thought it would be fun to work on some *real* maps, instead of random maps. First I found [a page](http://www.realestate3d.com/gps/latlong.htm) that lists geographical coordinates of US cities. Here is an excerpt from that page:\n", "\n", "
\n",
"[TCL]  33.23   87.62  Tuscaloosa,AL\n",
"[FLG]  35.13  111.67  Flagstaff,AZ\n",
"[PHX]  33.43  112.02  Phoenix,AZ\n",
"
\n", "\n", "I also found a [blog post](http://www.randalolson.com/2015/03/08/computing-the-optimal-road-trip-across-the-u-s/) by Randal S. Olson who chose 50 landmarks across the states and found a tour based on actual road-travel distances, not straight-line distance. His data looks like this:\n", "\n", "
\n",
"Mount Rushmore National Memorial, South Dakota 244, Keystone, SD\t43.879102\t-103.459067\n",
"Toltec Mounds, Scott, AR\t34.647037\t-92.065143\n",
"Ashfall Fossil Bed, Royal, NE\t42.425000\t-98.158611\n",
"
\n", "You can't see, but fields are separated by tabs in this data.\n", "\n", "Now we have a problem: we have two similar but different data formats, and we want to convert both of them to Maps (sets of cities). Python provides a module, [csv](https://docs.python.org/3/library/csv.html) (for \"comma-separated values\"), to parse data like this. The function csv.reader takes an input that should be an iterable over lines of text, and optionally you can tell it what character to use as a delimiter (as well as several other options). For each line, it generates a\n", "list of fields. For example, for the line \"[TCL] 33.23 87.62 Tuscaloosa,AL\" it would generate the list ['[TCL]', '33.23', '87.62', 'Tuscaloosa,AL'].\n", "\n", "I define the function Coordinate_map to take an iterable of lines (a file object or a list of strings), parse it with csv_reader, pick out the latitude and longitude columns, and build a City out of each one:" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def lines(text): return text.strip().splitlines()\n", "\n", "def Coordinate_map(lines, delimiter=' ', lat_col=1, long_col=2, lat_scale=69, long_scale=-48):\n", " \"\"\"Make a set of Cities from an iterable of lines of text.\n", " Specify the column delimiter, and the zero-based column number of lat and long.\n", " Treat long/lat as a square x/y grid, scaled by long_scale and lat_scale.\n", " Source can be a file object, or list of lines.\"\"\"\n", " return frozenset(City(long_scale * float(row[long_col]), \n", " lat_scale * float(row[lat_col]))\n", " for row in csv.reader(lines, delimiter=delimiter, skipinitialspace=True))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You might be wondering about the lat_scale=69, long_scale=-48 part. The issue is that we have latitude and longitude for cities, and we want to compute the distance between cities. To do that accurately requires [complicated trigonometry](http://en.wikipedia.org/wiki/Haversine_formula). But we can get an approximation by assuming the earth is flat, and that latitude and longitude are on a rectangular grid. (This is a bad approximation if you're talking about distances of 10,000 miles, but close enough for 100 miles, as long as you're not too close to the poles.) I took the latitude of the center of the country (Wichita, KS: latitude 37.65) and plugged it into a [Length Of A Degree Of Latitude\n", "And Longitude Calculator](http://www.csgnetwork.com/degreelenllavcalc.html) to find that, in Wichita, one degree of latitude is 69 miles, and one degree of longitude is 48 miles. (It is -48 rather than +48 because the US is west of the prime meridian.) \n", "\n", "Now let's create the map of USA cities, and find a tour for it:" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false }, "outputs": [], "source": [ "USA_map = Coordinate_map(lines(\"\"\"\n", "[TCL] 33.23 87.62 Tuscaloosa,AL\n", "[FLG] 35.13 111.67 Flagstaff,AZ\n", "[PHX] 33.43 112.02 Phoenix,AZ\n", "[PGA] 36.93 111.45 Page,AZ\n", "[TUS] 32.12 110.93 Tucson,AZ\n", "[LIT] 35.22 92.38 Little Rock,AR\n", "[SFO] 37.62 122.38 San Francisco,CA\n", "[LAX] 33.93 118.40 Los Angeles,CA\n", "[SAC] 38.52 121.50 Sacramento,CA\n", "[SAN] 32.73 117.17 San Diego,CA\n", "[SBP] 35.23 120.65 San Luis Obi,CA\n", "[EKA] 41.33 124.28 Eureka,CA\n", "[DEN] 39.75 104.87 Denver,CO\n", "[DCA] 38.85 77.04 Washington/Natl,DC\n", "[MIA] 25.82 80.28 Miami Intl,FL\n", "[TPA] 27.97 82.53 Tampa Intl,FL\n", "[JAX] 30.50 81.70 Jacksonville,FL\n", "[TLH] 30.38 84.37 Tallahassee,FL\n", "[ATL] 33.65 84.42 Atlanta,GA\n", "[BOI] 43.57 116.22 Boise,ID\n", "[CHI] 41.90 87.65 Chicago,IL\n", "[IND] 39.73 86.27 Indianapolis,IN\n", "[DSM] 41.53 93.65 Des Moines,IA\n", "[SUX] 42.40 96.38 Sioux City,IA\n", "[ICT] 37.65 97.43 Wichita,KS\n", "[LEX] 38.05 85.00 Lexington,KY\n", "[NEW] 30.03 90.03 New Orleans,LA\n", "[BOS] 42.37 71.03 Boston,MA\n", "[PWM] 43.65 70.32 Portland,ME\n", "[BGR] 44.80 68.82 Bangor,ME\n", "[CAR] 46.87 68.02 Caribou Mun,ME\n", "[DET] 42.42 83.02 Detroit,MI\n", "[STC] 45.55 94.07 St Cloud,MN\n", "[DLH] 46.83 92.18 Duluth,MN\n", "[STL] 38.75 90.37 St Louis,MO\n", "[JAN] 32.32 90.08 Jackson,MS\n", "[BIL] 45.80 108.53 Billings,MT\n", "[BTM] 45.95 112.50 Butte,MT\n", "[RDU] 35.87 78.78 Raleigh-Durh,NC\n", "[INT] 36.13 80.23 Winston-Salem,NC\n", "[OMA] 41.30 95.90 Omaha/Eppley,NE\n", "[LAS] 36.08 115.17 Las Vegas,NV\n", "[RNO] 39.50 119.78 Reno,NV\n", "[AWH] 41.33 116.25 Wildhorse,NV\n", "[EWR] 40.70 74.17 Newark Intl,NJ\n", "[SAF] 35.62 106.08 Santa Fe,NM\n", "[NYC] 40.77 73.98 New York,NY\n", "[BUF] 42.93 78.73 Buffalo,NY\n", "[ALB] 42.75 73.80 Albany,NY\n", "[FAR] 46.90 96.80 Fargo,ND\n", "[BIS] 46.77 100.75 Bismarck,ND\n", "[CVG] 39.05 84.67 Cincinnati,OH\n", "[CLE] 41.42 81.87 Cleveland,OH\n", "[OKC] 35.40 97.60 Oklahoma Cty,OK\n", "[PDX] 45.60 122.60 Portland,OR\n", "[MFR] 42.37 122.87 Medford,OR\n", "[AGC] 40.35 79.93 Pittsburgh,PA\n", "[PVD] 41.73 71.43 Providence,RI\n", "[CHS] 32.90 80.03 Charleston,SC\n", "[RAP] 44.05 103.07 Rapid City,SD\n", "[FSD] 43.58 96.73 Sioux Falls,SD\n", "[MEM] 35.05 90.00 Memphis Intl,TN\n", "[TYS] 35.82 83.98 Knoxville,TN\n", "[CRP] 27.77 97.50 Corpus Chrst,TX\n", "[DRT] 29.37 100.92 Del Rio,TX\n", "[IAH] 29.97 95.35 Houston,TX\n", "[SAT] 29.53 98.47 San Antonio,TX\n", "[LGU] 41.78 111.85 Logan,UT\n", "[SLC] 40.78 111.97 Salt Lake Ct,UT\n", "[SGU] 37.08 113.60 Saint George,UT\n", "[CNY] 38.77 109.75 Moab,UT\n", "[MPV] 44.20 72.57 Montpelier,VT\n", "[RIC] 37.50 77.33 Richmond,VA\n", "[BLI] 48.80 122.53 Bellingham,WA\n", "[SEA] 47.45 122.30 Seattle,WA\n", "[ALW] 46.10 118.28 Walla Walla,WA\n", "[GRB] 44.48 88.13 Green Bay,WI\n", "[MKE] 42.95 87.90 Milwaukee,WI\n", "[CYS] 41.15 104.82 Cheyenne,WY\n", "[SHR] 44.77 106.97 Sheridan,WY\n", "\"\"\"))" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_lines(USA_map, 'bo')" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "80 city tour with length 13562.6 in 0.297 secs for repeated_altered_nn_tsp\n" ] } ], "source": [ "plot_tsp(repeated_altered_nn_tsp, USA_map)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Not bad! There are no obvious errors in the tour (although I'm not at all confident it is the optimal tour). \n", "\n", "Now let's do the same for Randal Olson's landmarks. Note that the data is delimited by tabs, not spaces, and the longitude already has a minus sign, so we don't need another one in long_scale." ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "collapsed": false }, "outputs": [], "source": [ "USA_landmarks_map = Coordinate_map(lines(\"\"\"\n", "Mount Rushmore National Memorial, South Dakota 244, Keystone, SD\t43.879102\t-103.459067\n", "Toltec Mounds, Scott, AR\t34.647037\t-92.065143\n", "Ashfall Fossil Bed, Royal, NE\t42.425000\t-98.158611\n", "Maryland State House, 100 State Cir, Annapolis, MD 21401\t38.978828\t-76.490974\n", "The Mark Twain House & Museum, Farmington Avenue, Hartford, CT\t41.766759\t-72.701173\n", "Columbia River Gorge National Scenic Area, Oregon\t45.711564\t-121.519633\n", "Mammoth Cave National Park, Mammoth Cave Pkwy, Mammoth Cave, KY\t37.186998\t-86.100528\n", "Bryce Canyon National Park, Hwy 63, Bryce, UT\t37.593038\t-112.187089\n", "USS Alabama, Battleship Parkway, Mobile, AL\t30.681803\t-88.014426\n", "Graceland, Elvis Presley Boulevard, Memphis, TN\t35.047691\t-90.026049\n", "Wright Brothers National Memorial Visitor Center, Manteo, NC\t35.908226\t-75.675730\n", "Vicksburg National Military Park, Clay Street, Vicksburg, MS\t32.346550\t-90.849850\n", "Statue of Liberty, Liberty Island, NYC, NY\t40.689249\t-74.044500\n", "Mount Vernon, Fairfax County, Virginia\t38.729314\t-77.107386\n", "Fort Union Trading Post National Historic Site, Williston, North Dakota 1804, ND\t48.000160\t-104.041483\n", "San Andreas Fault, San Benito County, CA\t36.576088\t-120.987632\n", "Chickasaw National Recreation Area, 1008 W 2nd St, Sulphur, OK 73086\t34.457043\t-97.012213\n", "Hanford Site, Benton County, WA\t46.550684\t-119.488974\n", "Spring Grove Cemetery, Spring Grove Avenue, Cincinnati, OH\t39.174331\t-84.524997\n", "Craters of the Moon National Monument & Preserve, Arco, ID\t43.416650\t-113.516650\n", "The Alamo, Alamo Plaza, San Antonio, TX\t29.425967\t-98.486142\n", "New Castle Historic District, Delaware\t38.910832\t-75.527670\n", "Gateway Arch, Washington Avenue, St Louis, MO\t38.624647\t-90.184992\n", "West Baden Springs Hotel, West Baden Avenue, West Baden Springs, IN\t38.566697\t-86.617524\n", "Carlsbad Caverns National Park, Carlsbad, NM\t32.123169\t-104.587450\n", "Pikes Peak, Colorado\t38.840871\t-105.042260\n", "Okefenokee Swamp Park, Okefenokee Swamp Park Road, Waycross, GA\t31.056794\t-82.272327\n", "Cape Canaveral, FL\t28.388333\t-80.603611\n", "Glacier National Park, West Glacier, MT\t48.759613\t-113.787023\n", "Congress Hall, Congress Place, Cape May, NJ 08204\t38.931843\t-74.924184\n", "Olympia Entertainment, Woodward Avenue, Detroit, MI\t42.387579\t-83.084943\n", "Fort Snelling, Tower Avenue, Saint Paul, MN\t44.892850\t-93.180627\n", "Hoover Dam, Boulder City, CO\t36.012638\t-114.742225\n", "White House, Pennsylvania Avenue Northwest, Washington, DC\t38.897676\t-77.036530\n", "USS Constitution, Boston, MA\t42.372470\t-71.056575\n", "Omni Mount Washington Resort, Mount Washington Hotel Road, Bretton Woods, NH\t44.258120\t-71.441189\n", "Grand Canyon National Park, Arizona\t36.106965\t-112.112997\n", "The Breakers, Ochre Point Avenue, Newport, RI\t41.469858\t-71.298265\n", "Fort Sumter National Monument, Sullivan's Island, SC\t32.752348\t-79.874692\n", "Cable Car Museum, 94108, 1201 Mason St, San Francisco, CA 94108\t37.794781\t-122.411715\n", "Yellowstone National Park, WY 82190\t44.462085\t-110.642441\n", "French Quarter, New Orleans, LA\t29.958443\t-90.064411\n", "C. W. Parker Carousel Museum, South Esplanade Street, Leavenworth, KS\t39.317245\t-94.909536\n", "Shelburne Farms, Harbor Road, Shelburne, VT\t44.408948\t-73.247227\n", "Taliesin, County Road C, Spring Green, Wisconsin\t43.141031\t-90.070467\n", "Acadia National Park, Maine\t44.338556\t-68.273335\n", "Liberty Bell, 6th Street, Philadelphia, PA\t39.949610\t-75.150282\n", "Terrace Hill, Grand Avenue, Des Moines, IA\t41.583218\t-93.648542\n", "Lincoln Home National Historic Site Visitor Center, 426 South 7th Street, Springfield, IL\t39.797501\t-89.646211\n", "Lost World Caverns, Lewisburg, WV\t37.801788\t-80.445630\n", "\"\"\"), delimiter='\\t', long_scale=48)" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_lines(USA_landmarks_map, 'bo')" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAADTCAYAAABwSj+lAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmcFNW1wPHfARQQGFwAWTSyuIvgxipqFFCjiUQRjIIv\nRtGHa9xiXIhRIUaNxi0iiho04IYx8mKMCoJBxQVXREBki6gIiOiwKCKc98etcbZueqvqW11zvp9P\nf2YYZqpO9/TUqXvPXURVMcYYY7aknu8AjDHGxJ8lC2OMMRlZsjDGGJORJQtjjDEZWbIwxhiTkSUL\nY4wxGVmyMMYYk5ElC2OMMRlZsjDGGJORJQtjjDEZWbIwxhiTUQPfAdRlImXtofMoaNMWln0Gs0eo\nli/xHZcxxtRkycITlygGTIExnaAJsA4Y3lOkrJ8lDGNM3Fg3lDedR1UmCnAfx3RyXzfGmHixloU3\nbdpWJooKTYDDB4rQHlgaPD6p8fkKVTYXM1JjjLFk4c2yz1zXU9WEsQ546zngVmAnYGdgD6BflX+X\nifAp1ZNIzaTyhSq2UYkxJjRimx/5kaZmsRAmbbFmIUJjoB0ucexMZRKp+nkTKpNHzZZJxedfWkIx\nxmTLkoVHlaOh2neETgfA/O6qj80q/Lg0IXNCaUjmhPJVLgnFRncZk1yWLGJChPuBT1W5ukjna0rq\nJFL18/pkTijlqmi+LSVjTGmwZBETInQA3gR2V2WV73gARCgjc0IBWAqXbAvXtaldg+k/QXXG0CKG\nbYyJgBW4Y0KVxSI8AVwKXOE7HgBVyoE5waMWEQRoDuwMq/8GTdpU/44mQOu2EYdpjCkCm2cRL38A\nzhKhle9AsqGKqvKVKu/DvNmuJVHVOuDzz3zEZowJlyWLGFHlY+AR4De+Y8nd7BGuRlGRMCpqFrNH\n+IzKGBMOq1nEjAjtgFnAPqp87jueXLgi949Hw96HwPRJNhrKmOSwZBFDItwKiCoX+o4lVyK0Ad5V\nZUffsRhjwmPJIoZEaI0rKu+ryqe+48mFCPWBb4HGqnzvOx5jTDisZhFDQffT/cRkVFQuVNkEfAHW\nsjAmSSxZxNdNwMki/Mh3IHlYBrTJ+F3GmJJR55OFSFl7kd7jRQZOdR/L2vuOCUCVlcA9wFW+Y8nD\nMsDmVxiTIHV6Ul4JbEB0CzBfhBtUWew7mBxYy8KYhKnjLYt4b0AULPtxF/A737Hk6DMsWRiTKHU8\nWaTbgChWS1T8GThOhN18B5IDa1kYkzB1NlmI0Bk67J16iYrVX/iIKRVVvgJup7RaF5YsjEmYOpcs\nRGgeTHqbBj+7C86usUTFZV/DfT1F6OYxzJpuB44WYU/fgWTJkoUxCVNnJuWJUA8YCtwA/Au4UpWV\nlRv2tG7rFr2bPQLKDwLuBq4D/hKHHeVEuBzoqsrJvmPJJBju+6oq7XzHYowJRyKTRe0d24Y+DOdc\nBWwFnKfKG5mPwa7A48Ai4AxVvo426ozxNAUWAn1Vme0zlkxE2BpYi5vFvcl3PMaYwiUuWaQeDvu7\nTXDsldD3ZlU2Z38sGuEKzEcCg1V5O5qos47nUqCHKoN8xpENEVYCnVVZ7jsWY0zhElizSDUcdmR9\n+F2XXBIFgCrfqnIOMAJ4ToSzgw1/fBkNHCzCfh5jyJbVLYxJkAQmi/CHw6ryKHAwMBx4RIRmBQSY\nN1XWAzcC1/g4f44sWRiTIAlMFss+i2LHNlXmAz2BNcCbInQp5HgFuAc4SIQDPZ0/W5YsjEmQBCaL\n6HZsU+UbVc4ERgIviDCs2N1SqnwLXI8bqRVntj6UMQmSuAI3VBS5T3wSmu4Ab74UxY5tIuwFTATe\nAc5WZW2Yx89w7obAR7ii+2vFOm8uRDgf2FOVc33HErbao+1sR0CTfIlcSFC1fIkIU4BVqtwYzTmY\nK0IP4C/ATBFOVOWDKM6V4twbRBgFXAscVYxz5mEZcLjvIMJWAotPGhOJBHZD/aAFbhOeyKiyTpVf\n4YrOL4pwWpTnq+GvwG4i9CniOXOR0JpFvBefNCYqiWxZBCJPFhVUGSfCm8BEEQ4Dzg1GLkV5zo0i\njIR5N4qcvjiGXSIJTRYlsfikMaGzZBESVWYH60ndDbwuwiBV5kV71vbT4fh7YHLvGHaJLAPaiCBx\nWC4lPBWj7aomjHXAV6s8BWS2oJj1pcTXslQ1kQ/Q+aB7eDivgA4DXQk6JNpz9RoPaxW0ymOtQq/x\nvl//4LVYDbqD7zjCfU7N2sPQBZWv+1qFs1fDgo9Bu/iOzx6ZfldDF0Cz9qm/t9d4OGGq+1j7e8I6\nV6k+vAcQ3RtFv/R5oQLtGiSse0EbR3OOIa9XTxQVj+On+n79g9dgDmhn33GE/7yatYeLPoHTZ1Vc\nWEBPDm4QBvmOzx4Vv6e+T6S+mRryCuihoLuANsj1Qh/cEDYE3Ra0LWgnOOafcb5xC+ORyG4oERoA\nzYDVvmJQ5b1g4ty9wKsiDFY3sa9gInQCroEOXVJ3iRQ2ATFEFXWLWC98mKtgtN1y3JDpikUpl4gw\nD/iHCF2BqzXH5WVMYYKVpQ8EfgocC726pq4vteqEm6u0C7AjnP8dXNmk9qCFNm+I8CnQOHhsU+Xz\nTcA3wHr3sUurpNeykjoaantgte8/VlXWAKfgZl2/LMLgQo4nQjsRVxMBPoJ3u0U1AbFQrv/2gg5w\n1u0ivce7fydKG1wy/IEq7wDdgUOASSI09xFYXSJCMxFOEOEB3Ha+D+Iu6pfAtMdTr+bw2hRV+qiy\nM9AEFs9KfaFfvhQ4AzgeOBTYB/d7b6jK1qo0V6WNKh1h6XtRrBwRK76bNtE0P3Vv0Dm+46gR0wGg\nC0DvAm2U48+2AL0ZdBXoTVW71yr7Wo/Pq681muea7P5b0PqgG0G3SvP/WwW/57mgu/uON2kP0F1B\nfw06GXQN6HOgF4B2qv592b0PC639gQ6BBZ/Daf9N6nteNaE1i6A/crrvOFLE1Rz0CdC3ar6x03x/\nGeg1QZK4C7St7+eQ3fOMd+E9hN9ja9AVWXzfmaArQI/xHXMpP4Lke3hwwzQPdBnofaA/B2265Z/N\nfDNVyM0N6ElBPPvE8cYtzEciaxZAS4o4bDZbqnwtwiDgPFwdYziUvV1zuB2ULwfOBX4DPAt0U2WR\nz9hzk24uwr4HiVCmSrmPqELUlhpdUKmoMlaEOcDjItwJ3KiapGHE0RGhJfATXP2hP255m38BQ4B3\nNMsu5mDo6tBM3yNS1g8WVtsxM9OwVxFOBG4DjlTlA9zbeovnKmVJTRZFnWORi+BicacIr8HCv8Op\nZXBT88p5EhcfCQs3QacZwBFapCVEwpVuLkLjxsB/RXgSGAu8XqIXz1r1inRUeSVYFuZJYD8RTteI\nJ2yWomBBzq7AsbgEsTcwBZcgLlDl8yjPn01SqUqE43FL/RylyvtRxRUnSS1wxzZZVFBlJgx7rTJR\ngPv455Zw0TuqDCzNRAHpV/594DBgL2A+8DdglggXiLC9r0jzlHWyAFDlE1yBdAPwigi7iJS1d4X/\ngVMTOgAgIxG2EeFnIowBPgaewPUKXA20Cv4GHog6UeRKhOOAMcAxqrznO55iSXLLYqnvIDLbvkXq\n7poGjXxEE5YsmvU3ivAn4DDgTOA6EZ7GtTaml0Brow1u5E3WVPk2WDvs17BoJgz6Du5oF8OZ95ES\nYRdc6+FY3KixN3Gth37A/Lj/7kX4KXAfLlF43Wa52JKcLN7xHURm6bprSn+4XaZmfdDnPA2YJsIO\nwKm4bWMbiHAf8KAqK4oRax7aAHNy/aHgQnibyGU/hQf71h7Xv3AUCevzFqE+btOwnwaP1sAzuCGu\nQ1T5ymN4ORHhaOAB4GeqvOk7nmKzbiivotuoqZSoskqV24DOwK9w/dUfijBRhCODyVZxklM3VG1a\nL8kTuETYToSTRRgPLAfuwk1iOxNorcovVXm8xBJFf+AhYIAqr/uOx4cktyxinyzyHYWRVMGd9wxg\nhggX4iY03gBsJ8L9wF9V+dRnjIGsRkOll6wWZVCc3osfZk6zP/Af4GngCtVS6BJOT4QjgAnACaq8\n6jseXxK6Ux6Lgb6lNdzUpCPCAbi70pOAl3F9xs+o8r2neD4GDlNlcX4/n3IDpYUwqWRqFiI0wtWc\nKhJEfVxy+BcwTZVvPIYXmmDLgYnAiapM9x2PT0lNFmuAdgkYz2+qEKEJMBiXOHbBbQB1vyqLi7U8\ndHAX/S3QXN1+6Hkep6w9nDARmreGmf/x3aLsJXJvK+i2hqZ7Kg0bCBu+b8baeStg5quqZ7mYaUtl\ncfpw4H0qE8TsuBens1H9fbR5I9xyIHQcpMo037H5lrhkEdzxlOPWb0nWkzM/EKEzMAwYCnPnwK27\nwa2to75TF6EFbtROwcN9RTgJd8c6qPDICjNA5J1JsF/Nrx9L0/nPsOYxXILoADyHSxDPqpKoPTxS\nt/h+/Rk8fnCptPiiFLfCYRh2AL6wRJFsqsxW5UJgJxhZrzJRQMRbnRZY3K5mOdAqpGMVZA1N90z1\n9XVsvRvQELgIN/fhZFUmJC1ROKm2zL29rW2Z6ySxwN0CWOk7CFMcbv7Chu+KOLoo7GSxY0jHKojS\nsAGsrfV1QTap8lsPIXlgW+ZuSRJbFiUxEsqEqWJ0UVWRjS5qS44T8rZgBTFJFsKGlIMF0n09mYr6\nPio5lixMAqSarzLie2h1YwQnC7NlsRpoKsLWIR0vb81Ym3K/+HRfL0WZl1iZPQIu+LSuz3tKJ6nd\nUJYs6pDU81Xu2gz7XyXCyWHVr9zFZegvQeuJvNeu0BFMqmwWYSWubvFJGDHmawXMPIbtyr5B2oNs\nrjoaymdcYUkzXLnaEivufTR9LFw2BJZ9UtfnPdWUxNFQvwfqqfJ737EYf0RoDLwB/FmVvxZ+vGjm\nRojwDnBGHNYZCpZZeV+V233HEjaR3uNh8pDaEyH7T1CdMbRyyGyPI2DVUnjqJEsS1SWxZdES+NB3\nEMYvVb4R4RfAiyLMUC30PZFqpEwo6znFosgdrOF0HJDQkT/pitf77C9ySlcY8PcqNwJtQKfUhYUd\nc2E1C5NYwRLvI4BHRWhY2NEiGykTlyJ3L+AzVZb4DiQa68pTF6+blsGuM1PfCNiQ2aosWZikuxdY\nBBRY7I5spExc5lr8HHjKdxBRcBMp/9IFLl5Zu3h9/yEwd4YNmc3MkoVJtKC4fSZwfLAXQZ5mj4DL\n10UwUsZ7yyJYwiSRySJY0eEp2PVxeKQ79J8AJ0xzHyvqTZ9+YkNmM0tizcKShalGlS9FGApMFOEA\n1XzmSZR/A4s3wbGPwfatQhwpsxzoUuAxCrUP7lqQqF3fgqXtxwGfAleqlm8mZX1p9ggY3rP24AUb\nMltVopJFcIfUApK4FIEphCoviTAa+JsIR6qyKcdD/A90eFL1xV+FHFocCtwDgElJWCKn+kKALVrB\nxd/CHn2CzbZSsq0CspOoobMiNAWWq9bqgDSmYsTPVNwieH/M4ecEmAsMU+XlkGPaHxinStcwj5tj\nDDOBy0p9ZdXUw5vPWQz/OMIu/IVLWs3CuqBMWkFrYihwoQg9c/jR3sHHV8KPym+BW4SdgY7AS75i\nCE+q4c2jO9iopnBYsjB1SrBr23DgYRGaZ/ljZ+D2zYiiGb4SaOFx69jjgKd9bSQVLlsIMEqWLEyd\no8o/gGeBe4IuprREaAYcj9t/OYpYNuL2Xyl4f4w8JWgUVD1sVFN0LFmYuuoS3Cig0zJ830nAi6os\njzAWL0VuEbYFegDPF/vcYRNhINy4L1zwiS0EGI1EjYbC9rIwWcphOZAzgD9EHE7FXIsPIj5PTcfg\nEmHN2/HYqz7qqdHWMHJ36HgkTFwNc21UUwSSmCysZWGyosoHIj8sB9JTlQ1V/1+EvYEf4bqsIuEu\ner9qD+vvEPng3SJf3EqyCyr1qKfzl8ITq4PXrpC1ukwa1g1l6rotLQdyBvBgVMXfyove9bvA2H3c\nqqgDptTeZyGKc9MIOBL4Z9TnCl+qUU937myjnqJlycLUaemWAwk2JBoKPBDd2dOtZFuUi94RwCzV\nUuy2tVFPPliyMHWeKl8CQ4D7RKi44PwMmKvKgujO7PWiN4AS7IJybPtTH5KWLFpiycLkIZiZPRrm\nThTpMwF+cy8M3SraLiE/F71gTscAYFKU54lOqm10bdRT1JK23MdyoKsqn/uOxZQekbYdYdBsuL5x\nmLvhpT9fWXs4cbrrb4/+fJXnPGIM7NUH/vNUqY4Wcs+j372wW3d46elSfR6lJDHJIrhb2gBsE0x0\nMiYnmbbejOacr90CDx4Dy5dFPdQzqq1hfRGhFTAP2CEJiyDGXZKGzjYH1lmiMPnzUUPoeQT0PEu1\nGGszRbY1bGiqz5/45Gv4DujY3HXZVXQzVf3/nk3g8+kiS/9rrYtoJSlZWHG7iKr/US9LyOSnihpC\nzZZFNDUEEToCbYEZURy/tniPIhIp6wM9noEezWAr3HbgY4Ff4/68z+oD64Hxu1S2jH4H3NQHWvSB\n4T1t3+wIqWoiHqC9QF/zHUddeECz9jB0AaxVUHUfhy6AZu19x1YKz8udp9d4OPsjOGd+sV436PNw\n5XPTKs+x1/h4vPa/KK/+2l+iMEfhmipfG5Ei/mti9VyS+rCWhclasOjebvDzh+DuWHdn5KMYm+Ck\nrhuUT8n3jji3Ft4fPoQr1sMft4nfjnCdR8F9zaq/p64FboYf9i1qQu0BnE1q/H88WklJZMnCpBUk\nh12BH1d5bIYWDeLcnVGI6JeLSFc3+PJOES7BddLXemiKnd7SFKxTdsW45dgPPQfeHQj9h8Zv7aR2\nO6d+T23EdUmBe341X4Z1VCYQm2sRJUsW5gdBcuhE9eQAMA23w9zVwCJ47W+wLsWoIftDzSxd3aDL\n4cDTwNYpHg1F2EStJHJec7iqaZYtvMuBf6le8CxcENlaV7kS4QDgLNirZ+p60SzgzuDzs/7rahbr\natQsfk28WknJZMmiDguSQwfgcCqTQz1ccngRuAZYqFp9WKKIbXCfv3RF9P88pZq6RRP8nupTK4ks\neRya9Kr+3bVbeMFueGcBXUJ6EgUJ9gg5GRdTS2AsrDkUhk+o/p4atg4WvAwXbV3RCnJH6B90E34a\njJZa0jxeraRkSlqymO87iDgLLjrtqZ4cGlCZHK4DFtRMDjVV9u23fBm++gLmzbY/1GzlnmiD38f3\nwWN9xddFliyCdb2yaOGNAu5W5dPQnkYeRDgQlyAG495vI4DJqmyCW8mhXlSydbFSlqRJeZOAB1RL\ndQmDaIjQHpcUKhLE1lQmhxeBjzIlhy0c+zHgSVUeKzzSuqOyKF1Y3SCbSXYi7A88A+yuyprwnkW2\nMf7QivhfYAfcWNi/qmJdliUmEcnC/dEMfwOWL4WP5tblu1wRdqF6cmiESwoVCWJ+vskhxbnuB2ao\ncn8YxzO5q0w8u+0JbTrC6AOqJAoBJgN/V+Xu6GOoHJEF5S1wrYhBuPfevfzQijClqOS7oSrvrn7f\nEpq0hHUHJGVyTjbDIkX4EZVdSocD21CZHG4APgwrOaSwFmga0bFNFipGb4nQAFgFN6yv8t9HAzsB\n90V1/tStm6tOhIUroNMYYG9VlkV1flM8Jd+y8LGeTzGk72JocyrcVDGc9XDcxfpFKhPEvAiTQ40Y\n+QOwXjXybUdNFkR4GnhIlcdFqA+8C4yIsms2/d/fkRNUXynZvz9TWwKWKI/3Egb5Szcev+E04Djg\nbeCnwI6qDFZltCpzi5UoAtayiJcXgL7B56cBq4H/i/aU6f7+Ou0R7XlNsZV8N1Sx1/MpnnR/hHNm\nqDLIR0QprAVKPCknyR1z4fNrRT7aA/boBu1PUR0W8c1Dur+/H+0jwjjgSitmJ0MCWhapNkL5zerS\nH/OfbmOcZXH6w7OWRUy4bsuZf4GrmsHEw+CKbeA/t0S/n3e6jYje6gZ8BswSYYQIjaONw0St5GsW\nUHMo4lerYGwP6PRbVR7xHVu+SmHvAREGAYNj1NKps3zW7rY0FFiEDsCNQA/gt8BjRe4qNSFJQDdU\n7fV8ROgKTBFhvipveQusAJUT35beAIecCC88GsMhwdayiA1/tbstraelymJgsAiHALcB54twkSpv\nRB2XCVcCuqFqU+U94GzgSRF29B1Pvtwf4YunwkiBGafGLFGAJYsY8bOfd7bUbe7UDTcp7x8iPCRC\nO89hmRwkMlkAqPIE8CDM+6fIIQ+LDJwq0nt89H244VK3859SufRmnKzBkkVMpKsdxKd2p8pmVcYB\newIfA++JcLUI2/iNzGQjETWLdERadIBT3oc/Nolrv382RFgDtFOl3HcsVYmwK/BvVXbzHYsJbxmR\nYgmWorkB6IVbFfdRq2fEV8KTRbqi37GPqb74C19x5UqEFcC+qiz3HUtVIrQG3lWlte9YTOkSoQ+u\nnrERuFCV1z2HZFJIRIE7vXRFv0MGidAPWAQsrvFYBHysyndFDXXLvoVYDj20moUpmCovi9AdOBVX\nZ5wKXKHKJ55DM1XU0ZZF/wkw4xLcXg4dg49VH+2A5VQmj5oJZVmqncu2HEsu21/W/Lnz3oOP58Ki\nBXHqWhChHsFWZrm+HsakIkJT3BDbc4A7gD+psn7LP2WKIeHJIr+5CsGibDtTPYFUTSrNgf9Su0Wy\nGFisyupw4iiJuRZrgdaqrPUdi0mOYPXkG4A+uHrGI1D2o3xuuEw4Ep0sIJqiXzB6oz2pWyUdcRsF\nV2mRnHYo3NWtdgtn2MvwyDigWZVHWeXnl3aHa3eM8yKJInwO7KfK575jMckjwsHArfBhA7ipJdyx\nU1xvnJIu4TWLLU8Yyv+YrAfmBI9qgj0EtqdaAtm2XeraSdvdgYNxQ1DXAKtwCSb496qdocmOtX8u\nVoskWt3CREaVV0ToCSNfgnt2ynK/cROBxCeLYguG/q0KHm8CiLzRBdalqJ28OlmV09MdS+TDQbBu\nv5gvkmjJwkRKlc0i32xI5urSpSOxk/LiJd8JU/GfaIUlC1MUa76K8wz1usBaFkVQuc5TVpvRF/xz\nRWbJwkRKhJYwugtcsgpu2aF6zSJWN06JlvgCt4mWCE/gZt4+4TsWkzwilAFTgeeh7N5SmqGeNNay\nMIWylkUe8p13U5eI0Ah4Clf7u0q1XLFitjeWLEyhLFnkKM38mZ4iZTYMNBDMdXoUWAmca2tG+WcF\nblMoSxY52/+PqfdX7zzKZ1RxEQw/H4tb4uZUVTZ5DslgLQtTOEsWgXRdS8HFbw/gJ8DRcGhfGwaa\nWvBa/Qm3jHm/mK3RVqdZsjCFWgu08B3ElhSjPpC6a+nCviLvvAD798G14v8NjIGXvoJ1g2M+f8aX\ny4GjgMNUa42VNR5ZsjCFinXLIoz6QHC32xC3JlhZ6sfgYXB7ja6l21rD+XvBA8cAcyv63UXefgfO\n6QajO9gw0Eoi/C9wJtBHlS99x2Oqs2RhChXrZOFaFKnqA/qwCI9Q+8KfLiFsBsprPL6u/Lzxdqm7\nlr76WrX6sjCua+rhK+HaO2DBbBsGCiIMBq7GtSishRVDlixMoWKeLNLtadKqA66O8DXwJbCE9Mlg\njSobtnQWkbeaw7pdsu9aOmUXOOVhVS7M9RkljQhHAXcC/VVZ4Dsek5olC1OomO/Dvewzd9GueRF/\n7QVVzgvvPLNHwPCetZeTT9u11B34e3jnL00i9ALGAz9XZZbveEx6NoPbFESEA4F7VDnIdyypuJrF\nSa+6+kG0S1vnshy+CEuBH6uyMMwYSokInYEXgNNU+bfveMyWWcvCFCrW3VCuPjDzSbiwD6xaFWV9\nINvl8EVoC2yD2/OkThKhI/Asbs9tSxQlwJKFKVSsk4XTbQ/odoUqz/iOJNAdeKOuzkoWoTXwPHC9\nKo/4jsdkx2Zwm0Ktxe3sF0vBsNcDCfYWiYnuwOu+g/BBhG2B54CHVBntOx6TPUsWplDrgKbBRTmO\nOgHlqqzwHUgVPYA3fAdRbMF2xE8DLwIj/UZjcmXJwhREle+B74BGvmNJ4yBi1KoQoR4uppm+Yykm\nEbYCJuK2Db6ornbBlTJLFiYMca5bxCpZ4OZ2fKHKSt+BFEuQIMcBm4DTVdnsNyKTD0sWJgxxThbd\niFeyqFNdUEH35B3ATsBJqmz0HJLJk42GMmGIZbIQoT6wP/CW71iq6E6Ck0XtRRtv/QJ69AYOV+Ub\n3/GZ/FmyMGGIZbIAdgdWxGxRuu64GcuJk3rRxhEb4b5eqmO/9hyeKZB1Q5kwxDVZxKpeIUJjYG/g\nHd+xRCPVoo2jtoIPLvIZlQmHJQsTBksW2dkPmJfc7ph0izbapk5JYMnChCGuySI2xW3XRXPaHXBh\nK5He492/k6Zi0caqbFOnpLCFBE1B3EXv1Odhk8KsmXHZl0GEBrglxtuoUu43lpQbMEWymKFPIv84\nHV66F0bWT/LzrKuswG3yVnkRvKniIrh7rrvQRWhvYKnvROGk24Bp4SiyWHiwFIhwNBx/A6waCP0H\nZbPyriktlixMAWJ9EYzRLOlk9+WL0B94CBigOuxVGDbJd0wmfFazMAWI9UUwRsXt5Pbli3AEMAE4\nQZVXfcdjomPJwhQg3UVwXRzG1MemuB3sorew8rXKuIteSRDhMOBR4ERVXvYdj4mWFbhN3lIXbi9d\nBb+pBx1HAXcECw0WOS4aAquBlqq1spkX7rXqej38eDC89AS8fXkp9+WLcAhuW9iTVJnmOx4TPUsW\npiCpthKF8q2Ae4Ay4EzV4k5CC7Z6HafKvsU8bzZEmA6MVGWy71jyJUJv4CngFFWm+I7HFIcVuE1B\n0m0lKkJf4DTgORHGAdeosr5IYcWouF3LDOBgKM1kIUIPXKI41RJF3WI1CxMJVVSVvwL74lYcfT8Y\nNVMMMSpu1/IK0Nt3EPkQoRvwT+A0VZ7zHY8pLuuGMkUhwjHAaGA6cLEqX0R4rneBs1Tjt7qrCC2A\nhcD2qmzyHU8mld2MnXaH9vvCQeerDrjPd1ym+KxlYYpClWeAzsAqYLYIQ6PYijVYrG93YFbYxw5D\nkCSX4V6LWKscwDB5CPytG1zeCJ64PJlLlZhMLFmYolFlrSoXAT8DLgWeFaFjyKfpilus79uQjxum\nV3B1i6y5LKTBAAAFN0lEQVSIlLV360kNnFrcdaXSTbrsPKo45zdxYsnCFJ0qM3HzIKYCb4hwabCW\nUxjiXK+oMIMs6xbV7+7/frj7OGBKcRJGrCddmiKzZGG8UGWjKjfithk9Gpc0Dgjh0HEeCVUhh5aF\nz7v75M48N7mzZGG8UmUh0B+4Dfi3CDeL1LqdzUUptCzmA2UiZHGH3m5nf3f3yZx5bvJjycJ4Fwyz\nfQhX9G2NK4AfletxRGgKdAA+CDnEUKmymQxdUSI0EeEy2LN76rv7HXYQoVW0cZYvgUn9oP8E+OXb\n8Idy+Hf/Up55bvJnycLEhiorVRkKDAfGiDBehJY5HGJ/YLYq30UTYagqJudVI8I2IlyMG157EGx3\nXO27+/M+hnM/AD4UYawIe0cVpGr5EtUZQ+HBg+D6hfDFXlGdy8SbzbMwsRR0RV0LnApcBjykyhbf\nrCJcBOyqyrlFCLEgIuMHw6y7YOH7rjbw3XXw5tHA5cCrwLWqbvhvqiVVVMuXBIl0OHAO8C7wZ2BK\nptcp/5j5H2CIau6tPlP6LFmYWAvWeRqLm58xPKhxpPveCcBkVcYVKby8uIv/z1+AuztWLsD4u+/h\njGmwz29zXUtLhEbAycDFwZduBR4Oe/hwsEDjEqCvKnPCPLaJP+uGMrGmyltAd+A54HURLhNhqzTf\nXgrFbVwroSJRgPs4sgGcuSKfRRdV+TZYWqULLmEMApaIcHWO3XiZzrMBGANcENYxTemwZGFiT5Xv\nVbkZlzT6ATNFOKjq94iwLdAOmOchxBxFM38hGCgwWZWfAEfg1uSaL8K9IdY1xgAnibB9SMczJcKS\nhSkZqiwCjgJuBp4W4c8iNHXdOgMnwm+/h97j4r8cRfTzF1SZo8pZwB7AJ8BUEZ4RoX8hy6yoshz4\nP+DMkEI1JcJqFqYkBQvy3QILj4A/1ofb21T2/w9fCJP6xXWIZ+pNo6KNOahrnILrptpMZV1jQx7H\nOgC3THknVTaGGqiJLUsWpqSJnDgFHuxbvVtnHdB/ghvyGU/pRjhFf14ENwnyYtw6WqOBMaqszPE4\n04G/qPJ4+FGaOLLNj0yJ03qluH5Ruk2joj8vCjwPPC/CPsCFuLrG48BtqszN8lC34xKOJYs6wmoW\npsTZ+kX5UuUDVc7E1TU+A6aJ8C8R+mVR15gEtAs2RDJ1gHVDmZLmo/8/qYK6xhBci2ETbpLfI+nq\nGiJcCuwXzLo3CWfJwpQ8X/3/SRW0Ko7EJY0uwF24usYXNb5vO9yyJPuosqzogZqismRhjElLhM64\nusZA4DFcXWNelf+/C1ilytWeQjRFYsnCGJORCDsCZwePN3FdVFOB3WHRy/DLydCqtashWcsuiSxZ\nGGOyFuxxXlHX2AiTH4KnR8L1ja1mlGyWLIwxOQvqGkfBJQ/AdW1KbZ6LyZ0NnTXG5CxYh+pZWDKv\nFOe5mNxZsjDGFMDmudQVliyMMQWwfbrrCqtZGGMKYvNc6gZLFsYYYzKybihjjDEZWbIwxhiTkSUL\nY4wxGVmyMMYYk5ElC2OMMRlZsjDGGJORJQtjjDEZWbIwxhiTkSULY4wxGVmyMMYYk5ElC2OMMRlZ\nsjDGGJORJQtjjDEZWbIwxhiTkSULY4wxGVmyMMYYk5ElC2OMMRlZsjDGGJORJQtjjDEZWbIwxhiT\nkSULY4wxGVmyMMYYk5ElC2OMMRlZsjDGGJORJQtjjDEZWbIwxhiTkSULY4wxGVmyMMYYk5ElC2OM\nMRlZsjDGGJORJQtjjDEZWbIwxhiTkSULY4wxGVmyMMYYk9H/AyJiQV3EIqocAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "50 city tour with length 10236.7 in 0.125 secs for repeated_altered_nn_tsp\n" ] } ], "source": [ "plot_tsp(repeated_altered_nn_tsp, USA_landmarks_map)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can compare that to the tour that Randal Olson computed as the shortest based on road distances:\n", "\n", "\n", "\n", "\n", "\n", "The two tours are similar but not the same. I think the difference is that roads through the rockies and along the coast of the Carolinas tend to be very windy, so Randal's tour avoids them, whereas my program assumes staright-line roads and thus includes them. William Cook provides an\n", "analysis, and a [tour that is shorter](http://www.math.uwaterloo.ca/tsp/usa50/index.html) than either Randal's or mine.\n", "\n", "Now let's go back to the [original web page](http://www.realestate3d.com/gps/latlong.htm) to get a bigger map with over 1000 cities. A shell command fetches the file:" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false }, "outputs": [], "source": [ "! [ -e latlong.htm ] || curl -O http://www.realestate3d.com/gps/latlong.htm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I note that the page has some lines that I don't want, so I will filter out lines that are not in the continental US (that is, cities in Alaska or Hawaii), as well as header lines that do not start with '['." ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def continental_USA(line): \n", " \"Does line denote a city in the continental United States?\"\n", " return line.startswith('[') and ',AK' not in line and ',HI' not in line\n", "\n", "USA_big_map = Coordinate_map(filter(continental_USA, open('latlong.htm')))" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\niRIlSpTIS/8/TuRYhKOqNG4AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_lines(USA_big_map, 'bo')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's get a baseline tour with nn_tsp:" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "1089 city tour with length 52879.1 in 0.177 secs for nn_tsp\n" ] } ], "source": [ "plot_tsp(nn_tsp, USA_big_map)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now try to improve on that with repeat_100_nn_tsp and with repeat_5_altered_nn_tsp (which will take a while with over 1000 cities):" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "1089 city tour with length 50802.6 in 17.126 secs for repeat_100_nn_tsp\n" ] } ], "source": [ "plot_tsp(repeat_100_nn_tsp, USA_big_map)" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nEAL5fxkVHTv2ITP1AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "1089 city tour with length 44234.6 in 23.149 secs for repeat_5_altered_nn_tsp\n" ] } ], "source": [ "plot_tsp(repeat_5_altered_nn_tsp, USA_big_map)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again we see that we do better by spending our run time budget on alteration rather than on repetition. This time we saved over 8,000 miles of travel in half a minute of computation!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Greedy Algorithm: greedy_tsp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At the start of the *Approximate Algorithms* section, we mentioned two ideas:\n", "\n", "1. **Nearest Neighbor Algorithm:** Make the tour go from a city to its nearest neighbor. Repeat.\n", "2. **Greedy Algorithm:** Find the shortest distance between any two cities and include that in the tour. Repeat.\n", "\n", "It is time to develop the *greedy algorithm*, so-called because at every step it greedily adds to the tour the edge that is shortest (even if that is not best in terms of long-range planning). The nearest neighbor algorithm always extended the tour by adding on to the end. The greedy algorithm is different in that it doesn't have a notion of *end* of the tour; instead it keeps a *set* of partial segments. Here's a brief statement of the algorithm:\n", "\n", "> **Greedy Algorithm:** *Maintain a set of segments; intially each city defines its own 1-city segment. Find the shortest possible edge that connects two endpoints of two different segments, and join those segments with that edge. Repeat until we form a segment that tours all the cities.*\n", "\n", "On each step of the algorithm, we want to \"find the shortest possible edge that connects two endpoints.\" That seems like an expensive operation to do on each step. So we will add in some data structures to enable us to speed up the computation. Here's a more detailed sketch of the algorithm:\n", "\n", "1. Pre-compute a list of **edges**, sorted by shortest edge first. An edge is a pair of cities; if the list contains (A, B) then it does not contain (B, A), and it never contains (A, A).\n", "2. Maintain a dict that maps **endpoints** to **segments**, e.g. {A: [A, B, C, D], D: [A, B, C, D]}. Initially, each city is the endpoint of its own 1-city-long segment, but as we join segments together, some cities are no longer endpoints and are removed from the dict.\n", "3. Go through the edges in shortest-first order. When you find an edge (A, B) such that both A and B are endpoints of different segments, then join the two segments together. Maintain the endpoints dict to reflect this new segment. Stop when you create\n", "a segment that contains all the cities.\n", "\n", "\n", "Let's consider an example: assume we have seven cities, labeled A through G. Suppose CG happens to be the shortest edge. We would add the edge to the partial tour, by joining the segment that contains C with the segment that contains G. In this case, the joining is easy, because each segment is one city long; we join them to form a segment two cities long. We then look at the next shortest edge and continue the process, joining segments as we go, as shown in the table below. Some edges cannot be used. For example, FD cannot be used, because by the time it becomes the shortest edge, D is already in the interior of a segment. Next, AE cannot be used, even though both A and E are endpoints, because it would make a loop out of ACGDE. Finally, note that sometimes we may have to reverse a segment. For example, EF can merge AGCDE and BF, but first we have to reverse BF to FB. \n", "\n", "\n", "\n", "
Shortest EdgeUsage of edgeResulting Segments\n", "
A; B; C; D; E; F; G\n", "
CGJoin C to GA; B; CG; D; E; F\n", "
DEJoin D to EA; B; CG; DE; F\n", "
ACJoin A to CGB; ACG; DE; F\n", "
GDJoin ACG to DB; ACGDE; F\n", "
\n", "\n", "Here is the code:\n" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def greedy_tsp(cities):\n", " \"\"\"Go through edges, shortest first. Use edge to join segments if possible.\"\"\"\n", " endpoints = {c: [c] for c in cities} # A dict of {endpoint: segment}\n", " for (A, B) in shortest_edges_first(cities):\n", " if A in endpoints and B in endpoints and endpoints[A] != endpoints[B]:\n", " new_segment = join_endpoints(endpoints, A, B)\n", " if len(new_segment) == len(cities):\n", " return new_segment\n", " \n", "# TO DO: functions: shortest_edges_first, join_endpoints" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "**Note:** The endpoints dict is serving two purposes. First, the keys of the dict are all the cities that are endpoints of some segments,\n", "making it possible to ask \"A in endpoints\" to see if city A is an endpoint. Second, the values of the dict are all the segments, making it possible to ask \"endpoints[A] != endpoints[B]\" to make sure that the two cities are endpoints of different segments, not of the same segment.\n", "\n", "The shortest_edges_first function is easy: generate all (A, B) pairs of cities, and sort by the distance between the cities. (Note: I use the conditional if id(A) < id(B) so that I won't have both (A, B) and (B, A) in my list of edges, and I won't ever have (A, A).)" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def shortest_edges_first(cities):\n", " \"Return all edges between distinct cities, sorted shortest first.\"\n", " edges = [(A, B) for A in cities for B in cities \n", " if id(A) < id(B)]\n", " return sorted(edges, key=lambda edge: distance(*edge))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the join_endpoints function, I first make sure that A is the last element of one segment and B is the first element of the other, by reversing segments if necessary. Then I add the B segment on to the end of the A segment. Finally, I update the endpoints dict. This is a bit tricky! My first thought was that A and B are no longer endpoints, because they have been joined together in the interior of the segment. However, that isn't always true. If A was the endpoint of a 1-city segment, then when you join it to B, A is still an endpoint. I could have had complicated logic to handle the case when A, B, or both, or neither were 1-city segments, but I decided on a different tactic: first unconditionally delete A and B from the endpoints dict, no matter what. Then add the two endpoints of the new segment (which is Asegment) to the endpoints dict. " ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def join_endpoints(endpoints, A, B):\n", " \"Join B's segment onto the end of A's and return the segment. Maintain endpoints dict.\"\n", " Asegment, Bsegment = endpoints[A], endpoints[B]\n", " if Asegment[-1] is not A: Asegment.reverse()\n", " if Bsegment[0] is not B: Bsegment.reverse()\n", " Asegment.extend(Bsegment)\n", " del endpoints[A], endpoints[B] # A and B are no longer endpoints\n", " endpoints[Asegment[0]] = endpoints[Asegment[-1]] = Asegment\n", " return Asegment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's try out the greedy_tsp algorithm on the two USA maps:" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nH76Nk+B8wxPEAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "80 city tour with length 16087.5 in 0.006 secs for greedy_tsp\n" ] } ], "source": [ "plot_tsp(greedy_tsp, USA_map)" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "1089 city tour with length 46981.5 in 1.052 secs for greedy_tsp\n" ] } ], "source": [ "plot_tsp(greedy_tsp, USA_big_map)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The greedy algorithm is worse than nearest neighbors, but it is fast (especially on the big map). Let's see if the *alteration* strategy can help:" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def altered_greedy_tsp(cities):\n", " \"Run greedy TSP algorithm, and alter the results by reversing segments.\"\n", " return alter_tour(greedy_tsp(cities))" ] }, { "cell_type": "code", "execution_count": 85, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "80 city tour with length 14133.3 in 0.022 secs for altered_greedy_tsp\n" ] } ], "source": [ "plot_tsp(altered_greedy_tsp, USA_map)" ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "1089 city tour with length 43769.9 in 4.177 secs for altered_greedy_tsp\n" ] } ], "source": [ "plot_tsp(altered_greedy_tsp, USA_big_map)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That's the best result yet on the big map. Let's look at some benchmarks:" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " altered_nn_tsp | 4820 ± 233 ( 4450 to 5346) | 0.008 secs/map | 30 ⨉ 60-city maps\n", " altered_greedy_tsp | 4766 ± 207 ( 4320 to 5185) | 0.009 secs/map | 30 ⨉ 60-city maps\n", " repeated_altered_nn_tsp | 4640 ± 194 ( 4298 to 4991) | 0.148 secs/map | 30 ⨉ 60-city maps\n", "----------------------------------------------------------------------------------------------------\n", " altered_nn_tsp | 6589 ± 202 ( 6188 to 7016) | 0.036 secs/map | 30 ⨉ 120-city maps\n", " altered_greedy_tsp | 6539 ± 240 ( 5994 to 7203) | 0.037 secs/map | 30 ⨉ 120-city maps\n", " repeated_altered_nn_tsp | 6402 ± 185 ( 6015 to 6779) | 0.701 secs/map | 30 ⨉ 120-city maps\n" ] } ], "source": [ "algorithms = [altered_nn_tsp, altered_greedy_tsp, repeated_altered_nn_tsp]\n", "\n", "benchmarks(algorithms)\n", "print('-' * 100)\n", "benchmarks(algorithms, Maps(30, 120))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So overall, the altered greedy algorithm looks slightly better than the altered nearest neighbor algorithm and runs in about the same time. However, the repeated altered nearest neighbor algorithm does best of all (although it takes much longer).\n", "\n", "What about a repeated altered greedy algorithm? That might be a good idea, but there is no obvious way to do it. We can't just start from a sample of cities, because the greedy algorithm doesn't have a notion of starting city.\n", "\n", "Visualizing the Greedy Algorithm\n", "---\n", "\n", "I would like to see how the process of joining segments unfolds. Although I dislike copy-and-paste (because it violates the *[Don't Repeat Yourself](http://en.wikipedia.org/wiki/Don%27t_repeat_yourself)* principle), I'll copy greedy_tsp and make a new version called visualize_greedy_tsp which adds one line to plot the segments several times as the algorithm is running:" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def visualize_greedy_tsp(cities, plot_sizes):\n", " \"\"\"Go through edges, shortest first. Use edge to join segments if possible.\n", " Plot segments at specified sizes.\"\"\"\n", " edges = shortest_edges_first(cities) # A list of (A, B) pairs\n", " endpoints = {c: [c] for c in cities} # A dict of {endpoint: segment}\n", " for (A, B) in edges:\n", " if A in endpoints and B in endpoints and endpoints[A] != endpoints[B]:\n", " new_segment = join_endpoints(endpoints, A, B)\n", " plot_segments(endpoints, plot_sizes, distance(A, B)) # <<<< NEW\n", " if len(new_segment) == len(cities):\n", " return new_segment\n", " \n", "def plot_segments(endpoints, plot_sizes, dist):\n", " \"If the number of distinct segments is one of plot_sizes, then plot segments.\"\n", " segments = set(map(tuple, endpoints.values()))\n", " if len(segments) in plot_sizes:\n", " for s in segments:\n", " plot_lines(s)\n", " plt.show()\n", " print('{} segments, longest edge = {:.0f}'.format(\n", " len(segments), dist))" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nSJIq/T+l9LsUcEiXJQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "50 segments, longest edge = 119\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "25 segments, longest edge = 190\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "10 segments, longest edge = 255\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "5 segments, longest edge = 335\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "2 segments, longest edge = 597\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "1 segments, longest edge = 1021\n" ] } ], "source": [ "visualize_greedy_tsp(USA_map, (50, 25, 10, 5, 2, 1));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Divide and Conquer Strategy\n", "\n", "The next general strategy to consider is *divide and conquer*. Suppose we have an algorithm, like alltours_tsp, that is inefficient for large *n* (the alltours_tsp algorithm is O(*n!*) for *n* cities). So we can't apply alltours_tsp directly to a large set of cities. But we can divide the problem into smaller pieces, and then combine those pieces:\n", "\n", "1. Split the set of cities in half.\n", "2. Find a tour for each half.\n", "3. Join those two tours into one.\n", "\n", "The trick is that when *n* is small, then step 2 can be done directly. But when *n* is large, step 2 is done with a recursive call, breaking the half into two smaller halves.\n", "\n", "Let's work out by hand an example with a small map of just six cities. Here are the cities:" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nrkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cities = Cities(6)\n", "\n", "plot_labeled_lines(cities)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Step 1 is to divide this set in half. I'll divide it into a left half (blue circles) and a right half (black squares):" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_labeled_lines(list(cities), 'bo', [3, 4, 0], 'ks', [1, 2, 5])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Step 2 is to find a tour for each half:" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_labeled_lines(list(cities), 'bo-', [0, 3, 4, 0], 'ks-', [1, 2, 5, 1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Step 3 is to combine the two halves. We do that by choosing an edge from each half to delete (the edges marked by red dashes) and replacing those two edges by two edges that connect the halves (the blue dash-dot edges). Note that there are two choices of ways to connect the new dash-dot lines. Pick the one that yields the shortest tour." ] }, { "cell_type": "code", "execution_count": 93, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# One way to connect the two segments, giving the tour [1, 3, 4, 0, 2, 5]\n", "plot_labeled_lines(list(cities), 'bo-', [0, 3, 4], 'ks-', [1, 2, 5],\n", " 'b-.', [0, 1], [4, 5],\n", " 'r--', [0, 4], [1, 5])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we have a feel for what we have to do. Let's define the divide and conquer algorithm, which we will call dq_tsp. Like all tsp algorithms it gets a set of cities as input and returns a tour. If the size of the set of cities is 3 or less, then just listing the cities in any order produces an optimal tour. If there are more than 3 cities, then split the cities in half (using split_cities), find a tour for each half (using dq_tsp recursively), and join the two tours together (using join_tours): " ] }, { "cell_type": "code", "execution_count": 94, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def dq_tsp(cities):\n", " \"\"\"Find a tour by divide and conquer: if number of cities is 3 or less,\n", " any tour is optimal. Otherwise, split the cities in half, solve each\n", " half recursively, then join those two tours together.\"\"\"\n", " if len(cities) <= 3:\n", " return Tour(cities)\n", " else:\n", " Cs1, Cs2 = split_cities(cities)\n", " return join_tours(dq_tsp(Cs1), dq_tsp(Cs2))\n", " \n", "# TO DO: functions: split_cities, join_tours" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's verify that dq_tsp works for three cities:" ] }, { "cell_type": "code", "execution_count": 95, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "3 city tour with length 1203.4 in 0.000 secs for dq_tsp\n" ] } ], "source": [ "plot_tsp(dq_tsp, Cities(3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we have more than 3 cities, how do we split them? My approach is to imagine drawing an axis-aligned rectangle that is just big enough to contain all the cities. If the rectangle is wider than it is tall, then order all the cities by *x* coordiante and split that ordered list in half. If the rectangle is taller than it is wide, order and split the cities by *y* coordinate. " ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def split_cities(cities):\n", " \"Split cities vertically if map is wider; horizontally if map is taller.\"\n", " width, height = extent([c.x for c in cities]), extent([c.y for c in cities])\n", " key = 'x' if (width > height) else 'y'\n", " cities = sorted(cities, key=lambda c: getattr(c, key))\n", " mid = len(cities) // 2\n", " return frozenset(cities[:mid]), frozenset(cities[mid:])\n", "\n", "def extent(numbers): return max(numbers) - min(numbers)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's show that split_cities is working:" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQ4AAAEACAYAAABCu5jVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFKpJREFUeJzt3X+YlWWdx/H3VydRQfyNQGYYqYOCUoaJmpZpXmZmpqux\narpd6tpm5qp5lZLrJmXijzaNRNtrS5HU1VRCXcUfsWpCoq3JCIgh9MMBCX/BjIAg3/3jfsYZmGGY\n+8w55z7Pcz6v6/I6eJpzzsf0fOZ+7ud+7sfcHRGRGJulDiAi+aPiEJFoKg4RiabiEJFoKg4Riabi\nEJFoKg4RiabiEJFoKg4RiabiEJFoKg4RiabiEJFoKg4RiabiEJFoKg4RiabiEJFoKg4RiabiEJFo\nKg4RiabiEJFoKg4RiabiEJFoKg4RiabiEJFoKg4RiabiEJFoKg4RiabiEJFoKg4RiabiEJFoKg4R\niabiEJFoKg4RiabiEJFoKg4RiabiEJFoKg4RiabiEJFoKg4RiabiEJFoKg4RiabiEJFoKg4Riabi\nEJFoDakD1Auz/kNg+DgYNBgWN0PTWPfli1LnEimFiqMKQmkc9yhMHAp9gVbgnAPN+h+h8pA80qFK\nVQwf114aEB4nDg3Pi+SPiqMqBg1uL402fYGBg1OkEektFUdVLG4OhycdtQItb6VII9JbKo6qGHU9\nXLauvTxagQuXwY2jzdg/ZTKRUpi7p85QeGb8HGathW9tEw5PljRD01hY/jHgZuBr7kxNnVOkp1Qc\nFWbGcOAxYC93Oh2amHEAcB/wQ3d+Wu18IqVQcVSYGQ8CD7lzfTc/szuEnwMucue9auUTKYXmOCrI\njCOBPYCJ3f2cOwuBg4CRwN1mbF2FeCIlU3FUiBmbA1cD33Hn3U39vDtvAkcBK4DpZuxS4YgiJVNx\nVM6phNMn9/T0BVnBnA48AMw0Y+8KZRPpFc1xVEB2qPEScJI7M0p8j68SRixj3Hm8nPlEeksjjso4\nH5hRamkAuHMr8BXgDjNOL1sykTLQiKPMzBgAzAE+6c6CMrzfMMKhyyTgcnf0L0ySU3GUmRkTgHfd\n+dcyvucuwFRgHnCWO6vL9d4ipVBxlJEZjcCTQKM7r5f5vbcGbgN2AI7PzsKIJKE5jvL6EXBVuUsD\nwJ13gH8A/gDMMOMj5f4MkZ7SRj5lYsZhwH6ECc2KyFaUXmDGAuApM4535/eV+jyRjdGIowzM2Ay4\n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\ncYhItP8Hf62p30lzGqcAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Cs1, Cs2 = split_cities(cities)\n", "plot_tour(dq_tsp(Cs1))\n", "plot_tour(dq_tsp(Cs2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now for the tricky part: joining two tours together. First we consider all ways of deleting one edge from each of the two tours. If we delete a edge from a tour we get a segment. We are representing segments as lists of cities, the same surface representation as tours. But there is a difference in their interpretation. The tour [0, 2, 5] is a triangle of three edges, but the segment [0, 2, 5] consists of only two edges, from 0 to 2 and from 2 to 5. The segments that result from deleting an edge from the tour [0, 2, 5] are:\n", "\n", "
\n",
"
\n", "\n", "You may recognize these as the *rotations* of the segment [0, 2, 5]. So any candidate combined tour consists of taking a rotation of the first tour, and appending to it a rotation of the second tour, with one caveat: when we go to append the two segments, there are two ways of doing it: either keep the second segment as is, or reverse the second segment.\n", "\n", "**Note:** In Python, sequence[::-1] means to reverse the sequence." ] }, { "cell_type": "code", "execution_count": 98, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def join_tours(tour1, tour2):\n", " \"Consider all ways of joining the two tours together, and pick the shortest.\"\n", " segments1, segments2 = rotations(tour1), rotations(tour2)\n", " tours = [s1 + s2\n", " for s1 in segments1\n", " for s in segments2\n", " for s2 in (s, s[::-1])]\n", " return shortest_tour(tours)\n", "\n", "def rotations(sequence):\n", " \"All possible rotations of a sequence.\"\n", " # A rotation is some suffix of the sequence followed by the rest of the sequence.\n", " return [sequence[i:] + sequence[:i] for i in range(len(sequence))]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see if it works, first on the 6 city example:" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nmYpDRDL7f32INzgSOu2iAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "6 city tour with length 1431.7 in 0.000 secs for dq_tsp\n" ] } ], "source": [ "plot_tsp(dq_tsp, Cities(6))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That is indeed the optimal tour, achieved by deleting the two dashed red lines and adding the dotted blue lines.\n", "\n", "Now for the USA map:" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nBDopa1IAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "80 city tour with length 14883.2 in 0.142 secs for dq_tsp\n" ] } ], "source": [ "plot_tsp(dq_tsp, USA_map)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Not quite as good as altered_greedy_tsp. Let's alter it!" ] }, { "cell_type": "code", "execution_count": 101, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def altered_dq_tsp(cities): return alter_tour(dq_tsp(cities))" ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "80 city tour with length 14209.6 in 0.109 secs for altered_dq_tsp\n" ] } ], "source": [ "plot_tsp(altered_dq_tsp, USA_map)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's just remind ourselves how the algorithms behave on the standard test cases:" ] }, { "cell_type": "code", "execution_count": 103, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " nn_tsp | 5668 ± 488 ( 4674 to 6832) | 0.001 secs/map | 30 ⨉ 60-city maps\n", " greedy_tsp | 5392 ± 306 ( 4554 to 5967) | 0.002 secs/map | 30 ⨉ 60-city maps\n", " dq_tsp | 5268 ± 236 ( 4743 to 5752) | 0.042 secs/map | 30 ⨉ 60-city maps\n", " altered_dq_tsp | 4953 ± 221 ( 4575 to 5399) | 0.049 secs/map | 30 ⨉ 60-city maps\n", " altered_nn_tsp | 4820 ± 233 ( 4450 to 5346) | 0.008 secs/map | 30 ⨉ 60-city maps\n", " altered_greedy_tsp | 4766 ± 207 ( 4320 to 5185) | 0.009 secs/map | 30 ⨉ 60-city maps\n", " repeated_altered_nn_tsp | 4640 ± 194 ( 4298 to 4991) | 0.148 secs/map | 30 ⨉ 60-city maps\n" ] } ], "source": [ "algorithms = [nn_tsp, greedy_tsp, dq_tsp, altered_dq_tsp, altered_nn_tsp, altered_greedy_tsp, \n", " repeated_altered_nn_tsp]\n", "\n", "benchmarks(algorithms)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Of the non-altered algorithms (the first three lines), divide and conquer (dq_tsp) does best. But interestingly, divide and conquer is helped less by alter_tour than is the greedy algorithm or nearest neighbor algorithm. Perhaps it is because divide and conquer constructs its tour by putting together pieces that are already good, so alter_tour is less able to improve it. ALso, dq_tsp has a standard deviation that is much smaller than the other two—this suggests that dq_tsp is not producing really bad tours that can be easily improved by alter_tour. In any event, altered_dq_tsp is the worst of the altered algorithms, both in average tour length and in run time. \n", "\n", "repeated_altered_nn_tsp remains the best in tour length, although the worst in run time." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Shoulders of Giants: Minimum Spanning Tree Algorithm: mst_tsp\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "I hope you now believe that you could have come up with some ideas for solving the TSP. But even if you can't come up with something all on your own, you can always [Google it](http://bit.ly/XNGt2y), in which case you'll no doubt find a giant of a mathematician, [Joseph Kruskal](http://en.wikipedia.org/wiki/Joseph_Kruskal), who, in 1956, \n", "published [a paper](http://www.cmat.edu.uy/~marclan/TAG/Sellanes/Kruskal.pdf) that led to an algorithm that\n", "most people would not have thought of on their own\n", " (I know I wouldn't have):\n", "> **Minimum Spanning Tree Traversal Algorithm:** *Construct a Minimum Spanning Tree, then do a pre-order traversal. That will give you a tour that is guaranteed to be no more than twice as long as the minimal tour.* \n", "\n", "What does all this jargon mean? It is part of *graph theory*, the study of vertexes and edges. Here is a glossary of terms:\n", "\n", "* A **graph** is a collection of vertexes and edges.\n", "* A **vertex** is a point (such as a city).\n", "* An **edge** is a link between two vertexes. Edges have lengths.\n", "\n", "* A **directed graph** is a graph where the edges have a direction. We say that the edge goes from the **parent** vertex to the **child** vertex.\n", "\n", "* A **tree** is a directed graph in which there is one distinguished vertex called the **root** that has no parent; every other vertex has exactly one parent. \n", "\n", "* A **spanning tree** (of a set of vertexes) is a tree that contains all the vertexes. \n", "\n", "* A **minimum spanning tree** is a spanning tree with the smallest possible sum of edge lengths.\n", "\n", "* A **traversal** of a tree is a way of visiting all the vertexes in some order.\n", "\n", "* A **pre-order traversal** means that you visit the root first, then do a pre-order traversal of each of the children.\n", "\n", "* A **guarantee** means that, no matter what set of cities is selected, the tour found by the minimum spanning tree traversal algorithm will never be more than twice as long as the shortest possible tour. None of the other algorithms has any guarantee at all (except for alltours_tsp, which is guaranteed to find the optimal algorithm, if it has enough time to complete).\n", "\n", "We will implement a vertex as a Point, and a directed graph as a dict of {parent: [child, ...]} pairs. \n", "\n", "Visualizing Graphs and Trees\n", "---\n", "\n", "I think we will need visualization right away, so before doing anything else I will define plot_graph. I will make it plot in red so that we can easily tell a tour (blue) from a graph (red)." ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def plot_graph(graph):\n", " \"Given a graph of the form {parent: [child...]}, plot the vertexes and edges.\"\n", " vertexes = {v for parent in graph for v in graph[parent]} | set(graph)\n", " edges = {(parent, child) for parent in graph for child in graph[parent]}\n", " for edge in edges:\n", " plot_lines(edge, 'ro-')\n", " total_length = sum(distance(p, c) for (p, c) in edges)\n", " print('{} node Graph of total length: {:.1f}'.format(len(vertexes), total_length))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's try it out:" ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8 node Graph of total length: 10.9\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Ps = [Point(0, 0.1), \n", " Point(-2, -1), Point(0, -1), Point(2, -1), \n", " Point(-2.9, -1.9), Point(-1, -1.9), Point(1, -1.9), Point(2.9, -1.9)]\n", "\n", "Ptree = {Ps[0]: Ps[1:4], Ps[1]: Ps[4:6], Ps[3]: Ps[6:8]}\n", "\n", "plot_graph(Ptree)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now our plan is:\n", "\n", "1. Implement an algorithm to create a minimum spanning tree.\n", "2. Implement a tree traversal; that will give us our mst_tsp algorithm.\n", "3. Understand the guarantee, \n", "\n", "Creating a Minimum Spanning Tree (mst)\n", "---\n", "\n", "Now let's see how to create a minimum spanning tree (or MST). Kruskal has a very nice algorithm to find MSTs, but with what we have done so far, it will be a bit easier to implement another Giant's algorithm:\n", "\n", "> **[Prim's algorithm for creating a MST](http://en.wikipedia.org/wiki/Prim%27s_algorithm):** *List all the edges and sort them, shortest first. Initialize a tree to be a single root city (we'll arbitrarily shoose the first city). Now repeat the following until the tree contains all the cities: find the shortest edge that links a city (A) that is in the tree to a city (B) that is not yet in the tree, and add B to the list of A's children in the tree.*\n", "\n", "Here's the code. One tricky bit: In the first line inside the while loop, we define (A, B) to be an edge in which one of A or B is in the tree, using the exclusive-or operator, ^. Then in the next line, we make sure that A is the one that is in the tree and B is not, by swapping if necessary." ] }, { "cell_type": "code", "execution_count": 106, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def mst(vertexes):\n", " \"\"\"Given a set of vertexes, build a minimum spanning tree: a dict of the form {parent: [child...]}, \n", " where parent and children are vertexes, and the root of the tree is first(vertexes).\"\"\"\n", " tree = {first(vertexes): []} # the first city is the root of the tree.\n", " edges = shortest_edges_first(vertexes)\n", " while len(tree) < len(vertexes):\n", " (A, B) = shortest_usable_edge(edges, tree)\n", " tree[A].append(B)\n", " tree[B] = []\n", " return tree\n", "\n", "def shortest_usable_edge(edges, tree):\n", " \"Find the ehortest edge (A, B) where A is in tree and B is not.\"\n", " (A, B) = first((A, B) for (A, B) in edges if (A in tree) ^ (B in tree)) # ^ is \"xor\" \n", " return (A, B) if (A in tree) else (B, A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see what a minimum spanning tree looks like:" ] }, { "cell_type": "code", "execution_count": 107, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "80 node Graph of total length: 11518.4\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_graph(mst(USA_map))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This algorithm clearly produced a spanning tree. It looks pretty good, but how can we be sure the algorithm will *always* produce a minimum spanning tree? \n", "\n", "1. The output is a **tree** because (1) every city is connected by a path from the root, and (2) every city only gets one parent (we only add a B that is not in tree), so there can be no loops. \n", "2. The output is a **spanning tree** because it contains all the cities.\n", "3. The output is a **minimum spanning tree** because each city was added with the shortest possible edge. Suppose this algorithm produces the tree T. For another putative spanning tree to be shorter, it would have to contain at least one city C whose edge from its parent was shorter than the edge in T. But that is not possible, because the algorithm always chooses the shortest possible edge from C's parent to C.\n", "\n", "\n", "\n", "**Note:** There are refinements to Prim's algorithm to make it more efficient. I won't bother with them because they complicate the code, and because mst is already fast enough for our purposes.\n", "\n", "Turning a Minimum Spanning Tree into a Tour (mst_tsp)\n", "---\n", "\n", "Given a minimum spanning tree, we can generate a tour by doing a pre-order traversal, which means the tour starts at the root, then visits all the cities in the pre-order traversal of the first child of the root, followed by the pre-order traversals of any other children." ] }, { "cell_type": "code", "execution_count": 108, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def mst_tsp(cities):\n", " \"Create a minimum spanning tree and walk it in pre-order, omitting duplicates.\"\n", " return preorder_traversal(mst(cities), first(cities))\n", "\n", "def preorder_traversal(tree, root):\n", " \"Traverse tree in pre-order, starting at root of tree.\"\n", " result = [root]\n", " for child in tree.get(root, ()):\n", " result.extend(preorder_traversal(tree, child))\n", " return result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To better understand pre-order traversal, let's go back to the Ptree example, and this time label the vertexes:" ] }, { "cell_type": "code", "execution_count": 109, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8 node Graph of total length: 10.9\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "P = [Point(0, 0.1), \n", " Point(-2, -1), Point(0, -1), Point(2, -1), \n", " Point(-2.9, -1.9), Point(-1, -1.9), Point(1, -1.9), Point(2.9, -1.9)]\n", "\n", "Ptree = {P[0]: P[1:4], P[1]: P[4:6], P[3]: P[6:8]}\n", "\n", "plot_graph(Ptree)\n", "plot_labeled_lines(P)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A pre-order traversal starting at 0 would go to the first child, 1, then to its children, 4 and 5, then since there are no children of 4 and 5, it would continue with the other children of 0, hitting 2, then 3, and finally the children of 3, namely 6 and 7. So the following should be true:" ] }, { "cell_type": "code", "execution_count": 110, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preorder_traversal(Ptree, P[0]) == [P[0], P[1], P[4], P[5], P[2], P[3], P[6], P[7]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And this is what the pre-order traversal looks like as a tour:" ] }, { "cell_type": "code", "execution_count": 111, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAACsCAYAAAB4rhdRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADylJREFUeJzt3X+sX3V9x/HnmzVgB21hS6CUxdVsIG4FahgYwJlBgsIW\nRNkmQkuCEDaEDZzyYwpuZRrZrIDMTaQYYPwYTAZOYVQjAaYUMlndCHXZoCiZUpikhh8FImO898c5\nk9vLve398T33nM85z0fyzaWX9n4/zen3dT/38z3v9zsyE0lS/+3Q9gIkSXPDwJekgTDwJWkgDHxJ\nGggDX5IGwsCXpIEw8CVpIAx8SRoIA1+SBsLAl6SBMPAlaSAMfEkaCANfkgbCwJekgTDwJWkgDHxJ\nGggDX5IGwsCXpIEw8CVpIAx8SRoIA1+SBsLAl6SBMPAlaSAMfEkaCANfkgbCwJekgTDwJWkgDHxJ\nGggDX5IGwsCXpIGY1/YCpC47JGLN7nDQ8+yyb7LTvOAnryxgy3/8CB58IPP32l6fNB0GvrQNu8NB\nX4HlsIXqwTxg+bHtLkuaEY90pG14nl