"
]
},
"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": "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\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 Edge | Usage of edge | Resulting Segments\n",
" |
---|
— | — | A; B; C; D; E; F; G\n",
" |
CG | Join C to G | A; B; CG; D; E; F\n",
" |
DE | Join D to E | A; B; CG; DE; F\n",
" |
AC | Join A to CG | B; ACG; DE; F\n",
" |
GD | Join ACG to D | B; ACGDE; F\n",
" |
FD | Discard | B; ACGDE; F\n",
" |
AE | Discard | B; ACGDE; F\n",
" |
BF | Join B to F | BF; ACGDE\n",
" |
CF | Discard | BF; ACGDE\n",
" |
EF | Join ACGDE to FB | ACGDEFB\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": "iVBORw0KGgoAAAANSUhEUgAAAYsAAADqCAYAAABTP2nAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXl8ldWd8L8XdVoHQtvRsWqnI2htR6sWrY1EgkZI0AKB\nJKAGQlgEBNlTFKtEtFO6vp1pO9O3tct0Om+x09olLq3FYlFbwN2q0FAVYgCFsIiSjSWQ3/vHuYdn\nO+dZ7g1cwPt8PueT3Huf5zy/s/32JSUi5K/8lb/yV/7KX2FXr1wDkL/yV/7KX/nr2L/yxCJ/5a/8\nlb/yV+SVJxb5K3/lr/yVvyKvPLHIX/krf+Wv/BV55YlF/spf+St/5a/IK08s8lf+yl/5K39FXnli\nkb/yV/7KX/kr8soTi/yVv/JX/spfkVeeWOSv/JW/8lf+irzyxCJ/5a/8lb/yV+SVJxb5K3/lr/yV\nvyKvk3MNwLF6pVJ9+8FFS+Gss2HbVlhXL9LanGu48teRufLrnb/yV/h13BOLI3HIVZ+jH4N7z4Pe\nQAcwc2Aq1bc0j0BOvCu/3vkrf0VfqeM566zlkG+EB7M65KnUkPvh4etVn/rqAMruE1kzITuo48KQ\n53SP1pVKXbkMVtTEWe/8uuSv9+p1nEsWFy1VhGIX8A2gG+h3Hpz3TaAyTg+pFCcDFwMD060IBp/v\nRRygPp95ds/BHgZT5pxuHpllcp11tnm9rxmbStEN/FG1vifnJZD89V69jnNiUXAu3ANsBc4FpgGn\nA29cm0r17Wc6wKkUZ+IQhoHwxuXwg4OwrxPadsDtB+FgO3T0CXKaLVuzhTgeMtdEUL+/N+rzxqWA\nVbI5XtUpuSdwp75PzZV/vV9YDqwGRgD/BnNOgcV9k65L/spfJ8QlIsdFg4J+ULQMqlaqv2deDWO6\noF5giai/0wWaBdpF3SN/B1IIMh/kf0HeANkN8gjIEri/FiY2qfsl/dwtu+H8oTBhg/f7CRugoF/2\nYzD3C3IayAiQL8Ft76jf/a1yZXj/RcucvsX1jqJl2c11snEned6Zk0aBewQWC5S2QkHx0dlX8hHY\nuAumbAlbb5BeMOHZTNYl3/LtRGg5ByAWkEaEMvAQ1In3gNcJLEh/XvQuSAfISyDfA5kE8gmQlNOv\nHbk6CK8yI4RpHoftfZ9/F6QV5DGQf4Wxf0yK9BWxmbvZjMzGrUk+1yaCFk0Ewp63z0mjwELfWla3\nRs05FBRDURNU7lZ/4xEY7zjq3oSnvxVnveGq/+0JYpxv+XY8tpwDYAQqgJQKG4IIpcL1f7OLiFwj\n6t7KP4D0CX9P1cqjySna3zfhGZCTveP3I9wZO80ITE4FuR1kJ8x61YzM6veB3Anyd9Ew2ghaYUMc\nIpBUulFzco8kJ44FxTDhgA+eA26CoeaxsAHKW6CkBQY0pJ/zjaM2UmoE6QPrn4bZe3pa4sy3fDse\nWs4BMAIVOMw3HggilFoXofBzpV6kYX9Pz6ht4o8rPmfq5XQ/+xBsfBvkbOd3OQlkCsgWkF+BfNzO\n1d8xCOQhkEaQq8NhtBG0mkNm2G/dDvIySDPIO3BXdxICrMa42HC//Zn0c01meIo3q7kp6Afjm4OS\nZ3mbYibirzlIAcifQX4Ep/UPk0CyVeHlW74dqy3nABiBCiCBegkilFvThzw5V+q8J5nKxHlGI4MB\nDYpzjaOblw/B356DOa2ZcKYgS0HuB0mhbBtr0wisyAyfF5mln6sA2QzyE5B/NL/HRkCH7DAj9Ekv\nglwKdw+GkvsVB5+EIBY2wOhDao2bEyDwyt12oiZ7lWrPKGWl94z/ORsxkwKQVSA/BOnV0/sp3/Lt\neGk5B8AIFOI7yM0CpV3ew98sMDdNRLQaakn6b3MoV+p9V0E/KP6Z4oivtCJ8dd8Fy6H6oIKjWYI2\nEwcxeIlK6a/htfUg34ziTEPm5FTXnDSCjMJlf0kwt31AvgGyHWSaHwHaEd6AhnD7jn4mfF7C31Mn\njoNCFNG2SRZFTWquap4xE5MlEmQ8bMRM+oKsBvl+FKFIwxTDBpaXOPLt+Gw5B8AIlPHAXbBcGT3d\nyKVsCxR2wA0C5QJVomwZpQIXLDf3bT60IC241DzBZyqa1Tv0+20SzYAG1Wo6vbDO3JUpggD5GMgv\nHCL5mYcUB1/eojjz5P2CfArkqTQyvNj723dHKM7cIWjhhm8/kmwWxcGPbLEbi22IdfRBGP5wPOO2\n3WZh779elLdVFJG//km4bSe8+NM4hEI9a1PhzdwOkzdlI3HkiU2+5brlHAAjUJHeOJVpFdD4Zq+H\nVLnAijSHWr5X3VMVgfAqmhXCvb0VRi+3Iza/KmyJASk0C9TuV/f2hAurnAHynyC7QBZDyQUwqT3I\nuY9vzpBg9AK5GWQHyNdU/0XLYOZrMOs1uz7er+JK7ihgf2bBVpA58eAvKIZr34EbO/3eUHabRUVz\n2ovKMI6knlx+BG6TvobtzmY/5NVb+XYstJwDYAQqwo0x/XuTMmxfJ0odpWMtbhBFQOrTTVyHq7Ah\nyAHXSZSPv0IGWsUVJlloImEiJBKKPL3vk94gd6WJxLdJ2xccotWzRnmQD8PLv4a6riQIyVmn+HYK\n59lhFsRasxrkVwlgvxnkv+zwFTYoCeewN1TIeMIdHrzEobBBER4/0fZ/N2EDDFudnJh6CFFTUqN8\nvuVbT7ecA5AYYCOXNVlgfhpZTxMVa7HEh7TbBar3eQ/cPRLHx99B0u57Tbr5sZ3hKqrwww1yMsgM\nkK2oIMLzvL9roiWGNmcTyIXeeYqvtkju8prcTuEa50mw/hmYsSv4zMKBaSIZU/UjZSA94uocJiGF\n21g88/UgLOmCsU94bRWZzq2+d6HvXRJKbPIt33q65RyASACDMRe/tbhwug7wtWL2ehn2jvdZv7Tg\n7s85yI7Nwi+FFHfA5Y86EpCWXIzuvBbjt0YoUgGyHmQlyOXmuQiTLGb8FeQtkGfh8buCkelRUkIy\nVVImdgrnWVkE8gScda7Fc+t1kEvi7Y9/vRruaIsiivECCv2Sp7MX7Ajfv8cmvQDydPDdSQMVTXNb\nK44DR16yOBabJbbHuM7HW8s5ANETb5Ii/ByWCIx3HaJrREkYfq5vgC+wzOSSq5sXSSpYBjSoDVB9\nEIq3K/WCTeetD/iYTrcR2jymeXvT3lKfJcTDyUu0gjaLtGRyHcx7I7laKJNguuh588JetEylzKjf\nC3cMssPyl5/BpOfiEYDajVFIOARZF3vVSmVb7HNrG69feh22W0XSe+F2xl/zDCzuhE993D5+97tM\njEedwKQOOK1/rs9ovvn3mdVOZtzDx1PLOQDhkx/m0WL6TnN5w/cHdcdzOxUn6zeSl7YnVxHM2Bkt\nNdjsLbYxXfZAHLWRl2iNNHpDZWZwTsr9lv0m7rwl6VvdO70l3r22uZzwFCq9Sw3IjVD9J/N9fq+o\nOoFV4rhh1wsMaIi3F9sFJoljWwiDW34PMi3evrdJvjN3gnwj12c03/zr1iheN35tPz3+pcCcAxA+\n+TakN+ZQ0AtqVXqB2kUjUAdpD7oP1q+Bp/8jqP7pMxaqYxt2s436No+pWWDCPhMMmbhMZgpjFKFz\n7pPzYcMWs80hCVI3EZYk94Z6VP0PyH0gv4DPWQIKTfEWfrXSyBZH8pjU7h3v+GZFuCsTGaHhvmq4\nYw9UPW534NDE1Wajuv5JlNpydq7Pab7pdbvu6aAUuFCUPfX4ty/lHIDwybchjk+9pdRRfq5wrtjc\nSGHG5UFvH+29Ej/jabb5pMxjstkhhj6R1D/f0ZneeNCJio5+LhxmN8Ea/jBsaAGZHp+4xJ+zZPfG\nIyzx7Q0iQbWSW3KY2A0X/8E03rhwx5Wy7J5mWr1Z3gLXPgAbt4OMzGwt8/EaPdFQ6t+boaLLvM8q\njEzD8dZyDkD4ItgO1uWPmhelcHNyicCk0ipqsvdjM4IWNmQ+Ju1F5W+j9idXkfn7runMxshm7nP6\ntmQBZUdKskiCeGf6pKDqdsfl2m00dhMHk7dTqTEbbvaEK1Ovs5u2pPOGXRZvLSuavWn9Twx9eq4a\nyLUg60CegOqXzee4Yu+JMMc5ByB6MQr6waUNUNntRCyPXpOUu49noNRtsQQNoFptNaDBnBp9QCxi\n4YzJzZHbCFB5S5JxZqsiO1J9JrdZZBIYF5XYb14rXLMNylar+R61JbiGY3fAzbtUXyUtZkeKxVkS\nrkztSWHxLDc+CfImyD+Hr0P2ezff9FzKJ1G2p9dBRoOknLPiTj9UL3CJMZvE8dZyDkD0opgO4ciD\nSRFYMslCGxVNaSFGr8kmF1X8MZqCCMPHeSRSrvdUnw7Cq30OFnfAp0O8gQr6KQS4cGc2qhL7vNoi\nravXgnwnfL/cYx17HLVcNjUxwuNA5HOo5JIfsD9vIzYlLbk+58dLQ2VV+B4q68F8XGn/o7wVcw17\n1mPPNQDRi2M6tI0C49uDSCBORTaTzcJvkNIcpTHhnCWBXdkfs9EFGxBNMVzxAIzrjmt7OFYli2Cf\n61ZEucaCnAeyqef3jkKO3u808R+3X3lSaccCfy6yhem9l9nYQfqqYMTZGWYeDktUKCmQ70Djn5VD\nR3Bu7ZLqyDyxiF6796PqxuwC+SbIP5jvS8bgHU8t5wBEL5KNm6rdDLNfT5K91cT5pb9rUoRBSwl6\ngU0G0LLVQaJz0y6YdjBIiLy5qeKPOdz2YDBSptVlN/wFyrtt7puZeVb1bF4i1d+UzdHqGukF0gby\nwZ7fOyNdHLY9gFLNa2mrszcaMx47qmzucyDfTZJ52Ltm7hQj2tA9ttPx/jvnPJjbYZvbbO1t78WW\nJsI3grwB65bDdQ+aCbGcDTIJ6hKpjo+nlnMAohfLqj7aB/Ix72EK1JcI2BzM7zAhxHEHba6QQaJj\nU2v4c1PFTUcexkEakfcBL4GoblVEzRYwmAwmx8Oqei8Mezc7g3kSA7Y8BZJRLW6Qk2H6WhtydOYi\nPII/rsdXBCxnolREX8MQdGkj4nZp+ILlMGF/cC2j0sgXNsANXV5JddruE0FFciQayECQNSAvKndn\n/1pM3QrP/xBl4H4b5JdQ+3RessjZgpkOzIxd0PCYkwq8UVQ+KLc7baMYUlhHGEoLG1TEdb2ouI14\n+Y7iR/dmE4sh4iAsmy7d/XlhC6o40hqQp2HRrkw3cU9KFyq2wDy24DtnvQYzXk3GfRctS1cGXKVU\nMpPesEgNmghYiigpeDKXxvQzwxrg9TdA6u2EIlDmdSP8qAImPWtZM4sq1K9e023cWrOkOuRxeL2Z\nmHm4TpQWtaYg/VC52d5U0oL0shuvr/8rSCHIST19Vo61lnMAki1u5UpVqGjlDpiyxZvczx+rkEld\nZ1tOngkSFn8R348/m1gMzSHG9eqa9CLIYJBBikOqfS4Okk4KT7J1lJNg9oaovrL3nqo7CKu/qg55\nphH1VikuA9uYuX56+Ptv3w3z37KsmYXAjbQYsEcfsI9RXgYZmuszfnRxia0EgvQF+QpKSrgbpLfz\nXNVKs8qyptPugZe5NHostpwDkHyxZSp8bqtaKHciQD+yTJ4mPBwRa44uNsKSsDKhYdxNmK48vmSR\nnX9/vHmJr4dFBS7dB+tXR+VzssM6cz3IF1CeP1NBxsKYx7IhZOHII/mcJY+jyESKtEkWbvWaeyzD\nrK7mIHNAfpHrc3308IdtTmufAdkG8t8gHzE/1/PlAY6ndjLH0ZVKcRJwO7zdAr3Pgl5AF9Ab9X9H\n+n8Mn0l/btlqf8O2reZneqW/G9IfznsslepbKtLarO8QaW1OpfqWwsalcObZsHs/nD8MTu/l9DFz\nI6y7N5W6chkU9IcRF8OPClS/HcDMgaoPgNE/gXtdv01rg99NTr+nHmYOhHvPcz3bBXee4ntXvXds\n6+qhrhS++WHXc4b7TNcpJyWfS0il+vaDi5bC2f8E/9Qfbm6CC0vhgQ/DhvRctWyFdfXu+YSzzva+\nC/1uvV8/ClwEfAD6X2a+98yzo8dlWjsFj/r19NJg37uA95WmUmNWqv0SF3YbPLY9p+Hwr/WMvXDa\nfhgn8LUUXICzluvrYD3BsVy0FDqKLOu3DN74Uio19ZfwodPMYzqRLuv6fBwYKsKL5ufW1cNHqqD3\nqYZnY+214/7KNbVKxhXIWJCnvanAdalTv4iYzGah+g+rI+A2hkbWpfgPZfjyu8JGG1XjcKZmN9s4\naTf+8nPlsprEg0yqYONOpfbLdi5rN2brIpr03uw8wPycpDuCOuiNlBT29LtCPa4c+Eethuv2Rjky\nxF8Lt+0mM1feXLfM1vZKy/rc8je32sn87InrFhtrvnMNQPyNISmQ5+HBm5X7oDZmrxLn/0Ba8GKV\ny+jz7ckQhdvQrQmFO/5i1Gr7xr1xFdy1H2653Pu7e5PaVWRHIrDONX+bQC5I8MwYkO0glyXVw2an\n9uqZiO9MjY1eY6abAdE2sqmiUuLHfWe10d6V7N7s7Ea29TsScTRHBx9kurZPfiFod5jYBC//BmQD\nyNXJvNOqNvs8MEPffzy3nAMQf3NIKUijg3QXiJPjZoGo4keLxW9XALkYZG1mm9EWf1Hqq6Rn2kST\nN8HyBSD/DvIE1B90DmNPSRZJOCr5GMq7I6Jehu63+k+wcQfIpZmtV7YJF+MTp55GhMF6Etr7pXQ/\nTBdHmjX3GyUtOO8pWmZOaZ0kw25UNHmU2/iRYU6OHB7Q4ypvcZi56LVFBdXdre57dS2U3G8oujVK\nJcmc9a6NCHn32ph1MMuYLTrX83RE5j7XAMTfHLfthpo1Tl6o8Gp0rk2SEbFw3h0dxWtHSvOaUVGf\nZXDNL517QgPBXITHFHhlSgZXtiWKuwGZCfKT8LH6Cd4Ua2LG6LnLPceaOYK11hRvi1Mwyz72Sc+h\namx8FuQKKH/BnNK6zCC5JlHNJZHMcr9Oyc5jVLlZZ22d9Zy2Du5sS9+3Lrz/Qc09pQI90VrOAUi+\nOUravUhXpxa3eSplTizU88NWB/NAiW9TRiOl4FgaBUoPwMgXDN5Q/dJV/QyBV5cs98Z/NIoquhPF\nCX1uB4xfndyFM9PUFrn1NwdJKeQc154xoMGpcmarKT7yhTileO37Yd4WVI2N5SDPhri0NnnnsWiZ\n2od+xqUn6ofEV4XlukV7AvrX9iafnW1yN1SPC86tOzo+XuXM4Dq7JdCSlhNRusg5AMk2R7Oocqnx\nEnWpzZDMZhF/g8aRLPzuq/HTR9j7LOv2fh+m0krCYVoR3JsgFwYPV3SEvLq/5H6lgks+/0nUbd57\nr/kl/PWP8Le/wGQXAfBIacXeuTEZs701xR33SR3bE0Cw/ZLtB1v2ZGUTszAYrcrYbWIw9PhtOaC0\nMTygiy+Gazt6Iq3JkcUHUa7tt3SqipPj1sDwdnMGBqVCNp+NOlEqbdPaFTb4585u2zox1VE5ByDZ\n5tCI0R9FGUyx3FOcrbmfm7dH2yxsOuq4HJ/tYIw6EDwopvtC/fQTiNTTXgHZpuIjpm3zjfGALQ+V\nd27q9yrDf3yCkb2R+5bdcP7HHCmt1ucZ584oHDWPGjGMXqPsFtPEVzCr3c2J98R+SBPitphMSL9w\nwidpeP1zkHk8SW7wgQ3OkhaVdPMmn/3Ar6IScbQQNpvHrRJE/KaEo7qEgclr7ticv6znP9cAJNsc\n8QPtevIAeI1awx+GJ95RaRzcXEa0QbZnqsAVbvZ+HyZZJHlfaGTr38G4P4erAILza7aveIvt2D1P\nBsdO5R211ubf/eoG2zwOMAS6VXfAwB22GujBPWPbD7Y57zNWEWI/jJpJqtwdbsg3qdHKrITneDFy\nK+RcZpDMzzlPBdXF2Z+awOvPfoKyRILqbWvOrSbFQJR0mmufHFvzl/X85xqAiM3hO0zuA+BetGDW\nzCPnglrQL1h1LfsU09Fjd3MzWrcu6QNTezAZxzh/M1RdHBSr7QgufpoRt50mvNiOeYxT34KXfgH1\nXfEJXfham3/3EwebnSLatz6pd1rQVlLY4J5zDkdou2E0qTpu3g5PfxvqtgfH1yyK49b92guGHeuS\nhZqTwgalQnS7s1e3wl2fA1kHt71jHp+fMGiJ0D1Ot83DnfxTpfJwUn34bZfuvsMzNpwILecAxNso\nGoFdtjlupS/7AViwBeQaQlxIw+E5OvEDwbH7/b3d39/7bZV0z3SfKTDuf++HBV1x4Qgfd1CycOAr\n328W9VWxHXufU16A0l9bGINVCplW7k47NRSHSGEN9vc0StBgXNEcRNxRhCgqzsNEkMP3AFTuCRII\nm+Qz7RXluBBF0EJVXgaYZrSpCpW5jR8I94BqF7hjD8ioEBVVt1cSMammtM1jniibhbfCnZ3pWeB7\nV2ZZpo+XlnMAkm0cG4WPq1ap3Qh/vAOkEZVAbQrI+5PD4N5ouiWJHxjzGNz6dk8dQpD7QSbY3+cl\nOJkQPMt8HjTYLIrth1u/a2RL1Fya31e+Cyb6Du2EA0pt45a29GFWKq9wKW1Ag+LAywMqJYfLN8Xa\nlKQN3zbJo/hRFezlfufkZrjuyRiI3aUy0vt9gmGewubKT4DC7/HukysfhinHRPxANJMy5nH7+G7e\nDsvXuvZ/k9nofdU+FTvj3suKCVX9Dtxs3gO3+voa2RKmdjzeW84B6JmNE1bs3sSZSwpkGMgjqAjl\nL4CcGUedYIdh4INxVBHqHdV/Uq6sSVUWNg+YO/fDtQ/ENx5nRvCC8/m/98NNL8YjRG5RP4zjd9Yz\n+L6Bmy2IeRMMWu7YRvSh9vRVHJRIkkZ/azVGnav/Gw+Y53L0QTOs4y33u9V3xc8H3aGHSbK5CrOj\njH0S5u6DoSvM++rYUUvFSO7pUwcWNiikfU0LzOmEH1d6fzcyFXtVJgg/EzrKUOjMzfhkVoLgeG05\nB8C+QYyumQauNTuOB+RfQL4LTXvi5MixeN50xuHEMlND9WwqC9VvzyADlHR2RXDtROyH23FzTj4f\nttTcNYfgjr3JOe9PP2BTX9kligrxSkk2Txib+6o14M+nMlohUCVQm/67TOLGWUSvW0E/mPm2XcoY\n83gmzMSRwQW2vVofGH88CWtAg5mpqDe8w+9Mor+/x/fMial2CqxFrgEwb5DDC+BzzRzfrILSylvU\nocu8YlvwnSX3x0WgQS7u0lgJxpJLRrb7b/kbzHsjU4Sv4J+9JxvEgyoT2gpySjyYS1pMHK8zl59v\nh/JHIuwmltTcRU3hOnnbb5XdZqQ4pjMeNynp72s6g3NpU0+ZvKtiI73iKOkh3tqFzZX8M9y241iQ\nLECK4G8vwHwXI9YoUNoFI3YG1YbucZkDdu3MzDgJShwDd5jvXSxO2eQTV+0UWI9cA2DZJK5F8xtQ\njww1z8YWEffZ5OknbPfPfE2lMMgUXnk/bHwHyn6T6WYHqQBZHvw+M4kH5P+BTA2/p6CYYCbhA9Eq\nJds8llu4/Aox12O3caADGoJ2oVCpsBiG7YYb93lVYn4pumgZ3PhnqDsAhQ+Hq0eTBDDa5uOmV0C2\nw6ov96QEH0+V6nYCkH4gP0flMpsIHyiGkZ0q0K66yxfjcjja3BlXWDodG6G8VYJqKFsxKXO2iBO9\n5RwA8+ZyL05YUaOe43Zg0H2Zc+pWO8ZmhUj0QUiW4jgzbjnKSF20DKauVWVXs1LffRPkjvD3jH1C\nZeBdODBGf3Ug34m+L2h7CL43bkJBU7Egtz3CLVEsFhj3JlQaiVX4PEQRkYrmoC7drW6c0xaGuM19\n1nTaJG87Bz76APxXZdhcJt8ntvEWNphTmNyyWzEysgSkt/d5t0eT+5nqVi8hiMpqMLfD+/y4Q2bD\nd9keGHkoKvD0vdJyDoB5g7kXzOYTrVvP6FFh9ddhnkGdkKT+gV914TeG1uyG2YZ8TzbVzJjnoLzb\ntFl70v5hv9/OqYL8BaQoxlreC7I4xn0lIKvjvj/emuo+Jr5qO/TOPSMtEb0a8ejgrHhZYu0wmQiX\nPQI4DlMAV//cfE+9kWg4e8GEeHsWGQYJ0wJxSgrYkHrpr83Pu/NyBbM4qHFVNCvJ0J/LTcedTHoB\npnTAFVvSDEebsgf552GS69zGqxtyorecA2DeYIc37oGgO1vPB76AfApkJ9xWlCk3pTbq8DazUdTt\nCXTl78PeYUbq5s2ahPuzG/aSZS1VTed7GnRftHrpB6PgjjaoejzcS0w+CNIGclI2xvtM5lHdb1PN\nLHaNvSfKy5r6CEs1Ygumm7oJ5TL9OtQfMt+jnQoOG4NdDiOFDTBoVxQhyv5s+VVDbsIYnZHBO19a\nAjKpmWo6ORyw6lZTlQv8SsxxEvoMTBG4WZwYi3sERojykOr5OTleW84BMG+wW3fD9Y97DXqFDTDK\nl0XSnEAw2bvkfSCvgEzMrp+CfjCiM8jRiO9QRLmnRgVPJee21XN+I6xWsSRJNRJtnA2+N8n90gTy\niaRG8qTzmPB+l3G0+GfZItdwycLELduM+te+i0p3fqFdhaqZlCViDkKc3K3e6Y9dGvR8tlJdcLxa\nInCfBbu6yDxfzaKQv1USazJLS9da7vdHbruD/eoFSsQhGCdW6o6M1jLXAJg3mNwJ8u/e76LzDGX4\nrq+CNJBhRLcDW1iUqXtTFjWFZW21c6/VrweDvEy664Cx8O9VEKBNTZEkieHoriTIMjnCll+DVEe7\n35qCyfy5pTKpZRHmgTTmCbhpG8zssN8TNzuuSYc/aos5m/LQyJoX8fafDTHX+ZBroyhX5J5RTSnY\najc6qTGiUpj419af5mOFwBjDuoootZJpnLa040t8//uJxmJRUkcyVeOJ2nIOgHmDyUCQl7zfZc9t\nGt4zCGQbyBnZwRvmC+4WdyeJT29uyNpqS1o2ot38vTsoy48w5nVCUwcsetd8WMZ0RhtA3e+q2JkM\nASdF2FIP8jX7+z1Ed1m4uszWx2ceivbMMdVN189XNvtSgsSK/fESNVM+KKvzQ1McO4nTh60csA1h\njvIFD7orUIarK+Ofj8cWwYgOR3ryE6dg2vVwo/2Vj9vnyjROG6G8x/B/rWvMI13wvXdtFYfXMdcA\nWJDGKSB7QE53vovPbcZ8Rx9Uzd3R2cNrg+2GAzD+9fBUA34D/sDN5nTIFU+HIV47crzq52HeQObx\nFPTz+rYTc+VfAAAgAElEQVRrGHrOm8uyJiNA/qDev8DnCOBPGTJvi8ohZe7fjGwmtsLs2Dmx7PAv\n2gXynGqLIvX+cdRx9lQ2ZYYo4ijVX2EDjNnrJRqllojyoneU2+h4gVKBQQJzJUhsMlfDqHn69WRn\nHM2iYBvTac/aa5v7Qc3wh1ctQYXFwdTzzenxjD/ovd/k9abPY3t6Puamfxv6fK5x4rHQTuYYvETo\nSqUaX4Av/iaVOnAQtm2FvXugA+jturMD6JX+7t7zYOPSVKpvPVy0FM46Wz23rl6ktVk/kUr17ad+\nLyyBQ/vhf16G1iwh3rbVDNtZLfCtT4jQnUqNWQkX9Pc+1xvo9n0e+lF4YxMUPwD/eAa0nwVnvg2H\nPgXrgQt872jZqv4/62zv+3V/p50Bj90EMweqOeqdfm7mRlhfZx5P6z/Dhq1w7VNwxlnqHevq1W8z\nLw72o3/zX+vqze+13c9fgEuh9Vx4fROUPQunlcKAD8Nc4BzXuFu3Q8EZ5jGfebbImuZUqm8pbFwK\nZ56txnCoN6yscJ5x9g0wIQiObU63vQHMUp+3fRd6n2aCwfl80VJnDmzvbdoD3wa+iDNXdwE7d8DT\nNfDaN+GMImgH3l3rfpuzp886Gy7aCuv+Dc6+FDrOgTuBc4F7ToI7gK/4+j/zA3ATal/p79qALwGL\ngS8AX8XZZ/bLC8e29J75+kWw5QL42yR4cy0Ur4X+H9B7yn02vX2cORy+AUzGWffeQMk58MAeuG8k\nvDzTWVvVVyrVdzhMewR+VAC7UHP6FWDXSbAQ2AYcSo/1VuBfUHvrdOAWFD4ZB/wj8CFgEVD2D1Fj\nf09cuaZWdu5oxi4vJ2AqQOLnNqdtDpZS9OtAezZdiL3f+fug+F+iOSWTa7Di+g2wWosNRXHxyTyn\n5CGQmfaxxvcYc+4ft0F5i41eY3tO3Vu/FxbtgYnPRLkIJ3UGgCkvhUlnQXjiuK3GuSdO2V231OaO\nfRi4WSVKNFdYNM+P5q796hebiskU+Frv+t6srow+A+OblTSXRCoKy8XkHlOceCJ3apVmgRtc468Q\ns3qvKv3XPf6RL+QaJx4LLecAJDukurShzSf+unfDEWbyQLb4MOsNOv2vqjj8jMujD4If+bsPRlj0\nqKnehKn/aduSeUwVLYPxTyuEPfAT2c+F25A/eVO4GibKXdcUbFfQDya9YVZH+Pua2wGzYlWeiwNT\n+D1zDsIVv1PjL/4Z1GyIeq89+niFQHX686o0khsryivoguXmPa319mEBrWHfL3E1u7oy3pk1Rbzb\nUr+EMVT+85E0s8IC8ToQ2Gw4i9P3TReXvaYp6l3vhXZMqqEc8X8T8BOUqqYX8IEzRP4wSImqH3wM\nTj9P3d8B3NwNXe+3qSW8/dp+z/xSIjA/BH4JXCFCY/B3v1pk3b2w8f/BkP5wCo6qpQOlbtCwuufh\nfX8Pj93kF9+D/R/aD9/8DPxQomBX8zn6Ma+6qPl3qVTfUv97MutrRhUsOjVcDWNX1YismYBLTZRK\n9e2XSl25DMrOhjc3waIPwLaXHHWZqa+v/D2UPgQzPxlXLWZZM4/qJHjPW3vg49fAH4c777gTmN0O\n/7eP/72O2uV9F6rvf4JS/fQGVqNUMb8GlgM/AD6D2is3AF8eBgc2eM/KO8BaHBWtWz3q/4zrPvdn\nt2o0TF3pvj56jvls9TJ8d9WHYVENzBzo3WO287kBNQ/u86HUYibVl9OfWz28CaVa+0Z6fOsxz8Wf\n0jB/Cvg34EVAPpJKXdMJfTpgxypYX5f0XJwQV66plZ1LsYf1Oxzd5Y/C2G5HygivhXtkJQv5BCrd\n+dBkz9mMydorKty9MAKm21QitkH3ZZZ2PZMStHHUbbrZgq/M9zjzpaOPtapmhCflRnSdjOzTWCQf\n/xUP+N/rlUqa0xyt5nh1TIEOQhsvXuPw+PT9gw85Z8X2V8PTKIbcWt3BwNdpotJ2B9OFEEi3clEZ\nyN1Qvy++ZOH1aoueu1KjKiva3Xn0GvWsVi/552KS71zNFSVR6HmuFrhezC7N7z3vqJwDYD5wBf2C\nXg3GzeULWGo2LKzHZlEM1+0z6X6zg1f+EWQjyJQMnr0KXt8AV1oQSebF4OG0/sE8OCa3zp4rQRse\nCR26ljFtLiUt0YyE7isY5Jb9vgyPp4hHqPTzfjfpZlFqJo1Q9T51B+35xz36EJS2B20UeuxzBIra\nXK6paUQ6arU6YytEeUONE1VV7opdFiLRDy77E4xKw7jAhXB//Xu4e3AQcc/uirYzOvXEo5F/3Jxf\npV3BvfFpAzFrFCjqhJE71BwvcM3fAokIAHzPxV3kHAD7wRy9Jqoqnrm+QbNAyf54JUarW7EkgYsP\np5wKsgae+c+4gVm+538Dcov5t4J+9roIOm1F9hKD/b5pr5COQYmDKMP7MnOH3rGG2Sz0b+78QOZx\ncTiA084RqnvsVfLMaxEnniLM3uZ/vvZAsMRnsyiuvkKUz3+dwOj0b7Zxj0jHv0Snz0i6N5yxm4oG\nTdcIt8m5TxcfGtEJY9Y6iD4q95Z7rcsfgdtb7XEweg+WvxCfMRm01/vuVaKkjcouGHEwOH/XibMG\n/owM5jk90VvOAbAfTlvdW4c7DEoW+r7BB+If4myCjaQXyP3wygOZJekbt0aJ7yUXhM+D34PFlLoh\nc4nBjAgnb4K/3AfyDry4zGKgNkSgm/qavs3GHZrnJYyD1Bx3+LjsMSEqn1UUMQnCFpfwFvSDmbuC\nc2ULtvSraRoFqtu9z09Kf28jBtrrJzp9hmtvPJ49YdEeQxX7nWBDa/bc4uCe9Xs66T006vfKIy6K\n2ZvcHR27pNtiUaq7KwUGClwhzrPl4p2/ZoEJvr0xRWC+ZJI88kRpOQfAjiRth73QRSwKioOpCSaJ\nEq39h7jnVC1On/JVkFVJcgbF8/pxexGN2uJNcTJNoCQ0mjv6kMcp6HS4BO0ZSsKILy14+6r8A6x8\nS81RPKkrOA/uZHpalx8+Lvt639WtCPRcSRKpbO/v+j954a19Ro239NdetaLt+bHd3jksO2Qe21BR\nnK4pUaXO2RUviyzIp+wFjoKeT+EBsYvTcInYVTaXuuC7RxQiNnHrpjKmUW7S/j2o03P479OEQGdV\nGCtK9bZKVDBinTjzZxvHYSmoK1uNxPHYcg6AHWG4XQndqignJ466r/h5b/lJc+KvbCQLs8++TAd5\nDeT0JIQomZqiul0RB790NfztOO9TcIa7rCZbC38Lt0M4MMxtjwtDeNyAfs8qcdJc63smtqk5jKod\nMug++OyzCqmYuNykMRdz9wWjiScHJBS7HWWab38vNMyzCIw5FITXH29RtCytnmwK2iiqVqpo/ud+\nALID/vh5qDGoloL51rxjd8eAVAhc5TpzNsmnwkcArRKQRVOg4Tf1rcep1VyrxJxu3A2jJhoV4sRV\n6BiM+QKVlnEs8cCUaxx51HFyrgGwI6hoj6jwQ2xCWvP2JkWcZuQ19S3YuAPk/AgYmoIHz7bpxx8w\n91HnQyaNAoM644xZve/JL8Ds17Px/snUwynJ+oTfv0JUhTT3GlQ0Q8lyuHMfXP4QzDH87laJ6Bw/\no9cog6+J+zQnVnT2wS27g/tnyB/Cxucg8dFrlEToJ/7zxMth2xCpyasovGKbee/OboVpn1a/29PW\nexkknfHZdB5nuOC3we7PKWYy1Fe3KsbPdDb03g2b5z5jnT3i9hi7VRyJxr1nl4hiMGvTn90Bi1WW\ncdzjgSnXOPKo4+RcAxC+0eN4RIUbHp1NX70a6vbDpx9Igjjtm7TiUeeeT38c6ny5Z7ycX3R/pRZp\nQbtMuvu9cldwzLPeNdsB5Lcg12e/FibnABPCzU79p6rrue/TiMVfSrPPWKXiWvQu1rxbutxpmaEi\nm98rR0TlUwpDvn99Am54Ip56SXs/+efNVJPFjYRM9qiaziCswTmM9rbyrlFITrO/mKOxL30rHIna\nvBFNUl6jKNui2zPRvqfMLtOqpKpqE7rgWwJDxFwmYLF4c0BpyWKkOARmoet//ziC9pVc48ijjpNz\nDUA4krIVfgkckmIo3QnV+3GV2ozrwRIOg+1Aub2Rxq+C3z7N4ayXfp1yHOIW1wDaLioFhEYM81ph\nyHaY2Q7TXvYSJnkfSCvIP9jHF9fLyW2HKGxQ0cO1fp/9BN5Bfs67aiWU/AJu2RmtsjAhVLcB0hvl\nG08yapfwxIpFy2BxFwz9VVzJ1v5bpQ/Oxa7fJhxQhNBtPwpH+vZ9FU5k7PCNtki5FZYiS274p4tC\ntFUHVRyUzenBRhjsXnNmI/mEDQ4RGyJeJO+BXRxCoW0W1QKF+4MSyZhOuGR5WqJa7cRqZIZDTpSW\ncwBCgYuhwgg3GGfvAWXuo1Fgkk+SqOuCur0xiVvAmGwex/i95sM+arXTj9/zZsZOp7/KP5hcEMPn\nTtdHtpVT9QeS1QuM6YYr37b750/bZl4f0/tr93h16UlTTruluigOenEApnhzFC/fWHSmZA1nlfjS\njzcR6WEW8EazSFdG9VVIWvsJG1RtbBPcoy1G8SJLhUgntXdwz9veUdUGFV3pAkxNimEsbFB7q9zi\nfntNmoiNlWBaj3ZRqr6rRRGMIQJFAlNF26hszh1h5zXXuDEn+DjXAIQj6ji5ecI4u54og7n6q7DA\nx0GXWdRjV72ZDXFS4715HczaGE+NYBt71XOZxQSEBzWGv7NcbEGO8PS3YPra+EFVlyx3HU6D0TOq\nmI0fUWn7l9/2o/Ns6foSphoXdocE77olCRpzRzCXS5AhCBIxwzuKw5Pu6TY21E5nZlySOGGEEZfF\nAoWbFcIfuBmG7lBuvpcsh8s220sQawnLVFLZNM4R3Y5koSPeK8WxP7htFpmdzXyTY5tYOJt5cSfc\nuMpM9cN0xtlJFiB1IBtg7e9g4TYY87hjrDS9M1ntAfNYJz4L899S73FnG71VlLvn2MM1AOxjr411\nMILPRx+ocC79Hs/9DuJZuBOq/xR/7cZ0OlzzMIO9wWbLcquVRrkryRUb0lwcSOu7IySHUBhD19Xc\ntx/R+b2f/OMwzWeYJOF/dvB25TxR0mKS/OLDHUa0bF5M94hyT3Uj+UZxUor4v/fbBcrE8XBsT//f\nLN5xtotyfZ0ksCz9jJvoNPv6z+xs5pscL8TiznYVwGYiFvZ4jLTbZmS6C++79GGc9Cxs2AzydZBG\nkA8694VJM5mJrJYDGsJd2QyH7QKfbbURUO87/eOwuT56osVDEMOSw+/JTiqsFyhzZYgNVFOL4Kr9\nBM72nikvQsVLYfEW4TAakbhPMtHS4vVtZhWKX0dvkg4qd6u1jkqdIeKVSiZJEl27glVHtY/cqaQC\nvfZhKrpGMbsi+1N9u5G4//sqw1iWuMaxSrxGav1bnSgnkOtFqZmKBG4UL3HQ6tLP7lUSzijrmPIt\nBEflGoBQ4GIhHHukN8jn4G8vKt/6cORtfteMnbBxO0i/pHAlH2tcI6z7gA2wqAWiDaLOOKZtde41\nBSM1CtS6qtY1ClR3mxGDI1nEtzfVdAb7apboXFIaQUcbIO3SwaQ3YVKX+f3aCBwG4+wmeGiGiquw\nSSYF/WDWazClyQxnn7EcTsw3qDM8oCzKk6pdHNWaTfLwu8W67SL2qHbzM+41XiVwrXi9m9yIXcOw\nxPXX/b1pvd17vUK8hKZClKpplagYiWZR0netqFQdIwVK2/DGnGR8PvPtmE1Rrq84FcbO/QDMx0k9\n3Av1ectQuOs6SJWJrFqV2bv+7XQYv1zkwebg/a+thZvPgZ1tsPNJ2Jhl2mJbeuZuy+feqIpjD5b6\nU2ir3+NUtGvdBK/thGkbYP9BeGMPNF0KPzjHeW5+OzT0cWD7e4CUqiZ2CSpd9lTgv9J/9XvKfhyV\nDl6l9770UfhqhVq3XjhVy06JfJb0HlBpqqcutaURt1cyfO0ArDjZu+beynDhMB7ogMfvgu98JLhH\n2+5NpT67EEY/CF93rcO0Nnh7LbS/oVLUV/wE7u2vfl8PfOUQfO8kb3rzz6X7/SJqn9/teldX+v/1\nwLw2OKNFwV7wPnNlxj79VQr5O8+D+1EV8nqPgnefgovOgfF4z1L9OdD4TbjIv58Gwo7tzrgHpftK\npZ+93zVPOk25O216NxxGPx3AMx3Q0dvp/+708xruk1BV8/Q8fQuVkn05cCD9nv/jW9+ynSJrziV/\n9cyVa2oV1uJVGAvjyONz/NnlUeqJzLWZSBa6GJRN/VG0DGa8Cnfs0YFY3ndKOcjLIL1czxXjSUE9\n0pesza0LvkfgNheXV9rOYbflJMGSmcVwxJ9b25rZbE9ee0RmHk+3t8KSrrA5sHvaVYgT4a2L8Ojf\nl/j7ajLHkVjnsMmsv7++W7ke+79fKDDUFu/kU0maHCT8hmmTzaK6Ha7Zp8ZdIWZ13SjX/1e59uB4\nscPtzfaQb1ni41wDEH7I7RGm4Qc5XgBNPIOhKd+S0bPGKN7HH2tSm4WpzKzN/VO+APIiSF/Xdyl4\ndS3c+KQ3F1VYqo1mUQZLMTRvVTU1ntqN8eCL4+lTuzGZ/cekZonv9RMDxn7OfjATBOUQYZorreIK\nc1BoFkfXrjOfahuAdz7tMJhiFkavMTsyaNWOqZ/RB81wmnI5jU3v0yXpv8VtiuEYuBmGuLyhBlhi\nGMYJTBRvn5PEMXJPFuX2qonSrWnYzWcy1zjsRGo5ByD8wJvSIpty1xw+yLvjphOOh5yDKcyVd46J\nixn0fPYBgEZPE1cg3ICGJIFaTr+SAvm/II+DvF9998B0mL/fC+84QxoMd2TtdLEn8dMSz8gdznt/\newt8bmu8TLNVPiTsnosFW+C/fxiHECeR/Mz3TmoPizNJ8r4o6SrceD5dVHyAp98uFQyp8z/peubF\nzwdT+Ys4uno/gTS5HjcLVFqC7q52xVdoiXKxkA6Adb0jFsPlzJ2NGZwqyuBd0QWDuhSBqBWn5oTe\nizqXU75A0dFoOQfAfgjjc33Rz/i5/gENitMx3Xv1obDiSHZvIHu+pqQShx2Byt+BXAFSB5/bEca1\nBvuUXiA/B2kAOQVu3x2O9N3t2nehqM3h4EzEUh/0qztd77wfZFr4OOPEg9xWFEynMnkTfL8cpBTk\nelRix0XK8ygeEfXOdeVKuPxBVbAnmFIi3nrFqaESFdCn59KW+fQKQzr8mkPBWu5mzlq90+Z6XGg4\nE43p78d2OjUsbOOJl3HBgcPmOLDEAI9Wv7ldYfUaXSVQI0oVOkFUDq73XlbYI91yDoAVsFhpNkx6\neu3Kt0CUWD3qIFz8pCOlaL1qWMF292e/2st2IG7sMn9/w2swsSkKIQbH4L7/lt2w/hmQdpCXQL6r\nUozER4qq7wvPV5z+4i4Y3WWODjeN/9b09+4De5UolYHWL2vJb+AONYarfg71B+Ga++1jtRH3metB\n/gfkQZA/we3vmO9b9DbIH0F+DfIjkG+ogMZk+8YLj7sk6WGCcSBT5BPlSq1+L2kJSgU2N2Z3nQX3\nXLhTiGgVlE2aumB5MOeYjgh37z1TGVaTR5ZmiKJzuUWvfb2oeKLPtKvMAPo3t+rMLd0MkZ60b+Vb\nyF7ONQBWwKzGP7+rYyAitRjK27xiqZtL05suLGWE+Focg7pN4hgRq/ZEdP9jHsNjc/ATlUaBYe2O\naiIsTYfu03Tw3Womfc8C8Zb3lPR30yRYa+OS5fHVQDaGYOZrIJNBKkBKYMKz5vv8zgdyCtzyqnnf\nlLd5YVXqTK9Bf1CnUoFEZzs+MntdI8ElohgdExIssVROdKcQaRZ3UKL3bGhDuJZexhwO8nT2SVj0\nvOmMaEIYf968a+8e95XdMLIzWNK02dD3QlFqqOi9kW89sE9zDYAVMCNys6XZ8Adg+UV4v5+39ske\nL17OONoLJ0S1YDDKhnnc2NRFSWpj6INdthomRKR1COPk9P81ncqQ6Nd/6znTSeI0svETi1FbktlS\n4npM2e67eodCaMNWQ8n90Phn+OvKoCRX3Gb20hm8Fmr9zIfAp9N7Y4jATRLHYJqdqrGwAcq2GFKt\ndAXjMmzz6/aSC6ZaT8r5h+/FgEfWMnv9mSE77FKc3kduIlCXhn+x4bdGUbEcbonWxvTlJYuebjkH\nIBS4gAgfjXjVpvWL8O4NZUo0NllUrhobwo+XWCyZx421Wp2FmwtDVO53BAyQ/Zx5Mc3dmHejjeYa\nETWm56mkRRW5H9jheL7UC1y/DW5+Nz6x+8EolYAxznzbpCLNYTYKzHoHzjo36P57xS7zuK7pNn9f\n4fp/kqh6GtqJwWaMT2JUH9AQ1NcPP2hZ9ybvfoqTQiSYisRu2DavTXBfuWFK4pFVH7GmbsZulcAY\n8dZZdxMfbeB2ExGTu24+jccRwce5BiARsDEQr+LS/JKFe0PdKuY+3C6fRcvgjk647sFsN118I67b\n3pIsh42XqzM/a5+7xZ0gFXZY/SlGopLzDd0ZtUYO3PJbeOKuMJ2+d36KljkV0UyRzO1iiWoXs32m\nvDv4nYhTEEc/r5PR+Qsw+efWj9gGNPjGkFYDmdJoa0Tu58yDsQLRc2ErjZqMC1fvmfqWd8zjm71e\neXGM9WHMUXmLM+5yceIsjCotl6TlZoou26zO/Xs7K+yRbjkHIBGwng2pda5jfTrXAQ1KPeLnNkYL\nDO6AykjOV71n0S6ofa4nNp9zuOu7bAbfONKBvX/9rB0ZmA9zdStUvAz1e+G+asf4OagTKvZD4Vtp\n54AuKN3lTkRndyEeGsuFGOQzIFtA3pdsLqNUIyUt4dyw+7tCiz2pyvedjnMw3Vv3JtzeZibUNZ1e\nZKpjCsYb4L9HlARTLsGCQEmcIW7eHm289++BMEbkme+YMgbb4TEZ673ny7x3b02Pe7446k6Pk8FB\nlRrFnZ5Gz3G8BIn5ll3LOQCJAbaK8ZrLG71GbdIFojxEatMbcU4aYYSreZKoFJLDLs+DXGH+LXk6\ndYcIjV6jENEcw/NOH879pmCoaQeharuXyDaK0psbuWnbPDZFeQCl5+J3ILOSz2FUxH65xQA8Zq93\nXKXtMGItlPncTieJU69Zf1cldhXOTS9D+SN2V1d3TIUmAqZ7V4jSxbsRZHn6+zi2ksqVMK8ZHplr\nv2/GzrhuwU6/t7equijm/FDB50b9Prn0UtGsxq7nRnsz6vN7ONdbLTyxCwa1qJrkbntjXvV0pFvO\nAcgI6ADC0FLG0B1QZKnypUX78DTiSWwMyeGWX4CMjzem8PdaJIWuOG6E5nfVG5BYmKSi7Ud+tcnQ\n52PMQ2EmUoV93O4StmFZiLUzQCA1RpeKJRm4Fa71uYpOSiNsu3FYwTS2M5xQazWQNtz6s7TqeiB+\nzn+KxE1bAfIwSHnQZqNTsLzyMNSsySyppr+meRBBg3xIZWo2Frsqtru8a9WxDrbzawXG7YWqV2Bl\ni4qvCSfM+XZkWs4ByAjogNudO1/9HMNBdKdLdhueg4cmXj6qzNJ6gHwZ5C7zb8kkGjtxsZelDB+j\nPwuoGD47cxGl1jDNkfPdwl2qbkdmnKBXQtK5kQ6/o9ipARIMrIwiyg6irUgHImqj9sybgoGB7n7d\nRCqoRnTmS7sm6xKwmsgukhDi3BRn34GshDvmBWMjKg+oEqd37oNrH4iv1nTDESU5SQoV7/IfhvNl\ncBxx1EdqPO5zfDhGSmCGuFLctKvf7fsy17jpRG45ByAjoD2b2R83oXW/I8WLMMypQsL71q1n1FQg\nN4H8j/33gn7w+Xdh/NPR+mEbUSt/Ea5+C8YfdHOV0WNMKlmEuWJeZogyjuZMvfOQCTG22WWcOchM\n3ScFIK/DI3PsTEakg0IaYa4QxcyY5tqm6hq1Os6+A3larb1f6k7mLWRnJuzzBjILlX/sfcH1C6sv\n75YG/Q4Ccw3P3BO6L3ONm07klnMAMgL6sJ5TJ1kT12Z2cyi3ivKEGdINn3rLpp8N9j29xXa4slFT\ngVwNsirini0g/xzdlw2O8u4oxGD2cqloVnES8WwWqh+bK3PFoaScqRe2TIlxFKGXlCpqlWz9QH4C\n8l/x9o7dJuYg0bLVyoNnvMuOskJgcLe51GjRsniegPIKjGnz3pMcscaTLLTqt7wFRv4OnnhHeQ9q\n+5nHDnTI7I2mAwlNHmw1nfYMA3avv1zjphO55RyAjIBGJxlsFCVBuCULEa8aoESSGsHghR+rKmom\nDnLCM0k5U+dZ+QhIi31M2mOqxJoiw3t/5qm9VfDahKeCPvy6UtqNnXBzC3ykxM5N2xDY6J1JOdPw\nPnW97Kgkgqao4PmS9u56Cma/Dis2BIsVVe+w1+CW8SCvgvSOty/jewN5iYffjjJFFGetI81tEc8l\nLQ7xfn0TDPalRU+usom2WZikldqDwfxUboJn8ka75zAsQdXV0CfMe6vskANDvcDYbqViyxOKI91y\nDkBGQHv05XMFbhF7grtRonSgZt93b796w85rg5Ktyj20aBmc1h9kOMhjsLjDvImv/n20p8hp/VWN\ng7FPRvuoRxM29VzlH+C2d1R/w1bHQ8jycZDtpDPQmvuWk1G5mX6Gq95F8P0muE1G5riShV8FEp+L\n9MY7LBRH5eN+dqIvU2rJSph7yNQ/yLkgO0Eujd6TyeMMgnD756ZenEp1tojndoGbtsDKxY4KdpLr\n9yQSnWf/FvuZBOcem3vyPSGfx1iSBrYLDH/Yt/fOURUqp/rcZKtb1fj8sT159dPRaDkHICOgPQFG\n80SVUawQZdyuElWQR28krYsXccTbuOmqDxvcDsCr60BqVTI+/33T31Gup2H6ZDtByFS1lXYVXg6L\n3g3XDfsRg3wHZGn0PMupIE/CCz+xe7KYotYz86ZR/fnnIr4axXmv9qyxpVOPU5970H0gT4PUxduT\nySKYg/tZJNiWHIYXvjNcGdhtyH/2644UsSp9DnSJ0ep9yfemDr4zrbkNXn3uNCKf7+qvsEG1MZ1e\nl9ebt8PGt1V52qJlipG6fTf8eamCq7BBBR+WtEDZrqRSUr71XMs5ABkBfdhnXUTl79ERuiYvqGZx\nchLGVSwAACAASURBVBtpL4sRe92BfE6fNm7Jj2D8CDIaSYcRhMxjLEwH3FwQyYH5+j/BXfthXmG8\nuR59cbDuRVypx8aZRtW3mOJKTW0z+k58wfseN0dc3hJuMPanhzHdM6dZqequjGVot/czsiV6rsL2\nnghUrwZ5E347yx5HUrkS7rakLxnQEDbv4YQuuOb2OhTa/VfP/bUCy0TZMA4nuDRILN8vt6R98XlR\n5V1mc9lyDkBGQHs8capE2SXa08TAtIlni9l/2ymQEh0ZHIa447jb2u/JRLKwP1MYQAwhUo3V9z36\nPSbimbxCoHlsjy2CuTonksVgfEcbrH8qaKjXyfa0oThTIj5pryoGFT1njmHbbJyO3suFDXD9Pi/H\n7VbTfP5d0hKOHd7in8EbXZmpM+MmDFRut1CzyfuOOoFRh5wcWvq3RvGmVI8rTep7B/oi7PN5oHLZ\ncg5AxoAfzrNTIYp7qRWL26IoUTxOhG08ySIISxyEakXuDyvkNjEyoZ73nUmy0/Z0TIYILD4A8ig8\n+70w77GINbToyee9CZOfDyd055wHNavtBFN75ISntzD3P11ghIFLb5QgATGp19xBglHpMQLpa0RJ\ny7NFEZ8RXfCzn4fDO2EDVF0MsieO9Bac+9JdZseIe3zf3blXSaVGYvV2kDjHUyHa99gEw3fNolRS\n+TxQR7vlHICsgEfnMpogiqupEpUi4EpRKqkKUYRigkT7iUdFBsc99PrZOHrh2j0w+4AXWXjrCwTf\now/4VW/G93yyIvwYB9lKaH4NMgKmvpSJaiA4H6ZCO34Vmj95XZi0ppmJ6PQW3v4XbIFJG80qLBPy\ns7mUBlWdwfeajNbR3LNhPorVety5Pw4CtexFXzp0W5GjGa+a53xkS3DO3O7s9uSI9j1WZZjvvNop\nVy3nAPTIIOgzFooPKaJQJYpw1IlKKDhXOFwS1MQpelwy05xtMDI4GgZ9gO/Ya4uSDR5yW2qKMOOt\n54D73BWjvIT873FXV9Pf+z2nwgmhE33rRgbNgX6iYeqpeAC3tBgWqW+KMJc5IM/BmCfM8JgIiJsJ\nifbc8r5X2x/c70o2D5l40oXMW5NT791k+7p7sEo6GSbN+dc0U+luoShDvf/Z8QJ9bsk1znkvtpwD\n0GMDoaAYSjoUwagURSSmCZR3KGJS0RwMOJsYGcCWEIZ+qgTohGficXg9oUry1juwwxVVD8Lu4hmO\ndAc0mAsL2V2U1XNjnrAj3fC5cPp4bJHyVIuLnMNsOFM2K68cOV/dZ0JypYa8Y6YqjIE1skT/62f9\nxbns80Ag79PljyYnsklS2ug1v/B8kGfhT1+0e/W5K/HpM1ZmCNA0SbCe9zWZU5FXiDKaDz6QVz8d\n/ZZzAHp0MBQUw+BOtakqRBm8GyVtyC52As5GtsBAQ3H6zEVci3fSIV1UyfxMfMN2Jh5TQfiKltlr\nIES7eJr7tSfusz8j18Dn92QjWYAMBtkBXxsaLj0EpLGNUPhb87tqVnuf86uw+owNdwm2Ifrb3gFZ\nBjevC6qsdGW4aIKT9g7yEcexlneGEdl4+85LaGc0wl8fA0nFk9gqV6rzdvXbSVKWO31Ut3vHqTUF\nC0QxhHlV1NFuOQegRwdjLHwkloOQHfINvjvUz/6AXVceT4WQiceUGU7buGsOwrIbw581cekTX4jg\nhF3PXPNLePlXIJvhgelxbRZBOKQfyDaQayNgbDLbdSoOJees/dUQb29VMS5xgtWqVoBMhFkbg+9s\nFhi4w0m5b7dZmD3DkruTZm5jm9gUl5mwq5aigxTTzxdDySGvpmB6ep9UZXxO8y3zlnMAenQwlLfE\nTyvh9hVfIE7xlehiQ+Z3RwVWDeo0qYqSea/csjtbtZmd6NSsAXnM/pzp8M/fB7MiUnf7n5n1Dlz3\nScvYAz74wXka+6RS9T35BTOMOmeYjtifLsEcQyMtSD0e4VXvmbMRbv5bkJBklv4+yJEHK78p1ZN/\nfzWLkmCT7Qv1vprVULfNvC+zY04imKeY3nJ9xkJZtzch6CSJqvGRb0em5RyAHh0MJS12TstRi6iD\nEpbnpieRsHY/rM24b9W/nA4b34Gy32TjNmhHaOd/DOQNkEHJxneFqYxpVpHp8WH2Izib/eQ68aaH\nKDTAXB3hKeV2gggjCGHBiFXPqkSP0U4JljWwxJxc1u6oV8M9sHx7qgrEqC7MrhhX1UoFjykRYHSQ\noqu/YvhUB1wlXucVJz4q345eyzkAPToYa0nViaIyqpo4vJ5Jdxwtdldl3LfqX74M8v2emSebiuWP\nn4fPvZUsxYMpCVyka+vuJMQuvo7dpgaqcCPnAwoJ/eNVMPKQre6FM09+SWVUe1yXZfu+qG5N18lo\nUpHNWpKISpRosllot3F339HZldN7qswmTSYl9OZxTpZg1cEk0ps2lmt35PESx3ki345MyzkAPTqY\nw4d7rig9pw7IWyVu6cKLxHqukIp6/+WPqkyY7mjcSb5DE79v1ec198PiLhh2xGoNq/fUhuUHsnC1\nmbi2agIdVx0Rj8u1p8KoDcAM016OGo9dUlkQe79450B79swRVZ0vuWTr84ZqcwiFewylBtfUYIQ9\nyECQZ8x7YUADTArNdxZvrcvTY2wUX9qPfja4ovdOMmYj33oIR+QagB4fEAX9oKTT7IExskXd0/OS\nhQ+GYnWQx4riarPhrjKr7ZAc5jAds0gSA3Q4/P7U1XHqgMSVLGyeWbf6vpv4AizeH0WAoiWV6DV1\nCJ07BiPzuApz3/62+PDzIXuoGIY/DJ9vt9tdgoGiZicHKYBbXrfDMnBHMAV7eGLJ8LElYzbyrYdw\nRK4BOCKDsh7yq/eqTegOOorH2YVxQWYY3KUi3X2bs96a+7BGtq4A+YeenbM4+YEaRbkcV78OI9rd\nXKK938Mqqt1B4i0SR8qKb7Nw26L0fXMl6CZ8Zztcv9KCpJschGWTVEZlwHG7iUJYXIWWPqK55wju\ne2X4Pdd2msYQbYT3r8PMt1V8yrxmOyym85hp+h0tqXjvz7cj33IOwBEZlFV9UCquer5pFYvb+2TR\nHoWITUgo0yhZd3RzvcCQx+OPw4bAF70L0oqqqvdbkC+B3ADyCZCTzH2FE7toA71un90LEzYnmYvw\n/pNIWUXLoOZpWNwJF55vv29AA4zugtHvQEm716A8p10Vt4pO72KXVC5/NI4Hm3fvuKO/bZJF/Nod\nTt9+jl2PQSPdZKleMkt4ed2D4bCYiG4m6XemiFdKd+7PtyPfcg7AERkUBf2gvC3oQqmDrMSIqODp\nb6nAKb9u13ZISlpsyMK82adthY27QK6ON44wLk96oYrzVILcA9IA0gTSDvIMyA9AZoMUw8iLMvOr\nN+UHqpBMkL6FK92VmUfX+jVQ/Wd7fQ1tlJ6fhrfiIAzeAaNfhNf+SrroU5oAWbPFKlVNWYfXCJ7c\nE8d5j58o6NK/49J7dEHiuVUwlrbaDPXxmQCJIAjaAO9/RtwI3gKLrRhWY3rMlaLsSl7jtc9xwhIz\nk5csjlbLOQBHbGAMWx3MVyTi5Wj8QVg3vWkWzaNiKKpbnap6UYWBZAjIDvjlpCi1VmYSjfRVBEJm\ngXwf5GlVnS+Ozt8Nb2EDVOz1vnuhwCLDPIjAhGeD/fiJrrv/st/Axp3w31XJ1HsF/WDaNruuW0uV\nK0SpLNyIq+4gfG2otz/b2o5anYV7bYy1XCEwzhcfUdNtdjeNyrNVcgEsOWgmnrcVwecOBcdhRrxm\nVV6dKALsr9uibRrlLc6zpniRYYaysWVboLIrqAEY92b8s1DdBX3G5hrXvFdazgE4YgOL5KgUt6Tu\nlffDDU9YOKrNymA+QRQX2GzpK77RTSHIulh6b+fw6eSGQaIUPRdVjwcRkE71HFb9buCOYH0Qm675\nznaQP8PDM4NeVbaxNUy1FL2xji1KnaXG1CjmQljBEpwh/cXy/kpC0L2I9LLN5torplrVUVKbXAzS\naH7XrI0wuclRucaJFbEVN3LHp4Tb+rzzskpUTqch3crec/mj9mwL9nrr6SA9v7uzMTtCvvV8yzkA\nR2xg2PLLNLv+/+xTID8FeSedv0eCbZzvQMwTJ8mcmwtcIvEPd0/4sGuPlmiuPPi+sJQSfm+Yub77\nRm0xe7Gc/zGQG+C2HXHHlokdw+tdFEx77VTJszEKpqy6k94IjiduPfMwYhNma6ix1KT216qOw3xI\nJchD5v1yuE6GJ/W9SeoNznFg7LtVHzrHWhjR1qqnVaJcx915tsoOwYi1ZuO+3WYTQsCbco1v3gvt\nZE7oq/Uk+AawEfgw0AHcBbQD5wAfvRBYBiyCVf8HOmqgt+v5DuA8YBeqn26gL1AHfD/dh76vV/r/\n3sCZZ4fDddbZ3vdEPXfRUrj3POeZ3qjP238PDX3U5w5g5sBUqm+pSGuz9/l19TBzoNPHj4AvEuyv\n9+9gbzt8N33fLmAf8NX0+LqBXofg4QlQNlPB27IV1tWn37khldo4E3pfE29sSecBYNtWWA/8F/AF\nnLH/7eJUqm8/uOAp6Kow99uFgldd6v6LlsLBFFzfBqeshZ1vqPm6aCl0XBncD87z4WMY0h8+sz6V\neuX3cMnLwOvABtUuWgrfP9U7/19AzfOWR5WdJDC3Ydd56b7Tl94vu4D/1PN0KnRUwMyLXXtkgrm7\nbVvVWP1j/9SH4KcVMHMj7NgIvT8cHPfA0lRq9ZfhnOHq878DS/GtVy8YfaHaTx0oOH+COqenA/Wo\nc9YLuPM82LhUwXrWP1j2ywcj5id/9cSVa2p1pJrilrSYG51X38y9jxMVNTpevEF2Nb6UDdGxA169\ndunOZJJF5sWLgu+vXGl3Cb1lA8x/y/nc8zUmMr3XO47iNrOaROvNS9vN/ZZGrLdbuipsgBv2e9fd\n5K4bFXhYswZkKcjPQV4AaVUBlqb5H7s3nhtyILjuXpDZwf2SWQyH2W4R2OMWLr9mDcxc75y9Wgsc\njaKcUEwZF3Tkt35v2WqQIuXhlpcsctVyDsARG5gnzqFRlLEz/OCYvTlsdR+u7FKfdZF63Z+3sEu6\nXx9iahRVmcyubvAihmG745W9FIkXtxDmZeX+LZMaE0l1+AEPrIPwyJzw/sf7DO/jBEaJMpgWNUGf\nW2Ccz6DqNU7b58CU66qmU6lebGMwuYxqxOpXW0kKhvzS/O66AyDvgDwH8jOQfwWZqBDllMvM6dEL\nG+DW3TD2j0EPKH9hJq22K4nMz6TGWyHKVmeKjzE5ALgdQvTZqxBz0SgRRQQKLaUCdDxFu0DZ2yDb\n4YufNwSG5m0WR6nlHIAjNrBAnMM4G+Lb7XCkcYzi7sSAIjbduRkWd7/akBe3DsOEriBRysyVMJqr\n1r9lw5kWLYOZr8Gs1+Jxy3oe/uOzqISGX4GzzvVz0sG51DpxPwK5+6dw63aofQ7u2BMk4Na6z91x\nxuwl5kN3qNxfZhfcZPMvp6PScNSCfAHkPpBng7Wv49idNHefSfyGzuBs3wM2u4f37E0VKAvpIypS\nWwTmtYKck4bNne6kKU8ojiJOzTUAR2xggQNp8+JxezHZjJr+iNt2sdcHDsZeKIRl6jdOPiF33x7i\nYvBomdnuyuUUN7I6xBuqzODymCRL6ndHwOffjesW6zwnp8P61TC3I/ju0Wu882Jbh4qDIB9VnPyG\nzTDyd+FERz83ZEfUWpn3VnT5UPP8Vz0OszvguieD5X3d8PqRajghV88MSLs/a+4+CSGrz2hc5vlZ\nJlAthn1UbI9z0QxYu8Cg+3KNT/LtBCYWIn6EOKAhhh62zb5x9f/1Yq8PPEkcXeuEDXDdJ0G+pSKO\n43Podm5r/FNejlZ7plSuhKKHYGqi3E3J5zAJwo9WR4XFJ8Cg++wE0/19rWGeROD6ducdxjogFvdR\nfyxBcK3s3mWeynpdcMHyaHVPQT+42eVBZsvB5Q9si1YRRtsewsr3NosKZA2Mqz2Km3dsPuUtinka\n0ECwVolh/rXKWP/NrHpjvh2ZlnMAjupgHRG2S3Gk/tQBi10bV7vIum0W48Sba0i7JWojnj9C/M52\nkP+GCQOSBNfZud65+2DWu2bVQ3bpNFxzZDGiJs2NFRUPYSMmUy4DudFraHe3Mp+u3BpR3hQFh4kQ\nxiNyJmLeLDBkt3J9DTeKh8+TTWIY0BBPUg4javqeewL3msfWLE6Edfn+OLUy4tqs7LBVpc/RhL02\nO1G+5aad4K6zzqXcJEf/BO7t77hb3g38E8oFtgM4JX13b+DLwLXp7xYBrcBJKHe+09P3nQ7sRbmh\nnpP+rtvVx1uviTAFfkoq1bdUuQDGcYn0u7p2oNwVm1+F5cODLq8bl2bmhmqco8d87x2YSvWdnJ47\n//cGN119RcFjcwf+2lPAo/DuVug4O+i+2f4GPF3jzOWrB6B2KHzyZMe9968HYd3EKDhE1jRjcB+N\nXiuTa+npQEEB/M/J3u/vdbl+xpmnbszw9v8APOiC64090HQp/OAcZ00mbIJDvVOpMSsVjAX97S7E\n0w7B3w9Lpa5ogPV16reLlsL7L3TGdg7wzXTfZb8UeebwGNJuyt+EDxdBay9o2wenb4GLzoI7+5v3\nqHsObOtyyj6Y/ht4ZXEMl+H8dTSvXFOro9WiuSx/kJ2I8sioFyVNTBNVG0Pn86kQh4P096f/zyrN\neb8g15tJkrf4MNj7GN6WtG97X1f9r/rdNpaqx53xx800O+5N731OyoiekriC7zTBNmyNbX3iz1N8\np4JoNavNCaJEvM4S7kDL8Mhs572mlCA6/5rpLLmLZFWthJKt+VxPx1fLOQBHbaChUamDOs0bd4go\n3XBlmjBMcB3oRlGqKv+BcWe1jaefD4fbo//tNKfc1sQku9oX9jm6oSM5EjTBM6cV/vYCyOlxkHgc\ne0l8dZdH7+5zo02+NmZinmnciN+tesKBMHjN/djeXd7tXYPJEtzrfpWWVq+ONCbKtL+rXhxid4/v\nt4GbVRS5W0VXezDTErP5dvTbe0YNZY9KbXkE9vaGH1Y4Uc060lurNXqn/+9It27ggvR3XwX2A2uB\n84Efp3/vPPyWEPXOYTWOE0181tkK1nX3wgULYdh1cMH7YRpK1XEXKiK2Pv155katJlHqkze+BEOq\n4Yn74aU7konytjnash06+ge/3+6LZnYuBx6vOgf+82ZgDZz8bZgxDr7fyzUnXWrcTh9Y1Tf6Cld3\npeGYDAcfgR8VpN9VADN/ouCDqLWxjU/D5qxdwbkwpxu+4x7TRjVu7+U8U3Y2vLYWitcqVVPLVlj7\nABz8sQleP0xOP2cOV1kGJuOoRHsDH9gCZX9W87H7ShjwPrV33VcvvHN4DuosVDWKrDHMv23O3eel\nK/19BzBL4McfVe/V6t+5wPdOgjHvQu+XYNtbMaPV81eurlxTq6PVzJzu/H1QeqH6zV9ruULgaoHR\notRPWh1V5+LEtEdKlBtjRsZeX1zFRFHGRu0lMniHnduW9SAXZzZHs02usgbPlXmd8NIvQHolf8/j\n9ar+teaetT9/MNFfdF9xJBTbPVNfUhHHcSUcW9JFv2RQ2ppO/Ogymnuej0jkV7QsztyY943fw88d\ntV7SaTaMRxUi8sM//vVoyeKwm7cltbiWPPL1KI6XlnMAjupgA6qDl34B6x5Vbpqj16iNXbYaLn8L\nhotTE+FqUfaLaek2V1RWUz/R8Ded599axGgPyB/Cq4y5P9elkcF8gTHW1BCo2hbXJ5+bQffBnANQ\nvNmN7MxzV3IByJNqDq9MqMIpWmaP6k2GPDL3XhKBOc1Qty187cL7z4wRGNcWpq9X8T5+t+yFAoOe\n9yJtm5uv2w7nLoQ0cIc5vUb5QVuJUzP8s/ZDxVt2m4V7fqLS++dtFMdLew+poYJqjVTqk+dD6cvw\n6KkutUE3PH0jfPB+WHcWFAAfQonXG4ADwKnpHl4GmgTOTVlUXFvTaoJ+Sm10Co6aoAP42xrg29D5\nDbNY3+37vAv4XnoIF70ftnwTqDQM9VXgE3HnxaAm+yjMPACP12i1gEkllEpdMxMueQH+cGoSFY5S\nY5yCbc7iwq3hysx7qQN4YVX6f0MCSQ2HzWtr49JUqm89lJQm9/r6YR+lMrrb8kzbWU7SPf3bVOCt\nT8GPPu3M9ayDak/09vWzEdX/XNRe0/3uWw1UwEGgFmdPbXoM3pwJZYE5TKWuXBaE/+t/B0OehSHA\nGUXQlvaGOm0LTH3DO/+2ue/GpqLLX8folWtqlctm5wp10ZaRO+HqAzBQYLAoddQKUcF348TxCb/0\nrWDKaZv6xlu6MxwOv2RRmf7/BlGqhpEt5nHJFJCfZj8PPZtq3ftc8sjgzNfZpGYs26LWuKbRUYl5\n1i69NjbOeNpumLEzWoWTPAlkMEpdxK7qNNW/8O+bwgY156P+Atd3+9StzeFxIOHV8aLn/pzzgkGR\n9lxb+XbstveUZBG8TIa6XcAnr3VSSHegjMu7gD6o+ItzgdtR0sIFwEdOgYcuhCafMdfEVX4BGLkX\nOtc67zTFVcxOvwMcg7uWSP4ZZdxutw3sVWBWdvPQGzitNJWqWAM7zoSCbdDm4xr7fyyz2I519fDl\ngSr99DdQxtBn2uCZ4UfGwCmXw66PQDPK8eAWoPlM+HaFY3Sd1gZvr4X2mJxxUxc8dIbaF3fjTZfu\n5pgPHTA//0ybMlybntnRBB1F3me6XH1sQqX07gbWHIT1JzvjmNkFd57ivOfmTXD2pbDsHPX8emBe\nG/z94XTstjlPpfgIfKRfEgnQ66jR+g4s/yjIWhi1Az5wWoK06/nrWLtyTa1y2cycsY1TLPOVppwk\nTmqPkm6fK2ZEpLjW1/ori2mbQGGD4nxNNcS1ZOKtV+wd14QBcNeB+NHW5Y+Ec61+iej2K0F+BPX7\nMpEsguON70ocr0+dCuWS5TDibbhGVKW2+ekxjRUlIfo58CRJ/9zcvzmjK8iHYcM2mLrVLHUubIFJ\nL0YbzbWhul3MSQGrW5WtzZ1XqjLCrhHmziungtwF8jY88x2Y2GSAP7BeZrhn7oLT+uf6rOdb9i3n\nAOR08MbNPbbTLHaPfAEGtsMYUZ5SmlDUiTJ4Vx9SB7PP2GBun0kuguFWE9gPrYP4Rq1WPurD9qn3\naoRnVh8kz8k0ejk8sTtY13quKO8rtzeOVoXU7wP5EtxwSbjxN7PYkp5bS39lxBvEG2Dpd0ywJXbU\n47ijE4Y/HCemAuRkkMdB/tVGGEFWggyxv3P+ZrjpFa8HVXSaD28fttolhw34mrFJZ3H9+hKQTSC/\nAunvHX84YT8SAZD5duy0nAOQ6xY8CP6EbXJ4w6uDNVqCHL+7fnJ1l9nTRWdH9Ue3xtX99syBNSPV\nqW95OdLBO9S4/LaW+enPN/w5Cq6eCBJMto5Rdh+9PvVpwjFY4kgWrnEWQ0kbDO2CEXvh4ieDHkTj\nm52svzP+Co1Pgpxk7zOSWGyCqWu9LrjhyN/7fDhxSRMgH2MzsRsWWeuJ2Pdl1UoYtT0b+0a+Hdst\n5wAcay0MyalDMVgUh++u0ibpdpsPQblblZjTg/Qs1wWT/xLOScaKS7BUQauywhyUIuKrP6IkEF8U\ne4vJOBruoun+X6sArxaHqOvYiNFrvKocDU+fsVB5wOByuk3BpVWHFT7iMbHJTtQL+ik11OS/GNRQ\nxcEiXP6EkW7VV72oDLem+TfWsuhyJArjGsWqPBc8K/Glnnw7/lrOATgWm51brlqp1Be2qntV6f9N\nni6jDIe2prOnOG2QFMiiqHTodqQ6ssXhXkt2monhQlE66KhKgO0CtQeC+YFEzBxwICCyGY+EYspD\n5FXDKeRoKrXqlyz05+F71Nr6a3aYUoQPPhDt9RRfBRPOkBT0M1feU/ESzny5CdcKgXHdwb3lzo6s\nCUtluq/CBqV6Mu2Fyt3x9pwtVfvRkSbz7ei2nANwPDV1OFaICtib7DsUtaLUNO0SNIbXHFLP+blB\ns4E6HixuXfOgZnjwcZBn4LaizILI6gVqmqF6RxBRacRbvAk2bAGpDc6LrU//d/4o5AENQQRTJzBl\nK8gKuHWHvW+3as1EUKaJ12bhVhkWNphhN7moTpDowMsxj4f9Hm++ipaFq9P0u9yq0maxMy9hbrUj\nWzKVLFzMlIHYNIuS/nrOcSHfjo2WcwCOp+ZwfStESRhlAiNFGbDnilOspc9Yr9Gwz9ie1N9bdM2H\n4KPXOHCa7RvhKSJsCMYpQgNyIch2+P/tnX10FeWZwH9v+LAQEkCBIEhJAFtgEcEqEKRrpMG1VSSA\nrYqoKIpYP9HWrvJhPdIWW7vUut1aa11P/dq6VaDbtVhcUIu1nuopUgR7BBI+AhFQNMkVgZBn/3jv\nODN3ZjI3IeTmXp7fOc+53GTuO+/MDe8z7/Mpk9wxo3Yr08NyT4r9ZqeoIo7n7Qc5D656K3zsRRJv\nWhtTDRfugYkNbgFGx7cQlUcRphQcE2LUAi/D4M596e8smqoe3FReRtju0Ck2mM79937PZTXRPovo\nooX+v5+Wtd1VyU7J+ASyTZL25Hq/PXme2PaV0YlGrRkq2jq25rKacFOTs1h6d0HnfOIPDZYvg+yB\nf/+avZbJNeH+mDHLYMLTsLDR76Rtqp6RIzbhsOldS5xpzVuyI0p5prOzWCVQcSS4A7psJ7xyL8g+\nWD0/3QeClu0svDWevMek9sl2vrf5YqPoTq+2CaTeaq9u2HVKNFQlvLgJZE4Tf8Nb/edKv7e3SnZL\nxieQjeI6XC+MdLge2/Mfna3ZjjFlZfQiHL8IwO9vgHmHg6YfX4e4CUFlkW62umMmijIxzWqAiWus\novjyjpb2Rggqr6i2pt0uhjO2w7kHbTTUhFdtn3B5DWSIO1Y6EWuRPosJ9u/qkgb/4n5pSEl179O9\nN/8m9XubURXM2Zm+I3puMhxkL8ig8Dmn7mIc5TRTrCJRRZGrkvEJqLTgS4vcWZz9SdyuBWQkyO9g\nczXMeT+4sEzfeXQtO8ucHgghpU6uq4GrI0I/56fMI9V05lXOI1fCJSm+lfDeCOnkerjHTF9jy54N\nYAAAFwBJREFUAwRmXBa9ExEDMiu5oH6HJkNj46rVlj4JX3/FnvPGa4P3K7oshvt5x0G/UdxotdTv\nxCn3MXU1zHoz2VOkUxN/I7eDvOq9Nvf7jjI9uT4VldyUjE9ApQVfWqit+SpxEwW98f7OE70MAXkK\npAbkNpDPhT0JpxvLH2/6iVImk6Js+1vTNdE1YcbZGryW5vmKQO4H+VHE7/qALAd5G+T0mO8o7XOD\nXAHX7w+P5mpWNnzUjtPzvUkevPMyXLs+OlRZOsCmN+Dqt9xjznvN3UlcLf7r8le3VclNyfgEVFr4\nxX1ma6446GaUi+c/sLdUx40fw5YPsSUcCuLHTisXIyb5L0qZXPRa+u1So57K0ytu15xwVvczcirI\nHpATUn4+FWQ3yA+CvwvLA2lunslVR4ILcFWzntaDORi3iv3buGCvX4FeVdm0ibGgGGalmP68LVrX\nio3ACuaBZPr/hcqxk4xPQOUov8C0ktHqBc59Nv0x0y0Z0rI+D3G2/aMZ2/38mGUw+aDNK7hNmpM1\nb30Rl/7J3ttzfgNv/xZkM8jZ/jmWPmkT+crr/SaweQIXN4TnmTh9Qry7vngnfvrfm5ODEea/mLk5\nHSUWnfg3wdOLfaNA+SFbBkdDZI8HyfgEVI7yC0zLYSzNekK148Y7a5sfopve02d6yiAyqW0ClCWs\nw3WquLWgvDkWcT2xr6vxj/3Nj6F8uOeYkAzr1A51TmmR1Gv4l5BwYsfEkyrTm5206eZgRPkWytI0\nMYYFOcz41CoM3VEcj5LxCagc5RcYunA6UUkS+uTYtnNLP1wYpDPIJfDt/fELWpS/5dL64L1wuhsu\niF3c0lNUURnWXgW9SIJ5DjMSEVFbEQELY5qdtOnuNKOSCC+sibo+955OrrHmq7C5xidaquSmdETJ\naoKd4qo/tv0Leg20R6T2SmjbuZHSXS8MYygG5gDXABthxwZITGiqh0J4577xT8Kj+f7+IfcBS4B3\ngP2NMPoGkSeqomcT1dvD2/nu0YJgj5IHcDsbOp3gdrwIkxJuj5OCEhg2Pjh27922Q6O3n8ncLbBp\nXvQ8vdft7SGxu9j2rMhLjrMPt/dFI7B9Hcwd4j/X/INwXiPkr4exBbaL4TeAX+F223PmmtfEvVFy\nGVUWOUCwXWxhcViLzEzNLwxj6AB8FduJaCzwBFAmwrvG/G8xzH3Jv6DdtC1e4UUt9HnJ145/g9vv\nAFZFjxHV7MhRVFHnOIzbKnYhULkNNs3z3ndj/vkZSIwPjr23EtZcHtYa1n6Xw5ZCUSnUAR+9DluS\nSmTEYugzCMaOhJ/muw2Q5jTA1R1hHrZh132493HrUFgxE7bMdc/V4zkoeg6WG/e4e7CtXB/Hbf/q\nKEEvzW+Fq2Qnxm5dFaVtMIa+2FVoDlADPAz8RoRP/Mc5T8t9+8GJPeGij2BJdfLpOVQB2p3FqpB+\n2kuAtQnYMxpWrIS7qqDRhI0T0o8cmLkNdv0NTukO+4fDz4rswuw9x5QGkP3Q2Ogs6O5i7zz1dxkI\nBX3hga7+HcSK0J7l9rOTX4ZHBrrHLwS27IS8I273O2dxd3YBCWDiDjjhc/CH3sH7MekpkT97Hi6i\n7pvTxXBx8v111VDfHZ7pls78lRwj03YwldyRqHBXbCLbRJBn7YIqj4Cckf64X/oC3HY46BgOi6IK\ny/aenLBO6YJiuDasa13IOI4/ZNSy4JhXHPZHP/kzrP3jpPqTpm53y5qHBQV4Q3DP2B7tN0gtk58a\n1HBhTXiknFPozxuN1WQ9qq3+EuyOb2a+2Giobhdn+u9OpW0k4xNQyQ0JXxiv3Aqv3gfyD5ANIDeC\ndG/+2M0t/z1yJUxqhIsOwZjtzkLesryL9BIAWzJvv3Idswwu2hFUdE4Ul3eMReJWwvU24Frk+ew5\ne4LnjyohHhVOG1WPyndMvUZDHR+S6q1SlBYyYrFrugH7+h8l8N8zsWan00T4GRT2NGb8k8ZMX21f\nC4vjx45zOqcyaCiMNTCqE5w3AL6SPE9zx4k69z7ghK5gfD81prDYe21QNDjqfK65a9Xl8Ny5sLoC\nBp9ix3aOuw8owvoNHBy/QTHWsf6vWL/Ej3Gd2guBuq7Wn1FRZx3eAI/i+i+cczw8GDpjzUkJzzmu\nrYM3vuaal/oMCr+WsfnWp6LkOurgVlqJqIX44KdYw3e+MYW9gv6AueOMKYyxecc5nb0MXgolA+0i\n+pmdf6D9eeQ4JcZMXx3uC0n9zDbgQeD3RZBf5LmGWTDlcf+1TZfoeQ9eCsWD4YfYRX4WdiF/ANeh\n7DjnD3s+uxDr6F7gOeY+YAowAuufqQfG58NDpcmFvwF2vA0nnmLn7CUf6N8dVpSHOdjB8Z18aWT4\ntXQC+pQGvwcl58j01kYlNyTaTHHTZpA3QT6Bu2qbawayY4f2Dd+XWv/KHlsWkUdQVhNhKmv0+x/8\nxfuCn4ksshiSK7FR4LIjQbNPt4vh0obw8h6pmfcLxJYad4oojjsQnhnu9WGk5nw4JqX0S5AEv9ub\nBWZIcM4bBcpqMv33p3LsRXcWSiuxYQHMHRfMFVhRLvJQlTF0hG1rIX+s/3PxcfrBXJLaI1BcBmsr\nUncoUEb4DqdbyDg1xfCrEjeyKR/4RRdYUgFVpzk7Hv9nGobDviI3r8LZFfTtETzvMOCkPJhUCX2r\nkk/sD8O4F2BRB/8Ys7FmIgdvCO47Ze5T/thl0KvCf54EUII1SyWAu4HbU65/bAGsPduWP/9RRzfM\nNp0cnJP7QU/gE+AyYCR2RzEb+CU2+kvJdVRZKK1CyELsM2WI0GBM5WZIjE3PnBQcn2QuifUHPNgx\naHvfshjefx0SFcFz7Hk9OM701TCsxH8mx/TjjMdM/2dGL4MHK/y5CwuBqgOQ6Bk8by/gxJOBHkAx\nnNILhhbYhLd7PWPcA2w8CNUvw7pR1pTkhuC6Y26aB3NG+8NpZ38C2xIwuRH2HILHB7iJdM48OgHn\n9IY7gevqYN/fob4yaG76LLlvl6tERhTDcOAOYCnWV9MIPA1srnfzPpScJtNbG5XjR8LNQLcehPXL\nQbqlP05UqGfFQfjKfpiYYlry98dwx4mrq3XhW8HPjIkw5ZxZHezL7phpvBWAZwqUidvcyNfZLq3I\noviaXHHlSIKmp/DvpqLK3ruNYiOu5klK6Gx9WMiwSm5KxiegcnxJcKEb90WQx0A2ggxLafO5NTx/\nIWrBniZum9vJdbYxUHM71nn7VJfW+Y+XErhlZ7iimvpheOnuWRKs0+U0KboluQg3v9hizD2OKXQo\nkl45d69/pkps9d4KsZ0Cx7Rpd0iVzIuaoZQ2JaJe1DXGcA288meoKICfd0iaWHrC3NXGFE4UqV0L\njqnkK6Ot6cdrCvom0A/4DnAL8Eo3+L9Kb6Zy2Fys6WzbP2BAZxiEzYLuhTULFXS256stTA58Pny6\nGxL9Q0xpH8GonvAQbi2mp7HWJ69JKN8j38dGL4WZ0+JrajVxXWuNKRwJicVwUjk0FPlrPIWZ/sKi\n2ZwyKSQ/60TITntd5I2pLZ2fkp1onoXSLhDhMViUcBUFJBfPTjDi1+6RIxbbMhe34oaZLgG6Yxfq\nZ7CLdB3pFLizyquh2oaidgQeS447G+jaGWa9A1tfAtYDg+CZC4M5CXO3wIYr7aujaO4ENjfYqiZe\nErifzceG4t6bfHV+dvSF+URqq6yifGUcVCXn5ZtvilPbCRH20kjwZwlg/3BjRi8zZuyy5uXLKFlN\nprc2KiqONNEW9EP3mHSbPVUE7PLR541rUzvh6ZTji8N8BsGfd7s4elznvdN3wmf+atWS3+n3Jony\nWaRmla+V8ExwNUvlsqgZSmlH1HwUHlH0fq37PiqxzrtJzgf41Hl6Dovy8UYYJc02E6HyjzCoix3v\nduDs5BG9+3pnGVV6PbxsemENbPk1FJ0IH3SFRZ3suN7if06Z8yXYXUDrlpNPp1R8VDSb/e2kpDlr\nVJHd0T1OeCb40ZnPlHZOprWViooj4U/4Vx6BVe+BfD55THF6zZ5s46DoJ+YxIQl9za8d1czrK04+\n4X/oFgD0nmvinrB5tQfx7+iiGis1rxujSnZJxiegouKVsGgokDtAqkHOSh5T7JpVznzRRj6Fm0TS\nL6bndNprWSvY5l1jmFLaKMGQ1/Zj2vHPOapla+nW9jJflWPwN5DpCaiopCMgU0D2glwcUgp9QnTe\nQaqPI3KhS6kEm14r2PC5hpdq9/8+VSl5e3MH55Vp8c85TOHOEFglUeXaVbJf1GehZAUirDCG7bDl\n93D5CfDASd5SH7asyJ+rwK3+an0Ue0/1+zgaCYaIuhFI6baCjcKYwglwwQtu61WnFMmor8G6zsAw\nqB0Of98E950EnQuh8SCc3qX5FXHbDtenseMtOOdEEOC7QFesv6gTsBJYVAD7XjCmcKQ2RMoxMq2t\nVFSaI1D+XPzOwPvUvlHgCk/RvshCgGkUM4zeLbjHlEcUS1zUAPIuyPMgi0FmgEwAuQekBm7d1p53\nFu41ltaFz3OiuNFd89vdvFWOXnRnoWQZhT2bfgJP7asxDLirA0yqh76HYVs9bMmDX/b3FzwMRiC5\nUVQFJXDBacHdQmpp9RGLbcG+sPm98ycRzrXjUgDcBPwEWAOUw2P18EFq+fZWj4w6Guz9KO1so7hS\n61r1wN+LvHdJ1DhKdqLKQsky4npbhGUiDwMmdkv2ku5pe2pPXA7Dx8KuLtBlD4xYbExhSlE9p/fG\nA8C3CIaKnvSKMWzGrpQ9YeIAu1CGzW9XtTF0x8bK3gqsAspE2GiPqaWpQoxtib32L/4Civ4ZPsmD\nvfvAbIaLzoJEZ5uwmFoxd0HyOtcD9wMvntzW81aOMZne2qioNEesqWdWVfrRT+Ixj3jfj1oGV29P\n6ZFRDStvBfkWzN3o/i4qVHT230EmgZwJMgTOfdatw+Qd97I6eH0pyD6QJ0CGZvo+Nn1/L9vpN+Nd\n5THfrU2+T000XCVwdfL1DoFJr2X6WlRaV7Tch5JV2CftaT+AhdUwbQ1Meso6t2ur7BPxgXy4/oC/\nHMc92J4TDvlAj1J4aIB/t/BgP3jhNqAfmM7u75x2pV4SwMa3RVglwpsibIY374Tvb3GfvBcAXz8E\n1x+BcT2AUhGuEOHdVr4trciIxa6JDuBZ4Ge4daLOBq4DrgQuBs4HDgE/BwqB17DX//GeNp64coxR\nM5SSNbg+hDPOhkP74aVrws1G67ALWU/gALZg30DPSAmggHDfwo5KEW43Zl0fSCT9B7MI2umD/gQ3\nYqj6R/BPZ0GPvvD95TBqvghbWvduHCtSzXhO9JijMB2FcTZuMcfU3hw3Af1GG1NYrBFROUSmtzYq\nKulIUwlzIHlw/go3B2Cax2xSFWIWmrk5usx5U1FV5bVwUWTZc5DeIEtAPgD5BUhJpu9b8+9z6n35\nbhP3saIKrtnn73ExWdyaWhoRlUuiOwslS0iNcnKczH3fALrA6E6wD1t5dhiu2SQf61N2HLKvvg9v\nldsx5p4WFX0U1/nPizEUYT3gs4H/As4Q+ayMbJZxCLgBa1bKB74B3Ig1Rd2MrV+16QDseNF27QOo\n/At8ucg69x/C3cW1jxwRpXVQZaFkCWFRTvnAvl1AObz8IHS43JpDHgAacM0mA7FmpASw6iWP6apJ\nZRCXoGcMJwPfxtqpngJOF2FHa1xt5hjUHa4HKrCmunqsArkA6LYXPvxj6n0yZvxLcOflLWmXq2QP\nqiyULCEqZPYf74jwgTEbFkD/aZDfxa7d3yPYIGnONq+foaXZ2sbQH9uw4grg18AIEXJkYdy9C0YB\nj+I2cWrEKo1tG8KbSW1YYLPo22+OiHL0GGunVJT2jd+B7V2QVpS7O4Wxy2B1hdtU6CdAFXD4U9i7\nEjbNOxqHqzEMwHbMmwH8J/CACLuP5rraG/Y+X7Den4B4D9bCNvupqM6DbvBBZnNElGOHKgsla4hb\nkNJRKC07L58H7gIuwT5y/1iE94/mWtoztr7V2BdsNnonrN/i/ip4/lxVAMcvqiyUnKI1n3CNoRi4\nG5gOPAL8mwh7W22y7Rj/fezdB75aAz+siWog5f9M9DFK9qLKQlFSMIbBWCVRgQ0LWirCB5mdVeYw\npvSLcOYGWNLR7//5n7LwPJfW29Up7QfN4FaUJMZwqjE8DrwB7ASGiLDgeFYUlsYlrqIA+/rIQBi2\n1D0mKrR5xOK2natyrNBoKCXnaK45xBiGAvOxtSsewiqJj9pmttlAUWl42HKfUvd9VGiz5lrkCqos\nlJzAVRB9BsHYEfDTApucF1VOHIxhOLaAUznwIHCjCLVtPff2Tx3hYcv1nve7d8EmbC0ppxrtN9Bc\ni9xBzVBK1uPay1ddDstLYXmBrVe0jTBziDGcZgy/wfaSeBsYLML3VFFE8eE6m7PiLc64MPlzhw0P\nw0KxyZBgX+cftj9XcgFVFkoOEGYvvxebVOa8711iDKcbw2+xvST+ilUS94tQ1+ZTziryDtjdxRJs\nzsUS7Pu8A+4xox6EQ8a2W83DpqIUd4LBd7T9fJVjgSoLJQeIspc3Jv+dAGQ8bFsHTAN+iC1Ne5Ix\ndGi7eWYrg7pba51jte6IfV/SHcCYXiVw4hlwOtABu6tYii1l3qM0ZEAlC1GfhZIDRJUCccpq34Pt\n3nb3a/DU74ChwGRgCNDLGCqBzUl5z/Pv7SIcabPLaLfs3gW9sPfRIQE0HrL/Pu15q5idXcWlwC+x\nqSnd2nSmyrFD8yyUrCc8xv9mbDOenthaUQOBaWtEnp/o/yxdgUFYxXFqymsfbL0QrwJx/r1d5DMD\nfU4Tfn9vq4G78uCjP8CPr7I7jWexPbjXA7dgK9XuWi7yxtSMTV5pNVRZKDlBSuZ2MfyqxEZDOSSA\nSZG1jcLHpAtBReL8uwjrQfcqEOd1W64pkrDMeKitg+/uhUtMsAHSzcDOI/CXIZqUlxuoslByjrbI\nJjaGz+EqktRdSV9gO0Gz1ntYRXK4NeaQaYyhI9xdCyd0se08Us2A5btFXtc8ixxBfRZKztGcxkUt\nPwefAhuT4sMYTgBKcBXIMFwfST9j2EG4j6QyyxTJlXCoFvK6RCTtVWZiUsqxQZWFkpO0tFdF65yb\ng8C7SfGRVCTFuLuQL2A7Cw0B+htDNUGzlqNIDrXF/NPBGDoDi2DkTfDEY5AoCO4s9qqyyCHUDKUo\n7YTkAlxMuI/kFGAX4c72yqSCasu53gBMEeF8W9L8ghf8PTC0iGCuocpCUbIAY+iEq0hSfSQDgN2E\n+0gqkyaz1pxLl+TYU0X4q/2ZNj/KdVRZKEqWk1QknycY+jsEGzNcQ3A38h6wNR1FUmrMI33grDq6\nDWukc2dDI9CxoY59v31TZMYxuSil3aHKQlFyGBux5FMkXmVSDOwh3EeyRYQDAFOM+dsK25jbx0R6\nHlxDw1DdQRwfqINbUXKYZL7H1qS86P1dUpEMwK9Azkm+lhjDXuC9MnqeBvsDYzdScAL0X0yGAgmU\ntkWVhaIcpyQVSWVSVnl/l6yZlVQkHc6JHkX7VRwvaCFBRVECiHBEhCoRXjJ82kTIrvarOF5QZaEo\nSpMUUB/IFwHIo+6gLfuhHA+oGUpRlCbZA3+dArjRUA3SkUMf17J/pYhUZXp+Stug0VCKoihKLGqG\nUhRFUWJRZaEoiqLEospCURRFiUWVhaIoihKLKgtFURQlFlUWiqIoSiyqLBRFUZRYVFkoiqIosaiy\nUBRFUWJRZaEoiqLEospCURRFiUWVhaIoihKLKgtFURQlFlUWiqIoSiyqLBRFUZRYVFkoiqIosaiy\nUBRFUWJRZaEoiqLEospCURRFiUWVhaIoihKLKgtFURQlFlUWiqIoSiyqLBRFUZRYVFkoiqIosaiy\nUBRFUWJRZaEoiqLEospCURRFieX/AY5SUy5TwxCZAAAAAElFTkSuQmCC\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": "iVBORw0KGgoAAAANSUhEUgAAAQ4AAAEACAYAAABCu5jVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAACLxJREFUeJzt3U+IXed5x/Hf41oDshp1nBRbbb2oEki7EILSgIMRBFxK\nu4qLwYsuqgQajELbTbvpopQsQqEBbxJIjJvmj0gp3bT1zpCiEHCCW4oTCy2Mk3goTajcUnvqVBkY\n0bxdnKtIikaRHmXmnrkznw8MZ+4758KDEF/e99wRqjFGADrum3sAYPUIB9AmHECbcABtwgG0CQfQ\nJhxAm3AAbcIBtAkH0CYcQJtwAG3CAbQJB9AmHECbcABtwgG0CQfQJhxAm3AAbcIBtAkH0CYcQJtw\nAG3CAbQJB9AmHECbcABtwgG0CQfQJhxAm3AAbcIBtAkH0CYcQJtwAG3CAbQJB9AmHECbcOxDVfXJ\nqvr+3HPA7QjHPlNVv55kPcmYexa4nRrD38/9oqruS/JPSX43ybfGGMdnHgl2ZMexv/xhkn8cY7yR\npOYeBm7n/rkHYFJVv5DkqSQfmHsWuBM7jiWpOn6m6rHXq558c7oeP/Njt/xakvck+XZVbSR5oKpe\nW/6kcGeecSzBFIknLiTPHkmOJbmS5NzV5PnHx3j7xZ3fU98fY7xjuZPC3RGOJah67PXkyyenaFxz\nJclvbozx9Xfv/J5628NR9itHlaU4sX5zNJLp9Yn1271DNNjPhGMpLm9OO4wbXVmsw+oRjqW4dHZ6\npnEtHteecVw6O+dUcK8841iS6QHpqfPT8eTyZnLp7O0ejMJ+JxxAm6MK0CYcQJtwAG3CAbQJB9Am\nHECbcABtwgG0CQfQJhxAm3AAbcIBtAkH0CYcQJtwAG3CAbQJB9AmHECbcABtwgG0CQfQJhxAm3AA\nbcIBtAkH0CYcQJtwAG3CAbQJB9AmHECbcABtwgG0CQfQJhxAm3AAbcIBtAkH0CYcQJtwAG3CAbQJ\nB9AmHECbcABtwgG0CQfQJhxAm3AAbcIBtAkH0CYcQJtwAG3CAbQJB9AmHECbcABtwgG0CQfQJhxA\nm3AAbcIBtAkH0CYcQJtwAG3CAbQJB4dGVX2+ql6vqm9U1ctVdXrumVbV/XMPAEv2J2OMf5h7iFVn\nx8Fh4+/8LvCHyGHzF1X1zap6pqqOzD3Mqqoxxtwz7Imq+myS9y1evpbkw2OMH8w4Enukqp5Lcjo5\nejJZW0u2t5OtjSQXxxhP33Dfw2OMNxbB+Ksk3x5jfHyuuVfZQQ7Hz44x/nfx/TNJ3hhjfGLmsdgD\nVfVSkkd3+NE/jzHef5v3fCDT844P7ulwB9SBParcEI1KcjTJwSwkmXYad16vqhOLayX5nSSX9nqy\ng+rAhiNJqupzSf4jya8k+dTM47Bn1tbucv1vquqVJK8keVcSx5R7tJJHlarjZ5JT55MT68nlzeTS\n2THefnHne6syReNfxxhfWOqgLEXVA28kWw/d+pOj/znGDx5e/kQH38rtOKZoPHEh+fLJ5O8fnK5P\nXJjWbzWmMv5dkieXOynLs7XRW+entYK/AHbqfPLskeTY4vWxTK+/cz7Ju6/dVVXvGWN8Z7Hj+GCS\nV2cYluW4OF1u/VRl1qkOsBUMx4n169G45thifbKIxRer6h1JKtOZ9qPLm5FluvEjV5ZjBcNxeTO5\n8uDN8biyWJ8sjic7Hl2An97KPeNILp1Nzl2dYpFM13NXp3VgGQ78pyrA7lvJcADzWsGjCjA34QDa\nhANoEw6gTTiANuEA2oQDaBMOoE04gDbhANqEA2gTDqBNOIA24QDahANoEw6gTTiANuEA2oQDaBMO\noE04gDbhgBVQVV+qqler6mJVfbaqfmbOeYQDVsOXxhi/OsY4neSBJB+ZcxjhgBUwxnjhhpf/kuSR\nuWZJhANWSlXdn+T3krxwp3v30gr+p9NwcFTVc0lOJ0dPJmtryfZ2srWR5OIY4+kd3vLpJF8dY3xt\nuZPeTDhgXqeTPJpsZfpKkjy0041V9edJfv42QVkq4YBZHT15QzB+bP26qvpIkt9K8vhSxroDzzhg\nVmtrd7n+mUw7kZeq6uWq+rM9HuwnsuOAWW1v3836GOPIMqa5W3YcMKutjd76/mDHAfO6OF1u/VRl\n1qnuoMYYc88ArBhHFaBNOIA24QDahANoEw6gTTiANuHgR6rql6vqpap6rar+dvFPuOEWwsGN/jLJ\nM2OM9ybZTPL7M8/DPuUXwPiRqvqvJA+PMX5YVe9P8rExxm/PPRf7jx0HSZKqeleSt8YYP1wsfTfJ\nL844EvuYcBwSVcfPVD32etWTb07X42fmnonV5eHXITBF4okLybNHkmNJrjyYnLtQdfzxMd5+MUnG\nGP9dVetVdd9i1/FIku/NOjj7lh3HoXDq/PVoJNP12SPT+k2+kuSpxfcfSvL8siZktQjHoXBi/Xo0\nrjm2WL/Jnyb546p6Lck7k/z1MqZj9TiqHAqXN6fjyY3xuLJYv26MsZHk0aWOxkqy4zgULp1Nzl2d\nYpFM13NXp3Xo83sch8T0gPTU+el4cnkzuXT22oNR6BIOoM1RBWgTDqBNOIA24QDahANoEw6gTTiA\nNuEA2oQDaBMOoE04gDbhANqEA2gTDqBNOIA24QDahANoEw6gTTiANuEA2oQDaBMOoE04gDbhANqE\nA2gTDqBNOIA24QDahANoEw6gTTiANuEA2oQDaBMOoE04gDbhANqEA2gTDliyqvqDqvpWVf1fVb1z\n7nnuhXDA8r2Y5DeS/Nvcg9yr++ceAA6bMcYrSVJVNfcs98qOA2gTDqDNUQV2SVU9l+R0cvRksraW\nbG8nWxtJLo4xnt7hLWPJI+4a4YDdczrJo8lWpq8kyUM/4f5afK0cRxXYNUdP3s16Vf1RVf17kl9K\n8spip7JSaoyV3S3BvlK1/lbyP+u3/uTnNsfYfHD5E+0dOw7YNdvbvfXVJRywa7Y2euury8NR2D0X\np8utn6rMOtUe8IwDaHNUAdqEA2gTDqBNOIA24QDahANoEw6gTTiANuEA2oQDaBMOoE04gDbhANqE\nA2gTDqBNOIA24QDahANoEw6gTTiANuEA2oQDaPt/zWu4wFwb0xgAAAAASUVORK5CYII=\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": "iVBORw0KGgoAAAANSUhEUgAAAQ4AAAEACAYAAABCu5jVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGfFJREFUeJzt3WmAXVWZ7vH/E5JAJZCEOSheCJOgaQJIE2a6ERFxAFEb\naQQcEGJjqyAODU7Y6AUuIPfigICiXBq1m9EBbCAiBJmnxAiY0AS7GyFRJBCSQEJ4+8PagUqlKlW7\nzj57neH5fank1Dl7v5DkqXevvfZaigjMzMoYkbsAM2s/Dg4zK83BYWalOTjMrDQHh5mV5uAws9Ic\nHGZWmoPDzEpzcJhZaQ4OMyvNwWFmpTk4zKw0B4eZlebgMLPSHBxmVpqDw8xKc3CYWWkODjMrzcFh\nZqU5OMysNAeHmZXm4DCz0hwcZlaag8PMSnNwmFlpDg4zK83BYWalOTjMrDQHh5mV5uAws9IcHGZW\nmoPDzEpzcJhZaQ4OMyvNwWFmpTk4zKw0B4eZlebgMLPSHBxmVpqDowVJ+n+SFuWuw2wgDo4WI+lN\nwAQgctdiNhBF+O9nq5A0ArgJOAKYGxHjMpdk1i93HK3l48A1ETEfUO5izAYyMncBlkjaDHgfsF/u\nWswG446jJtK4vaU9H5MO+0v6Om7vPm/ZGdgaeFTSPGCMpDn1V2o2OI9x1CCFxCG/ggtGwVhgMTBt\nOVy7f8Rzt/X/GS2KiPXqrdRsaNxx1GLypXDBqIk8x578hhQeF4xKrw/IiW4ty8FRi4kTYCzbMpfz\n+FTx2tji9f75joq1MgdHLZ5aCIu5m93YgYdZl0XAi8XrZu3HwVGLTU6EL/IiK7iXXdmL6cCxy2H2\n0bkrMxsOD47WQOIiuKkHvrTn6xm7wZM8+8xzPHLUQAOjZq3OwdFkEpOB6cDrIxjw0kRiagR31VeZ\n2fD5UqX5zgK+PkhojAW+ILFufWWZDZ87jiaSOAC4AHhDBMty12NWFXccTSKxFnA28DmHhnUaB0fz\nfIA0RfSqfr8rrb2mD0tMknhDE+oya5iDowkkxgCnAydH9DMDVFoHeAqpZw2H2Qm4WWL/5lRpNnwO\njub4FHBnBHf0+92IF4A5wNSBDhDB1cD7gUskNmhGkWbD5cHRiklsAjwE7B7Bo2t441nAYiJOG+R4\nPREsrbZKs8a446jel4HL1hgayS0MYe0Nh4a1InccFZLYHpgBbB/B04O8eTzwBLAhES+WOMc6QE8E\nzzRSq1kj3HFU6wzgzEFDAyDiWeBWYFLJcxwGnFq+NLPquOOoiMR+wA+AHSJ4ocnnGhnBS808h9ma\nuOOogMQI0mSvU5odGgAODcvNwVGNw4uvP8lxcoltJa+KbvXxpUqDisHKR4BjIrglw/lHAHcA9wGf\ncDdidXDH0biPAzNzhAZABC8DBwLbAOflqMG6jzuOBkhsSOo29ongkWEeZDywFxHXNVjLKGDjCP7Y\nyHHMhsLB0QCJbwCjIzihgYNsDMwlzedYUVVtZs3kndyGSWIb4Cho8AnWiD8hPUF6qO2+Ckp7hcRo\nP9JvzeAxjuH738C5ESyo4FhDmn5eRnGX5SaJ11d5XDNwcAyLxB7A7lQ3GHkrFQdH8Tj/uyP4fZXH\nNQOPcZRW/CT/DfDdCH5Y0UE3A34HbETEy5Uc06yJ3HGUdxgwBrissiNGPEla1HhNC/s0TEIS3o/W\nGuaOowSJ0aS1NqZFcFPuesqS2Af4PnBwBHNz12Ptyx1HOdOAOe0YGgARzCB1NjMk3pi7Hmtf7jiG\nSGIC8HvgzRHMzl1PIyT2BO6LYMjrgJj15uAYIokzgQ0i+GjuWsxyc3AMgcSWpMlZkyN4MnM5Ztl5\njGNovgac3/TQkN6EtMbFi5tzWnaUKrxLZB3PHccgJHYFfgpsF8HzTT7ZJOB24DXU+AcjMZK0Tmpb\nj91YfdxxrEEx2ets4MtND43kcWA5sG0N53pFBC85NKwMB8eavQPYCLiklrOlLqPy6efD4RXFbE0c\nHAMo2vezgM/WvKpW5Q+8DdP3pQaWC7CO5uAY2LGkfU+ur/m8KTik3D/x/xn4R4lz3X1YXx4c7YfE\nONJkr4MjeKDmk4s0xjG3zgHS/kthA+BdEfwgZx3Wehwc/ZA4HXhdBMfkrsWsFTk4+pDYHJgJ7BTB\nf+Wux6wVeYxjdf9MWmvDodEPiU8WCxlZF/Oao71ITAHeBmyXu5YW9iDwh9xFWF6+VOlF4gbg2gi+\nlbuWYpB0LBF1TDwzK8WXKgWJtwJbABfmrqUwDfhG7iLM+uPgACTWIk0t/1wEy3PXU7id1pgItkYS\nm0pcLrF+7lqsPg6O5IPAM8C1mevo7bfARsVCxq3sz8B84HaJSbmLsXp0fXBIjAW+CpxcbCnQGtJq\n5zNo8a4jghURnAh8Cxwc3aLrB0clvgTsEMERuWtZjXQSsC0RH8tdillvXX07VmIi8Angr3PXMoCb\ngZ1zF2HWV1d3HBLfBRZFcHLuWjqNxCjgeOCCmp8uthp0bcch8Qbg3eC9VZtkHWB9aKFxI6tM13Yc\nEj8Hpkd4roRZWV3ZcUjsD+wAvCd3LWbtqOtux0qMIE32+idvSFQviYMlDsxdhzWu64IDOBJYBvxb\n7kKGTJqKNDl3GRV4DrhU4tjchVhjuio4JHpIe6R8uqUmew3uzcCHcxfRqAhuA/YFDi8m3lmb6qrg\nAD4J3BPBb3IXUlKrLGDcsAjmRPCWCBbnrsWGr2vuqkhsDDwM7BHB3Nz1lCKNBp4GNifi2dzlmHVT\nx/El4PK2Cw2AiGXA3cDeuUtpBoktpHo3obLGdMXtWIntgPeTbsG2q5WXK7/IXUgT7AZsCG0Y6l2q\nKy5VJK4C7orgzNy1DJv0BmBrIn6WuxSzjg8OiX2Ay0ibKi/NXY9ZJ+joMY5em0af4tBoLxLvLR6U\nsxbU0cEB/B1pHOdHuQuxoSsC40PAz4td9azFdOylisTapNuvH4ng5tz1WDnFpt/nA89H8Jnc9diq\nOjk4TgL+NoJ35q7Fhqe41BzZQgtIW6Ejg6PYLPkRYL8IHs5dT6Wk04HriWi32a/WQTp1jONU4KqO\nC41kJHTvE6YSW+auwTowOCS2Im138JW8lTRNxzy3UlaxJMKlEq8b3ud1iaTHJD0g6X5JO1ZcYtfo\nuEsViR8DsyM4PXctTSGNA/4IbETEC7nLqZuEhvtks6RLgJ9GxNUVl9V1OqrjkJhKep7j3Ny1NE3E\nc6S7Ra26MntTVbAcQkf9nc+lY/4n9prs9cUIluSup8m69nKlL4kxJR+Q+7qkByWdI8kTzIapYy5V\nJN4NnAbsHMEKSRcDuxbfngN8MCI6I1CkDYGldMp/TwMk3gzP/gw+8DhM3xBGj4Zly2DpPGBWRBz3\n6nu1aUTMLwLjIuDRiOjMS9om64jgKGYa/g74eAQ3pNe0bkQ8X/z6HGB+RJyVsUxrEunQh+DCHdJV\n6ioP2N4VEbv3/xntB3w6It5VR42dplMuVY4H5q0MDYBeoSGgB+/v0cFu2BD+CpjLhqu83rPKXraS\nJhZfBRwKzK6rwk7T9utxSIwHvkA/cxskfR84mNSNnFRzaVab0aNhAZuSkmAzKLaOGz26zxv/RdJG\ngIAHgWl1VtlJ2vJSRRq3N0y+FCZOgPGCY2+L2KvfqeXFT5fzgXsj4ge1Fmq1kMbMh6WbANxBWurt\nRgDWfjrihY0yltax2u5SJYXGIb+CGyfBVevDNyfAhQel11cXKRl/AhxWb6U1kNZHWit3Gfktnbfy\nV0dBr5WoXxwvqfP+3FtA2wVH6jQuGMUrq+uPBb49Mr3+KklbF18FvIv07EqnuQXYJXcRLWAWcBf0\nLHiU8QuX0LMg/Z6fAd+Q9HU5YCvVhmMcEyew2pYcY4vXkyIsfihpPdL17EzgY/XVWJsZpPkc9+Qu\nJKfet1z7krQxqeP8haS/j4i/1FdZ52rDjuOphay2JcdiYOkrcxoi2TsipkTEjhFx1Mq7LB3GE8EG\nERF/Ig2czwbukTQlc0kdoQ2DY/bRMG35q+GxGDhxBZw/RuI0ib4j6Z3sVmBvj3OsWUS8FBEnk+6+\n3STpiNw1tbsOuKvy1MIUJs89BnwX2AL4UAT3ZS6zHtIjwBFEPJC7lJaSLlN7iFiw6svaEbgauAb4\nXES8lKO8dteWwTGQ4nmVI4FzgIuBr3b8jvTSV4Hbifhl7lJaivQlYH0iTlz9W9oAuBwYDRxeXM5Y\nCR0VHCtJTAS+A2xL6j66evCwK0lvBK4HtqCfv+TFXZavAh8A3hsR/jtSQhuOcQwugqdI8zZOJ62U\nfYbEOpnLsno9BCxhgOUHImJFRJwKfIp0x+VDdRbX7joyOCCt2xDBj4Edga2BByT2yFyW1SV1GVcA\n7xnkbVeT7kx9TtK3lTb4tkF0bHCsFMH8CN5Hmol8lcTZEj2567JaXAm8lzSvZ0AR8TBp/9rXADdL\n2qyO4tpZxwfHShH8G6n7eC0wU+rMnd9tFQ8CP2f1GYOribSy2mGkcZF7JO3Z5NraWkcOjg6mWPTn\nW8C/AqdGrDajrL2kgb5pwLf7Gwi0ciQdDFxCWvD6gvD/09V0TcfRWwRXkxZw2IjUfbT37MuIFcBn\ngNfnLqUTRMR1wF7APwDfk+SB9T66MjgAIng6gg+Q1um4XOKbEuvmrqsBnn5eoYh4FNiDdJkzQ9L/\nylxSS+na4Fgpgp8Ck4F1gVkS+2cuabgcHBUrnm96P+khubsk/W3mklpGV45xDETiYNK09Z8Dn41g\nUeaShi4tI3ArsLnHOaon6QDgMuBM4LxuH/fo+o6jtwiuI3Ufo4DfSrwlc0llPFZ83TprFa1Kuhhp\nu+F+PCJuAnYnrRX0L5LGVFZbG3Jw9BHBsxEcS1oA+WKJi4p1TVtb+gn4Cej4PWWG60UGmQw2mIh4\nnDRouhy4Q9JWFdTVlhwcA4jg30l3Xl4mdR9vy1zS4CKuJOKPuctoUVfSYHAARMRS0t7EF5HC462N\nHrMdeYxjCNKmP1wM/Bo4KYJn8lZkpUkjSXvuTiVi3mBvH9ohtQ/wY+CbwBndNO7hjmMIIphOmnW6\nhNR9vCNzSVZWWnfjGipctDoiZpCmqh8CXFksVdkVHBxDFMGiCE4gPYb9fyUuldggd11WypVQ7SVn\nRDxBug3+J9It266YhOfgKCmCX5O6j2dI3ceheSuyEqaTNuiqVES8GBHHA+eSJot1/LaSHuNogMQ+\nwPdJq4x/IoI/Zy4JpE2A7xHR7wZV1lySppIe578E+EpEvJy5pKZwx9GACGYAU4AnSd3HezOXBPBn\nYA+k1+YupBtFxF3ArsDfAD+TNGHNn2hPDo4GRbAkgk+TbvV9TeJfJTbJWNDLpBmknn6eSUTMB94M\nPEp6RH9y5pIq5+CoSAS3AzsBj5OeeTm8WDw5BwdHZhGxPCI+CZxGWhzo73LXVCWPcTSBxFTSNe7D\nwD9EML/mAnYGfkTE9rWet11IPcD+RPyintNpF9IdnWL9l/JbMki6jHQJtAy4Gzg+0nIKWbjjaIII\n7iLt6fp7UvdxZM3dxyxg02Kg1FYn4HKkWnayj4j7Sf/odwGu1/DOe1lEbB8ROwJjgGOrrLEsB0eT\nRPBCBKcAbwc+D1wjUc9alukn0TZ9NyOyQsQS4AbSxK2aThlPAwcB95HGPUptFh6r7ptzN7B5heWV\n5uBosgjuJf20mUlabezoWrqP9BfVBnYF1HsXrNiS4fPAZ4F/l3RU2WMoTZ0/Csi6AZfHOGoksTNp\n7OMJ4LgInshcUvdK08P/G9iSiNqfPSrutFwNvAAsgZ4tYfRoWLYMls4DZkXEcf187kLg+Yg4qd6K\nV+WOo0YRPEB6tuFu0j4vH85456W7RSwCbgayTJSLiNmkzaI2B3aDpZvAsxPSV6aSZievQmlby41y\nhwa448hGYgqp+1hA6j7+M3NJ3UfaA1hGRLYNyqUx84uw6KNnQcSSTV99n44FPgTsHxHZ90N2x5FJ\nBDNJP1lmAPdJHFd59yGthfSaSo/ZSSLuyBkayegBdo5b7fXvAJsAd0q6X9IXmlzYGrnjaAESk0nd\nx0LgoxE8XtGB9yDttbJzJcezyg2142g17jhaQASzSUvxTwfulfiYVMmfzX3ANkjrV3Asa4qlAywq\nNNDrrcHB0SIieCmCM4B9gGOA6RKNrWkZsQy4C7zdZQubRXq6Ghi/EHoWkP7MZmWsaVC+VGlBEmsB\nJ5Imjp0GfCuC4T2eLX0RGE/EydVV2IGkEWR6BF7SbsB3o40uKd1xtKAIVkRwNrAncDjwa4lth3k4\nb9Q0GOkQ4AcZK9iJtEF223BwtLAI5pD+0V8F3CFxYtGNlHE3sKDYmNr6dyfwTvLtEevgsGoV3cd5\npM2A3g3MkEpsLh3xAhFvJ+OTlC0vrZ8xC7JtwOXgsOaI4FHSqlKXA7+R+Mwwug8bWO3PrgBIGkHa\nv2dm3eduhAdH21Bxt+Vi0uPVH47gocwltb+01OJvgYnF3aiaTqttgRsiYlJd56yCO442FMFjwAGk\nAb1bJf5JYmTeqtpc2ubgVmCbms+8E23WbYCDo21F8HIEF5Ae2d+fNHja0NqWkraUdKekOZJ+VDzC\n3T0iDiWi7u6t7cY3wMHR9orp6QcCFwI3S3xBYtRqb5T+CmmwHejOBM6JiO1I098/UnG5tjoHh+UR\nQURwEfAm0izRu4qnb3vbjLSAzJrsT1obE+CHpLs41lwODsureDT/bcD5wI0SX5FY+ZTl7cAuxUK9\nq5G0IfBMrw2E/hvwk7VNJGljYCzwh9y1lOXg6DBF93EJsDNp/OMeiV3Eejvdz9iRB7DXfGnPx6Rx\nfn4lvynAg+24y72Do0MVyxK+EzgHHr0JjrzlRo5bey/esh7cOAkO+VXv8CgW051QzCuAtDJVdy5t\nKL0PaacaztSWd1TAwdHRiu7jUjhuEZw94hYOYD9uIXXHF4yCyZf2+cjNwPuKXx8DXFtnvS1ke+CD\nNZynLcc3wMHRJSasB2OZwT58h48Vr40FJvbd1/TzwEmS5gAbAN+rs8oWciXwHl7tvpqlbYOju+7T\nd62nFsLi9Z9nPa54paEIYMSi3u+KiHmk5Qy7W8RDSItIC0vf2YxTKD1QtxW056xfdxxdYfbRMG05\nLC5+vxg4YTnccGTOqlpc6jqa543A3FZYeHg4/KxKl0gDoZMvTZcnTy2E2UdHPHfbqu9hHLAoAv+l\nkKYA1wBb0YR/JJI+AuwbEcdUfew6+FKlSxQhMdhShKeT1u+4rPkVtbxZwN838fhte0cF3HFYL8Vj\n+iMiWJ67lk4naQbw5Yj4Ve5ahsPBYWsksS7QE8GfctfSKYq5MguBSdGme/x6cNQGsy/wsMQpEmNy\nF9MhtgQWtmtogIPDBhHBdaQ9X3bBD71VpW3nb6zkwVEbVARzybCsXsuQJhLxVIVHbPvgcMdhwyax\ncT+P73cWScA9SNtXeNS2vqMCDg5rzA50+uVLuntwDdVOBmv7jsN3VcwGI+0HfIOIXRo/lDYAHgcm\nRKad46rgjsMqJbGWxAd7LSDUCW4DXovU2F6+yRRgZjuHBjg4rHoTSNtWPiRxaO5iKpE2s7qaai5X\n2v4yBRwcVrEIno7gbcA0YMPc9VTo/wMvVHCcjggOj3GY1UjSTOAjEXFv7loa4Y7DaiOxtsTXunXz\nKElrA9sBv8tdS6McHFan0cAfIngpdyGZ7AD8R0QszV1Io7oy+S2PCBaRNo7qVh0xvgHuOKwFSJwj\ncZCEctfSZA4OswrdCpwH/LLf7StbibQ10vnD/HTHBIfvqlhLKAJj3wim565ljdJOeE8B2xAx5DVK\nlJ55eQbYNkp8rlW547CWEMHylg8NgDSw+UsoPbltC2BxJ4QGODisxUlcJbFD7jr6uILyywxMoUMu\nU8DBYa3vVGBO7iL6uB7YHWn9Ep/pmPENcHBYi4vg4QhW9H6tWFQ5n4jngenAQSU+1VHB4cFRazsS\npwOTgc9H8EimIsYDzw11zxVJ84ADI2JucwurhzsOa0enkx51nyGxY5YKIp4tERoTgI2A/2huUfVx\nx2FtS2IC8Gyr7zwnaV/gjIjYM3ctVXHHYW0rgoV9Q0NifAs+RNdR4xvg4LDO83HghNxF9NFxweFL\nFesoxfMua9X2BK60BTCGiIcHfovuB6ZFxN211FQDdxzWUSKIvqFRrAOyRZNO+VbgywN9U9JoYHtg\ndpPOn4WDw7rBLsD9Ev9HosykraG4BjioeIalP9sDf4iIJRWfNysHh3W8CO4gzfsYB7y/4oMvAO4H\nDhzgHR011XylVht9NmuKCJ4Ejm/S4a8kPbtybT/f67iBUXDHYV1OYj2J/Ro8zNXA20lrivbl4DDr\nQFuRBjiHL+KPwCnAOr1fLtbg6Mjg8O1YsyaR9Drg7ojYLHctVXPHYdaHhCQ+KrFug4dq+13pB+Lg\nMFtdD/A3wByJDzdwnI68owIODrPVRLAkgiOBd0FDm2f3O74h6QRJcyWtKHavbzse4zCrmiQiQtKj\nwDsi4pE+355CWrj418CuEfGXDFU2xB2HWQkSa0mcJTFmgDf8GNhH0jhgIrDawj0RMTMi/hPadx8Z\nTwAzK2ck8HtgoG0cZ5Mmg70MzI6IFQO8r605OMxKiOBF4HtreMsVwPSRMOelDr2jAg4Os0pInAGn\n7AYjxjxMbLobI869nREvFOMZsyLiuH4+1rYDjB7jMKvGdXDEX8PdU3/CyLUOY8UoWL4eMBUGXBdV\ntOk4h4PDrAIR3Aq7L4ETuZLlvHGV7/ZM6v07Sf8o6b+A1wIzJV1YY6mV8O1Ys4pIE56BZyes/p3x\nCyMWVr0OSFbuOMwqs2xZudfbl4PDrDJL55V7vX35ropZdWalLz2TYPTo1Gksnffq653DYxxmVpov\nVcysNAeHmZXm4DCz0hwcZlaag8PMSnNwmFlpDg4zK83BYWalOTjMrDQHh5mV5uAws9IcHGZWmoPD\nzEpzcJhZaQ4OMyvNwWFmpTk4zKw0B4eZlebgMLPSHBxmVpqDw8xKc3CYWWn/A1pj5DmQz3pqAAAA\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\nBrjEnVWV/jx3JgBnA/ebcUKlP09kQxpxlMfJgAN3VusD3bnfjKOA35jxYeDHOuMi1aLJ0V4yY0vC\n2Y6vuvNEgs/fjXC69gngW+6srXYGqT86VOm9c4HnU5QGgDt/AQ4hXEx3nxn9UuSQ+qIRRy+YsSNh\ntHGIOy8lzvIB4GfA/sAX3GlOmUeKTSOO3hkL/Hfq0gBwZw1hwvQuwunaEYkjSYFpxFEiMz4KzAT2\ndmdp6jwdmfEV4HrgVHempc4jxaMRR+muBK6rtdIAcOcO4MvArWaclTqPFI9GHCUwYzTh1GtjtqKz\nJpmxB2FLwruBS91ZlziSFISKI5IZBvwOuMmdW1Ln2RQzdgKmAH8FzqjGAjUpPh2qxPsysBXhgrOa\n584y4LPZ3z6aFYlIr6g4IpixBXAV8O087USejTL+kXDl7ozsEEakZCqOOOcA8915NHWQWO6sc+e7\nwHjgSTMOSZ1J8ktzHD1kxnaEfUQ/605T6jy9kV3jMgk4LzsDIxJFxdFDZowHtncvxulNM/Yl7Co2\nEfiRLpCTGCqOHjBjCPAcMNydxYnjlI0Zg4H7CZsDfT1bfSqySZrj6JkfADcUqTQAsutZDgUGAg+Y\nsW3iSJITKo5NMOMTwKcJG/UUjjstwJeAlwm7iu2WOJLkgIqjG9lir2sItyVoSZ2nUrI9PM4FfgE8\nbcbHE0eSGqfi6N4XgJ0IX6hCc8fduQ44D3jYjC+kziS1S5OjG2FGAzAbuMCd/0mdp5rM+CRwHzAu\n299UZD0acWzcmcCrwEOpg1RbtnP6wcA3zbjOjM1TZ5LaohFHF8zoT1jsdbQ7z6fOk4oZOwD3AG8Q\n9vao2SuBpbo04ujaxcC0ei4NAHfeAI4CWoHfZreiFNGIY0Nm7Ar8ERjpzl9T56kF2dmly4HTgGPc\nmZs2kaSm4tiAGb8AFrtzSeostcaM0wkXyZ3szvTEcSQhFUcHZuwHPAzs6c7y1HlqkRmHA7cDF7kz\nKXUeSUPF0YEZ04ApOgXZPTP2JtwE6pfA93WBXP3R5Ggmu9T8w8DNqbPUOnfmAKOBY4BfZhscSR1R\ncQDZOoVrgIt1hWjPuLOEcA1Pf+AhM7ZPm0iqScURnAG8CfwmcY5cydZ1nEg4C/W0GbsnjiRVUvdz\nHGb0BeYDx7vzTOo8eWXGucAlwJf0/2PxacQBFwJP6D/23nHnp8A/E/b1OD51Hqmsuh5xmDEQaAJG\nubMwdZ4iMGN/wn1crgX+Q2dciqnei+MmYIU7F6XOUiTZZkAPAtOB87P9PqRA6rY4srUI04G93Hkz\ncZzCybYhvBtYBYwp8kZI9aie5zjGAz9UaVSGO28DnwdeA57INkaWgqjL4siWTQ8DfpY6S5Fla2LO\nIow8ZpgxInEkKZO6O1QxYzPgWeBKd+5KnademDEG+AlhX49pqfNI79TjiOMUYDXht6BUiTu3AycA\nt5pxZuo80jt1NeIwYyvCzl5j3Pld6jz1yIw9CRfI3QWMdWdd4khSgnobcXwLmKXSSMed+cBBwGHA\nr8zYMnEkKUHdjDjM2BmYC4x25+XUeepdVhi3AB8kLFNfljiSRKinEcdlwGSVRm1wD+s7gKcIF8jt\nkTiSRKiLEUd2XP07YJh+s9UeM84CrgBO0GFkPtRLcdwDzHRnfOos0rVsI6VJwDfduTN1Hule4YvD\njE8BtxGWlq9KnUc2LtvzdSowARivC+RqV6GLI9vWfyZwvTuTU+eRTTPjg8D9wCzgG9qRrTYVfXL0\nJKCBsCu35IA7rwKHArsCU7O76kmNKWxxmNEHuJKwjb8WGeWIOyuALwILgafM+FDiSLKBwhYH8A3g\nRXd+mzqIxMv28PgX4FbC6dqPJY4kHRRyjiO7WfI84DDdrjD/zDgRuBE43Z0HU+eR4hbHtcDW7nw9\ndRYpDzMOBO4FrnDXdgipFa44zPgI8Aywjzuvpc4j5ZP9u32QcNblYs1dpVPE4rgDaHJnXOosUn7Z\nYei9wDLgtOzeLlJlhZocNeOTwCHAdamzSGW48wbwOWAl8LgZAxJHqkuFKY5ssdc1wPf0W6jY3FkN\nnAZMA2aa0Zg4Ut1pSB2gjL4EbEs4fScFly1Hv8yMV4D/NZt8Hkw4FgYNhsXN0DTWffmixDELqxDF\nYcYHgKuAc915L3UeqR53fml2x7vw3GR4ZHPoC7QC5xxo1v8IlUdlFKI4CLcefEWb4OZbdri5BbBV\n9teWXfy5i+ceOR2uz0oDwuPEobBgHHBqdf8p6kPuiyO78c/3gCNTZymK7AvcQI++tGV9bktgDeEm\nTis7PK7s/rm+O7aXRpu+wEDdy6VCclcco81uHgCjVtCv0enT8Gneo4Ht3m5h0bngZ6fOV25mbE7v\nv6ClvMbp/KXdxBf4/ccWwunS2NeuKuVQ0+zZHaD1lPXLoxVY0hz7XtIzuSuOATBqCowM/2223VXw\nrR2Pg1GV/NzsfixtvxWr+Zt4c+K+tBs+91Ypr83X/V6bxsI5B4bDk/fnOBaE56USclccK+jXSBe3\nIV1B/73NOJjKfJG3Ihx7ryL+t2/bn/9ewmtWAmu0oU333JcvMut/RJjTGDg4jDR0VqWSclccTp+G\nropjHX22AK5m01/GN7t4ridf5NX6AteurCQ0EVoluSsOY/Vausi9GStXuXNQgkgidSd3K0e3oWVe\nzPMiUn65G3EshVnHEeY6nD4Nxuq129Ayb2nYo1JEqqBwV8eKSOXl7lBFRNJTcYhINBWHiERTcYhI\nNBWHiERTcYhINBWHiERTcYhINBWHiERTcYhINBWHiERTcYhINBWHiERTcYhINBWHiERTcYhINBWH\niERTcYhINBWHiERTcYhINBWHiERTcYhINBWHiERTcYhINBWHiETL3S0gRYrGrP8QGD4OBg2Gxc3Q\nNNZ9+aLUubqj4hBJKJTGcY/CxKHQF2gFzjnQrP8RtVweOlQRSWr4uPbSgPA4cWh4vnZpxCFSJWZs\nCQwD9gVGhMfDD2svjTZ9gYGDq50vhopDpMzMMGAIoRyygmAEsDvwJ+AFYDbwE3imBVqPX788WoEl\nzVUNHcncPXUGkdwyYzvWL4d9geHActoLou1xnjvvrv/6Luc4FsCUmp7jUHGI9IAZWwB7sX5JjAC2\nB5pYvySa3Hmj5+/9qUY4fDa8+BQ0v5qHsyoqDpEOssOMD9J5FLEH8Gc6jyIWubOul595AHCTOx/r\nzftUk+Y4pG6ZsQ3hsGLDuYh3aS+HR4EfA3PcWVmhKCOB5yv03hWh4pDCM6MB+CidRxG7AHNpHz3c\nB8x2Z2mVI6o4RFIyYxfWn4PYF2gEFtM+irgte1zgznuJonY0ErgzdYgYmuOQXDJja2BvOo8iNmf9\nOYgXgBfdaUkUtVtmbAa8DXzInbdS5+kpjTikpmVfrN1ZvxxGALsBL9FeDg9nf252J0+/DYcCy/JU\nGqDikBpixo50nqgcDrxOe0H8Gvg3YL47axJFLaeRwB9Th4il4pCqM6MPYd5hw1FEP0JBzAb+ANxC\nWBORq9/GkXI3MQoqDqmgbE3EbnQeRQwFXqF9FDEhe/xLzg4zymEk8PPUIWJpclTKwoxtCYcVGy69\nfof2icq2opjnzqpEUWuKGa8CB7uzKHWWGCoOiWLGB4A96bz0eifgRdY/ozHbnWWJotY8M3YGXga2\nz9tIS4cqdWC02c0DYNQK+jU6fRqM1Wu3oWXeUpg1w/3srl6THWYMovPpzj2Bv9FeDv+VPb7S26XX\ndWg/4I95Kw1QcdSFATBqCoyEFsJfNAAjj8v+dzP60r70umNJrKO9IKYDNxDWRLxT1X+A4srlxCio\nOOrCCvo10sX6p+Vsv68ZfwIGA/NoL4mp2eNrefxtmCMjgcdShyiFiqMOOH0auiqOsMiSY4GX3Vlb\n3VRCKI5rU4cohfYcrQPG6o2Uwtp1wKsqjerLthEcCsxJnaUUKo46sA0t87p6voHtlgPzzTg3O1si\n1bMPYfXr6tRBSqFDlTqwFGYdR5jr6HhWpYVFs4CfAeOB88z4DnCv5jWqIpdLzdtoHYcAYMbngKsJ\nkyHfdufpxJEKzYwbgIXuXJc6Syl0qCIAuDMN+DhwM3CnGXebsUfiWEWW21OxoOKQDtx5z51bCIu8\nngNmmHFDtsJRyiTbKmA/cnyoouKQTtxZ6c6VhJsHOTDXjEuyzXOk94YAb7nzeuogpVJxyEa583d3\nzgNGEw5jXjLjDLOwAERKluvDFFBxSA+487I7JwInAWcBfzDjqMSx8izXZ1RAxSER3JkBHAL8O3CD\nGdPM2C9xrDzSiEPqizvuzj2EBUxTgIfNuMWMDyWOlicqDqlP7qxxZwLtl9k/b8aV2YY+shFm7ABs\nByxMnaU3VBzSK+4sd+dSwunFXQhL2M/L7rUqnbXtwZHrvUtUHFIW7vzNna8BRwJHAy+acWK2IZC0\ny/3EKKg4pMzcecGdo4GvA5cCT5txcOJYtST38xug4pAKcedRYH/CRXS/MuMeM/ZKHKsWqDhEuuPO\nOncmEe6hMhN4yowJZgxIHC2J7H4yexI2dc41FYdUXLaEfTxhCfsawhL2sXW4hH0Y4UbXK1MH6S0V\nh1SNO8vcOR84gLAZ8nwzvlZHS9gLcZgCKg5JwJ0F7pwEnAD8E2ENyNF1cAamEGdUQMUhCbnze+BQ\nYCzwY+ARMz6eNlVFacQhUg7ZEvYphHu5/Bp4wIxJZuyWOFpZZaMpjThEyilbwn4j4azDQuD/zLjK\njO0SRyuXDwOt7ixNHaQcVBxSU9xZ4c5lhBHIjoQJ1PMLsIR9PwpymAIqDqlR7jS7cyZwOGEZ+1wz\nTs7xBGph5jdAxSE1zp0md44hbCB0MTDTjE8ljlWKwsxvgIpDcsKdx4FRwPXAJDOmmNGYOFYMjThE\nUsiWsE8mLGF/EnjSjBvN2CVxtG5lE7w7AwtSZykXFYfkjjur3LmGUCArgTlmXGZG38TRNmZf4AV3\n3ksdpFxUHJJb7rzuzgWEQ5hhhDMwZ5rV3K1NC3WYAioOKQB3XnFnDHA8cBphCfsxNXQGplATo6Di\nkAJx5xng08B3gWuAx8zYP2moQCMOkVqWLWGfSlhAdicw1YzJZgxJkSdbuNYIzE7x+ZWi4pBCcmet\nOzcRlrC/DDxnxtVmbF/lKI3An915p8qfW1EqDik0d1rcuRwYDmxLuI3lBdluXNVQqKXmbVQcUhfc\nWezO2YQ5kM8A88wYk905vpIKN78BKg6pM+7McedYwgZCFwK/N+OwCn5k4c6oAJi7p84gkkQ22jgZ\n+CFh8vI77swp4/sbsAzYx50l5XrfWqARh9StbAn77YQJzOnAdDNuMmNgmT5iV2BN0UoDVBwiuLPa\nneuAvYAVhLvQXW5Gv16+dSEnRkHFIfI+d9505yLgE8AehCXsZ/diCXshJ0ZBxSHSiTsL3TkF+CIw\nBnjBjGNLWMJe2OLQ5KhIN7Ky+DwwHvg7cJE7z/bwtX8CjnVnbgUjJqERh0g3siXsDxDmK24Dpphx\nuxm7d/c6M/oDg4D5VYhZdSoOkR7IlrD/J2EJ+1zgWTOuNWOHjbxkBNBUpD04OlJxiERwp9Wd7wP7\nAFsTlrBfZMaWG/xoYec3QHMcIr1ixjDgR4RDmUthp6dhzyvggM/Am3+De092X74obcryU3GIlIEZ\nh8JLP4Ebh8EP+kBfoBU4ZwFMOaJo5aHiECkTs4Nug0dOYb2tT1uBIye7P31qqlyVoDkOkbIZNJhO\n+yX3BQYOTpGmklQcImWzuDmMMDpqBZY0p0hTSSoOkbJpGhvmNNrKo22Oo2lsylSVoDkOkTIy6z8E\nho8LhydLmqFpbNEmRkHFISIl0KGKiERTcYhINBWHiERTcYhINBWHiERTcYhINBWHiERTcYhINBWH\niERTcYhINBWHiERTcYhINBWHiERTcYhINBWHiERTcYhINBWHiERTcYhINBWHiERTcYhINBWHiERT\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",
"[0, 2, 5], [2, 5, 0], [5, 0, 2]\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",
"Joseph Kruskal (Wikipedia)\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+bHtLkuaEY90pG14nl32nc7npS4z8KVJRLD4VebvNNH/S3byp2MVx8CXxolg5wj+\nBNgQ/M+rE/+u/40I5s/pwqRZMvClWgTzIjgNeATYFzhoIc88PNHvncfPPQ+sj+DAuVyjNBv+WKrB\niyCA3wQ+DTwNvCeTBwEOCR48lurMfuxdOlv43oPA3cCdEfwVcHEmr7T1d5CmIjKz7TVIral36KuB\nxcB5wD9mMuUXRQR7AVcDuwInZfJIIwuVRsAjHQ1SBEsjuBG4HbgZ2D+TO6YT9gCZPAEcBfwNsC6C\nM+ufGKTOMfA1KBHsFsFqYD3wKLBPJmtmcxyTSWbyeeAw4CTg6xH8wmhWLI2Oga9BiGCnCP4I+E9g\nIbAsk1WZVTXVKNTHOW8Hvgl8J4IT3e2rSzzDV6/VgXs88Cngu8D5mfz7HDzvgcD1wMPAGZlsbvo5\npe1xh6/eiuAdwD8D5wCnZHLMXIQ9QCbrgQOBHwIPRXD0XDyvtC3u8NU7EbwF+AtgP+BjwN9lMkkB\n1Zys5zeAa4G1wLmjPEaSpsMdvnojgsURfIHqDP2fgH0zuanNsAfI5F7gAOANwL9GcGib69FwGfgq\n3thWCFQtLd+cySWZ/KTlpf1UJs9m8gGqe/1vjeBTEezY9ro0LAa+ijVRK4RMzsnkxy0vbVKZfBlY\nDiwDvh3BspaXpAEx8FWcCCKC3wIeAlZQtUI4MZPvt7y0Kcnkv4FjgcuBeyI4J4KfaXlZGgDftFVR\nZtsKoWsiWEpVpQtwcinftFQmd/gqwqhaIXRNJo8DhwNfpTriOcViLTXFwFenNdEKoWsyeTWTS6iC\n/w+Br0SwR8vLUg8Z+Oqkca0QFtFAK4SuyWQD8Daq6tyHInhvy0tSz3iGr05pqxVC10RwCHAdsA44\nO5NnW16SesAdvjqjzVYIXZPJA1S3b75Itds/vOUlqQfc4at1XWuF0DURHAV8EfgScEEmL7W8JBXK\nHb5a09VWCF2TydeoWjPshXN0NQsGvuZcCa0QuiaTzZkcD3wCWBvBxyOcSa3pMfA1Z0pshdA1mdwE\nvJVq0Mq6CPZpeUkqiIGvxpXeCqFrnKOrmfJNWzWqb60Quqbe4V8HPEd1Z9MPW16SOswdvhrR11YI\nXeMcXU2HO3yNVAS7Ud1aeQrwOeAzfa6O7RLn6Gp73OFrJIbYCqFrxszRfQLn6GoC7vA1K7ZC6Ka6\nMvcanKOrMdzha8ZshdBdmdyDc3Q1jjt8TZutEMpSd938PNWOf1UmL7e8JLXEHb6mzFYIZXKOrv6f\nga/tshVC+cbM0f1LnKM7WAa+JmUrhH7JJDO5GjgYOAa4O4I3tbwszSEDX69jK4R+q6+jc3QHyDdt\ntZVxrRDOB6tj+6w+z78e+AFwWn30o55yhy9g0lYItxv2/eYc3WEx8Acugt0iWA2sBx4F9slkTSav\ntLw0zZFMXs7kAuA4YHUE10awqO11afQM/IGqWyF8GFshqJbJ/ThHt9c8wx8YWyFoKpyj208G/oDU\nrRA+Q/WT3TmZ3NvuitRlEfw8VYXufsBJdXM2FczAHwBbIWg2IjgBuJyq3fXFvr9TLs/we8xWCBoF\n5+j2h4HfQ7ZC0Kg5R7cfPNLpkQjmAR8AVlHt6C+wOlaj5hzdcrnD7wFbIWguOUe3XO7wC2crBLXJ\nObplcYdfKFshqAuco1sWA78wtkJQ12TyUiYfBk4Crojgigh2aXtdej0DvxC2QlDXOUe3+zzD7zhb\nIahEztHtJgO/w2yFoJJFsAdwFfBGYGXdilkt8kingyJ4SwRfpSpyuQw42LBXaZyj2z0GfofYCkF9\n4xzdbjHwO2BMK4TvAi9gKwT1TF0EeASvzdE91WKtuecZfotshaAhco5uewz8ORCxcCks+yTsuQSe\n3AQbLoTnfhX4NPA0cG4mD7a7Sk1mouuX+dzjba+rZBHsCPwpcCrwwUy+3Nxzef1+KutDNh/NPGDB\nUli5EbYkZFYfz3oRHnkU8hjIaHuNPqZ7/VZuhAVL215bHx6Qh0JuhLwWcpHXr9mHO/yGRRx6A3xj\nBew85rMvAO/628z7VrS1Lk3N5NfvQw/DVbe1ta6e2QX4SP3f3wTuGd2XPu04+Ox+r79+R96Yef/K\n0T1PGXzTtnF7Ltn6HxtUv959zzZWo+ma7PrtZOuA0dkCXAR8G3gH1VHP/NF86fmLJr5+i5eM5uuX\nZV7bC+i/zU9XO4rxO4ynNrW0IE3LokUTX7/v3J/JqnbW1FurxszRPYZZztGtvtYbzvD19xp3+A2K\nYBFcuTec92z1jwyqj6c/Vr1xq66KYIcILoGPLoAzH/f6zY1MNmdyPPAJYG0EH6/vZpuWCN4IfAve\nd1t1vbx+4F06janCnq8D62Hh6uougcVLqp3FgO8SKEB9B8k1wC8C74aFC71+cy+CvYCrgV2pdvuP\nTPHP7QfcCVyayWWv3aXj9TPwG7B12PMHmfaoL0UEC4BbgReBEzJ5qeUlDVpdnHUGVa3KKuCK3Ebl\ned1/6hbg7Exunos1lsTAHzHDvlx1s687gX8BzkxnDHTGVOboRnAc8AXgxEzumuMlFsEz/BEy7MsV\nwS8D66hK/0837LsltzNHN4IPAp8D3mXYT84d/ogY9uWq57LeDlyUyZVtr0fbNn6OLnA2cAJV2H+v\nzbV1nYE/AoZ9uSJ4J3AjVU+Xf2h7PZqaCOYDfw6cVX9qj0x+1OKSiuCRziwZ9uWKYAXVTvG9hn1x\nAngT8DKwGbjIObrbZ+DPgmFfrgg+AlwMHJHJfW2vR1NXF2fdBTwLLAB+iaoy99+co7ttHunMkGFf\npgh2AFYDRwFHZfKDlpekaagLqr4G3AH88dhbNJ2ju33u8GfAsC9TXVB1PfA24NcN+7LUBVXrgKsy\nOW/8/fhZtVheDiyjGrKyrIVldpqBP02GfZnqgqo7qJqqHJnJj1tekqahLqi6i2p2xGWT/b50ju42\neaQzDYZ9mSyoKttMC6rq2bnX1r88OZ0m5w5/qgz7MllQVbbZFFTla3N0b8c5uoA7/Ckx7MtkQVW5\n6mC+iBEVVDlHt+IOfzsM+zLVBVVrgTMM+7LU7ZDXAEcDh42iejaTDVRv1j8MPFTf0TM47vC3wbAv\nU11QdSnw295jX5YIfha4GdgR+J1MtjTwHIdSNWK7j6qr5rOjfo6ucoc/CcO+TBZUlWtMQdUzwDFN\nhD1AJvdT3b75EtVu//AmnqeL3OFPwLAvjwVVZdtWQVXDz3s08EXgS8DH+j7/wB3+OIZ9ecYUVB2M\nBVXF2V5BVZMyWQvsDywB1tdv9PeWgT+GYV+ecQVV77SgqixTLahq0qjm6JbAwK8Z9uWpC6ruBb5P\n9QZfr38c75u6oOrvgRVdGEeYyU3AW6kGrayrp2z1ioGPYV8iC6rK1tUJVZk8QfU+0HVUoX9m/f5Q\nLwz+TVvDvjwWVJWrLqj6M+D9dHxCVb3Dv56qDfOEc3RL05vvXDNh2JfHgqpyjSmoOooRFVQ1qZ6j\nexiTzNEt0WB3+IZ9eSyoKtdcFFQ1afwc3Uw2t7ykGRnkDt+wL48FVeWaq4KqJmWyHjgQeIKqWOvo\nlpc0I4Pb4Rv2ZbGgqmxtFVQ1qa7MvYbqaPHckr6BDWqHb9iXxYKqsrVZUNWkTO4BDqDAObqD2eEb\n9mWpC6puBV4ETvAe+7LUBVW3UDUna/0e+6bUXTevAK6mgDm6g9jhG/ZlsaCqbF0rqGpSPUf3AAqZ\no9v7wDfsy2JBVdm6WlDVpJLm6Pb6SMewL8uYgqpVmaxpez2aupIKqprU9Tm6vd3hG/ZlGVdQZdgX\npC6ouopCCqqa1PU5ur3c4Rv2ZbGgqlylF1Q1qT7PvwH4LzoyR7d3O3zDviwWVJWrDwVVTarn6B5M\nh+bo9mqHb9iXw4Kqso0pqLod+Ghf7rFvSlfm6PZmh2/Yl2NcQdXbDfuyjCmoWpPJ+Yb99nVljm4v\ndviGfTksqCrbUAqqmtTmHN3id/iGfTksqCrbkAqqmtTmHN2iA9+wL4cFVWUbYkFVk+r2yu9njufo\nFnukY9iXw4KqcllQ1bwI9qLqxbMrcFI9eKURRe7wDftyWFBVLguq5sZcztEtbodv2JfDgqpyWVDV\njqbn6Ba1wzfsy2FBVbksqGrPmDm636KBObqd3uFHLFwKyz4Jey6BzU/DlXvDmx/AsO+Ura/TU5vg\n8hfh1w7DgqoibH39nn8G/no/2Ps2LKhq1fg5urBwwWvX6clNsOHCzOcen9YXzcxOPmDBUli5EbYk\nZFYfz3gGFixte20+tnedznoJ3rd/22vzMdPr9/tP+zrrxgNyPuSlsPFJOHXT1tdp5cbpXqfO7vAj\nDr0BvrECdh7z2ReAk++GW1a3tS6N97vnwrVHvP46HXlj5v0r21qVpsbXWSlOvwQu+ZXZvs4av+9z\n5vZcsvVfDqpfL10OfKiFBWlCS5dPfJ0WL2ljNZouX2dlWLB4FK+zDgf+k5uq72Djv6OtW5uJO8eO\niFh3A7wwwQ7xqU1trUnT4eusBKN6nXX4Lp0NF8Lpj1V/Kag+nv5Y9Xl1h9epbF6/MozmOnX2DB/G\n3j2wuL77YwbvSqtxXqeyef3KMIrr1OnAlySNToePdCRJo2TgS9JAGPiSNBAGviQNhIEvSQNh4EvS\nQBj4kjQQBr4kDYSBL0kDYeBL0kAY+JI0EAa+JA2EgS9JA2HgS9JAGPiSNBAGviQNhIEvSQNh4EvS\nQBj4kjQQBr4kDYSBL0kDYeBL0kD8H0VC3Z07TYQ6AAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_tour([P[0], P[1], P[4], P[5], P[2], P[3], P[6], P[7]])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can think of this as starting at the root (at the top) and going around the outside of the tree counterclockwise, as if you were walking with your left hand always touching an edge, but skipping cities you have already been to.\n",
"\n",
"We see that the result is a tour, but not an optimal one. \n",
"\n",
"Let's see what `mst_tsp` can do on the USA map:"
]
},
{
"cell_type": "code",
"execution_count": 112,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nMAzDSMr/BwzNZAmFc5HQAAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"80 city tour with length 17924.5 in 0.004 secs for mst_tsp\n"
]
}
],
"source": [
"plot_tsp(mst_tsp, USA_map)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Not so great. Can the alteration strategy help?"
]
},
{
"cell_type": "code",
"execution_count": 113,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def altered_mst_tsp(cities): return alter_tour(mst_tsp(cities))"
]
},
{
"cell_type": "code",
"execution_count": 114,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\ny0KtgVW7AAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"80 city tour with length 14105.0 in 0.022 secs for altered_mst_tsp\n"
]
}
],
"source": [
"plot_tsp(altered_mst_tsp, USA_map)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Better. Let's go to the benchmarks:"
]
},
{
"cell_type": "code",
"execution_count": 115,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" mst_tsp | 5953 ± 361 ( 5334 to 7030) | 0.002 secs/map | 30 ⨉ 60-city maps\n",
" 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"
]
}
],
"source": [
"benchmarks([mst_tsp, nn_tsp, greedy_tsp, dq_tsp])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Not very encouraging: `mst_tsp` is the second slowest and has the longest tours. I'm sure I could make it faster (at the cost of making the code a bit more complicated), but there is no point if the tours are going to be longer. \n",
"\n",
"What happens when we add the alteration strategy?"
]
},
{
"cell_type": "code",
"execution_count": 116,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 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_mst_tsp | 4823 ± 227 ( 4354 to 5250) | 0.009 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": [
"benchmarks([altered_dq_tsp, altered_nn_tsp, altered_mst_tsp, altered_greedy_tsp, repeated_altered_nn_tsp])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now `altered_mst_tsp` is in the middle of the pack, both in tour length and in run time.\n",
"\n",
"So why would we want to use the rather complicated minimum spanning tree algorithm, when the greedy algorithm is simpler to implement, runs faster, and produces shorter tours?\n",
"\n",
"Guaranteed Tour Length!\n",
"---\n",
"\n",
"The great thing about the minimum spanning tree algorithm is that it comes with a *guarantee*, which none of the other algorithms offer. You are guaranteed that the tour length it comes up with will be no worse than twice as long as the optimal tour. (And, with a bit more complication, you can modify it to give a guarantee of 1.5 times longer.) The guarantee works like this:\n",
"\n",
"1. The minimum spanning tree, by definition, connects all the cities with the shortest possible total edge length.\n",
"2. So if you could follow each edge in the spanning tree just once, and that formed a legal tour, then that would be guaranteed to be\n",
"a minimal tour. \n",
"3. But you can't do that in general; in general there will be places where you skip to the next city without following the spanning tree. Any such skip, however, is a straight line, and thus will be less than you would take if you went to the next city by following along the spanning tree.\n",
"4. If you did follow along the spanning tree, you would follow some edges twice, and some edges once. Hence the total length of the tour would be at most twice the spanning tree, and thus at most twice the minimal tour.\n",
"\n",
"A guarantee is great from a theoretical point of view, but in practice the greedy or nearest neighbor algorithms do just better than the minimum spanning tree, on the maps that we actually see. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Shoulders of Giants: Held-Karp Algorithm: `hk_tsp`\n",
"\n",
"\n",
"
\n",
"Held, Shareshian, Karp (Computer History Museum)\n",
"\n",
"\n",
"
\n",
"xkcd 399\n",
"\n",
"Another algorithm that shows up with a literature search is the [Held-Karp Dynamic Programming Algorithm](http://en.wikipedia.org/wiki/Held%E2%80%93Karp_algorithm), named after giants [Michael Held](http://www.computerhistory.org/collections/catalog/102650390) and [Richard Karp](http://en.wikipedia.org/wiki/Richard_M._Karp). It is an algorithm for finding optimal tours, not approximate ones, so it is not appropriate for large *n*. But even in its simplest form, without any programming tricks, it can go quite a bit further than `alltours_tsp`. That is because `alltours_tsp` is O(*n*!), while the Held-Karp algorithm is only O(*n*2 2*n*). How did Held and Karp achieve this speedup? They noticed that `alltours_tsp` wastes a lot of time with permutations that can't possibly be optimal tours. Consider the following 10-city problem, with a 6-city segment shown:"
]
},
{
"cell_type": "code",
"execution_count": 117,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_labeled_lines(cross, 'r-', [0, 4, 1, 3, 2, 9])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `alltours_tsp` would consider 4! = 24 different tours that start with those 6 cities. But that seems wasteful: there is no way that this segment could be part of an optimal tour, so why waste time on *any* continuation of it? The proof that this segment can never be part of an optimal tour comes down to two things. First, we demonstrate another tour that also starts in city 0 and ends in city 9, and along the way goes through cities 1 through 4, and is shorter:"
]
},
{
"cell_type": "code",
"execution_count": 118,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_labeled_lines(cross, [0, 1, 2, 3, 4, 9])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Second, we need this key property:\n",
"\n",
">*Given a start city A, an end city C, and a set of middle cities Bs, then out of all the possible segments that start in A, end in C, and go through all and only the cities in Bs, only the shortest of those segments could ever be part of an optimal tour. \n",
"\n",
"Of course, we don't know that the optimal tour goes through exactly those Bs cities before hitting C. But if it does, then we need only consider the permutation of Bs that leads to the shortest segment. So we can throw out the red zig-zag segment above, and keep the nice smooth blue segment.\n",
"\n",
"So far we have only been talking about segments. We know that the TSP is defined for tours, not segments. So even if we find the shortest possible segment, it might not be the shortest possible tour. But here's something we do know: a tour has to end somewhere. So just find the shortest segment from the start city, `A`, to every possible end city, `C`. That will give you *n*-2 segments. Out of those, don't choose the shortest *segment*, but rather choose the shortest *tour*.\n",
"\n",
"That gives us our algorithm:"
]
},
{
"cell_type": "code",
"execution_count": 119,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def hk_tsp(cities):\n",
" \"\"\"The H eld-Karpshortest tour of this set of cities.\n",
" For each end city C, find the shortest segment from A (the start) to C.\n",
" Out of all these shortest segments, pick the one that is the shortest tour.\"\"\"\n",
" A = first(cities)\n",
" return shortest_tour(shortest_segment(A, cities - {A, C}, C)\n",
" for C in cities if C is not A)\n",
"\n",
"# TO DO: function: shortest_segment(A, Bs, C)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now for `shortest_segment(A, Bs, C)`. It is defined to produce the shortest segment that starts in city `A`, ends in `C`, and visits some permutation of `Bs` cities in the middle. If there are no `Bs` cities, then of course the shortest segment is to go directly from `A` to `C`. If there are `Bs` cities, then one of them has to be the last `B` city visited (just before visiting `C`). So for each `B`, find the shortest segment that first goes from `A`, through all the other `Bs` cities, then to `B`, and finally to `C`. Out of all these candidate segments, return the one with the minimum segment length.\n",
"\n",
"**Note:** the decorator `@functools.lru_cache` makes this a **dynamic programming** algorithm, which is a fancy name meaning that we cache the results of sub-computations because we will re-use them multiple times."
]
},
{
"cell_type": "code",
"execution_count": 120,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"@functools.lru_cache(None)\n",
"def shortest_segment(A, Bs, C):\n",
" \"The shortest segment starting at A, going through all Bs, and ending at C.\"\n",
" if not Bs:\n",
" return [A, C]\n",
" else:\n",
" segments = [shortest_segment(A, Bs - {B}, B) + [C] \n",
" for B in Bs]\n",
" return min(segments, key=segment_length)\n",
" \n",
"def segment_length(segment):\n",
" \"The total of distances between each pair of consecutive cities in the segment.\"\n",
" # Same as tour_length, but without distance(tour[0], tour[-1])\n",
" return sum(distance(segment[i], segment[i-1]) \n",
" for i in range(1, len(segment)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That's all there is to it. Let's compare `alltours_tsp` with `hk_tsp` on 10 city tours:"
]
},
{
"cell_type": "code",
"execution_count": 121,
"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 2291.8 in 1.650 secs for alltours_tsp\n"
]
}
],
"source": [
"plot_tsp(alltours_tsp, Cities(10))"
]
},
{
"cell_type": "code",
"execution_count": 122,
"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 2291.8 in 0.037 secs for hk_tsp\n"
]
}
],
"source": [
"plot_tsp(hk_tsp, Cities(10))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We see that `hk_tsp` returns the optimal tour, and it is a lot faster. We can take `hk_tsp` into uncharted territory well beyond the reach of `alltours_tsp`:"
]
},
{
"cell_type": "code",
"execution_count": 123,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"14 city tour with length 2886.6 in 1.464 secs for hk_tsp\n"
]
}
],
"source": [
"plot_tsp(hk_tsp, Cities(14))"
]
},
{
"cell_type": "code",
"execution_count": 124,
"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": [
"16 city tour with length 2868.6 in 9.018 secs for hk_tsp\n"
]
}
],
"source": [
"plot_tsp(hk_tsp, Cities(16))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Not bad! In 11 seconds, we did what `alltours_tsp` would have taken an estimated 200 days to complete! Let's repeat the table of expected times, comparing the All Tours algorithm with the Held-Karp algorithm:\n",
"\n",
"\n",
"n | `alltours_tsp(Cities(n))` | `hk_tsp(Cities(n))`\n",
" |
---|
| expected time ≈ O(n!) | expected time ≈ O(n2 2n)\n",
" |
10 | 10! tours = 2 secs | 0.1 secs \n",
" |
11 | 2 secs × 11! / 10! ≈ 22 secs | 0.2 secs\n",
" |
12 | 2 secs × 12! / 10! ≈ 4 mins | 0.4 secs\n",
" |
14 | 2 secs × 14! / 10! ≈ 13 hours | 3 secs\n",
" |
16 | 2 secs × 16! / 10! ≈ 200 days | 162 216 tours = 11 secs\n",
" |
18 | 2 secs × 18! / 10! ≈ 112 years\n",
" | 11 secs × (18/16)2 2(18-16) ≈ 1 min\n",
" |
25 | 2 secs × 25! / 10! ≈ 270 billion years\n",
" | 11 secs × (25/16)2 2(25-16) ≈ 4 hours\n",
" |
50 | 2 secs × 50! / 10! ≈ 5 × 1050 years | 11 secs × (50/16)2 2(50-16) ≈ 58,000 years\n",
" |
\n",
"\n",
"So if we had some patience, we could find the optimal tour for a 25 city map, but we still can't handle the 50-city landmarks map.\n",
"(There are refinements to Held-Karp that can handle 50-city maps, and could do it even with 1960s-era computing power.)\n",
"\n",
"We're starting to run out of tricks, but we have one more general strategy to consider."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Ensembles of Other Algorithms: `ensemble_tsp`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When we have several optimization algorithms and we're not sure which is best, we can always try them all and take the best result. We will define `ensemble_tsp`, to combine the algorithms we have previously developed. First, if the set of input cities is small enough, it solves the problem optimally with `hk_tsp`. If the set is too large, it tries a selection of algorithms, and chooses the best resulting tour. The result is guaranteed to be as good or better than any of the component algorithms; but the run time is guaranteed to be longer than any of the component algorithms."
]
},
{
"cell_type": "code",
"execution_count": 125,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"ensemble = [altered_dq_tsp, altered_greedy_tsp, altered_mst_tsp, repeated_altered_nn_tsp]\n",
"\n",
"def ensemble_tsp(cities, threshold=16, algorithms=ensemble): \n",
" \"Apply all algorithms to cities and take the shortest resulting tour.\"\n",
" if len(cities) <= threshold:\n",
" return hk_tsp(cities)\n",
" else:\n",
" return shortest_tour(tsp(cities) for tsp in algorithms)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's go to the benchmarks:"
]
},
{
"cell_type": "code",
"execution_count": 126,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" altered_dq_tsp | 4953 ± 221 ( 4575 to 5399) | 0.049 secs/map | 30 ⨉ 60-city maps\n",
" altered_greedy_tsp | 4766 ± 207 ( 4320 to 5185) | 0.009 secs/map | 30 ⨉ 60-city maps\n",
" altered_mst_tsp | 4823 ± 227 ( 4354 to 5250) | 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",
" ensemble_tsp | 4630 ± 187 ( 4298 to 4991) | 0.213 secs/map | 30 ⨉ 60-city maps\n"
]
}
],
"source": [
"benchmarks(ensemble + [ensemble_tsp])"
]
},
{
"cell_type": "code",
"execution_count": 127,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" altered_dq_tsp | 6771 ± 220 ( 6273 to 7248) | 0.347 secs/map | 30 ⨉ 120-city maps\n",
" altered_greedy_tsp | 6539 ± 240 ( 5994 to 7203) | 0.037 secs/map | 30 ⨉ 120-city maps\n",
" altered_mst_tsp | 6616 ± 213 ( 6268 to 7010) | 0.050 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",
" ensemble_tsp | 6390 ± 184 ( 6015 to 6779) | 1.100 secs/map | 30 ⨉ 120-city maps\n"
]
}
],
"source": [
"benchmarks(ensemble + [ensemble_tsp], Maps(30, 120))"
]
},
{
"cell_type": "code",
"execution_count": 128,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" altered_dq_tsp | 9750 ± 288 ( 9187 to 10167) | 3.052 secs/map | 10 ⨉ 250-city maps\n",
" altered_greedy_tsp | 9229 ± 261 ( 8723 to 9606) | 0.215 secs/map | 10 ⨉ 250-city maps\n",
" altered_mst_tsp | 9484 ± 142 ( 9190 to 9668) | 0.221 secs/map | 10 ⨉ 250-city maps\n",
" repeated_altered_nn_tsp | 9187 ± 194 ( 8785 to 9390) | 3.524 secs/map | 10 ⨉ 250-city maps\n",
" ensemble_tsp | 9153 ± 216 ( 8723 to 9390) | 6.959 secs/map | 10 ⨉ 250-city maps\n"
]
}
],
"source": [
"benchmarks(ensemble + [ensemble_tsp], Maps(10, 250))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So the `ensemble_tsp` returns tours that are shortest, but the run time is slowest, as expected. It improves on `repeated_altered_nn_tsp` by less than 1%."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Further Explorations\n",
"\n",
"\n",
"That's all I'm going to write for now. But there are still plenty of open questions for you to explore:\n",
"\n",
"* **Branch and Cut**: this is a technique to cut off a search early, when a partial solution is obviously not optimal. We saw how Held-Karp cuts off some permutations of cities when another permutation is better. A refinement on that is to keep track of, say, the best total length of the segment going through all the Bs cities. Then, any time you have a partial segment through some of the Bs cities that exceeds the best total, we can stop right there, before even finishing all the Bs. With this technique, you can find optimal tours for around 50 cities.\n",
"* **Linear programming**: Lookup the topic \"linear programming\" and see how it applies to TSP.\n",
"* **Heuristic Algorithms**: There are many approaches for using heurisitic estimates to find good (but not optimal) tours. For example, *ant colony optimization algorithms* make random choices of which edge to follow, and then the edges that occur in the best tours get reinforced with some virtual pheromones, and other ants tend to follow those pheromones. *Simulated annealing* takes its inspiration from metallurgy.\n",
"* The **[Lin-Kernighan heuristic](http://akira.ruc.dk/~keld/research/LKH/LKH-1.3/DOC/LKH_REPORT.pdf)** is one of the best.\n",
"* The **[Christofides algorithm](https://en.wikipedia.org/wiki/Christofides_algorithm)** gives a guarantee of 3/2 the optimal tour length (improving on the minimum-spanning-tree guarantee).\n",
"* `altered` as a function: we defined a lot of one-line functions that just called another algorithm, and then calls `alter_tour` on the result. Can you write a function, `altered(func)`, which takes a TSP algorithm as argument, and returns a TSP algorithm that does the original algorithm and then calls `alter_tour`?\n",
"* Why does `mst` produce an optimal result, while `greedy_tsp` does not, even though the two algorithms have similar structure in the way they iterate over `shortest_edges_first`?\n",
"* The code in this notebook was designed for clarity, not efficiency. Can you make the code faster?\n",
"* [William Cook](http://www.math.uwaterloo.ca/tsp/) maintains a great page on the TSP.\n",
"* William Cook also has a [draft chapter](http://www.math.uwaterloo.ca/~bico/papers/comp_chapter1.pdf) on Discrete Optimization featuring TSP. His algorithms are in C, and he chooses a different set of algorithms to explore. I find his explanation very beautiful and concise.\n",
"* If you are heavily into math, there's a [taxonomy](http://cstheory.stackexchange.com/questions/9241/approximation-algorithms-for-metric-tsp) of solutions.\n",
"* What else are you interested in?"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}