{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "In this short post, we will explore a problem recently submitted to me by one of my roommates, and an approximate solution to this problem.\n", "\n", "The problem is as follows: given a set of $n$ points, can you find $k$ points among them that are chosen such that they are farthest apart from each other? \n", "\n", "This is a very general problem, to which a short search I did not find any \"optimal\" or classical solution, although there must exist some. Instead, we will implement the algorithm that my roommate has come up with to find an approximate solution.\n", "\n", "We will follow the advice of Peter Norvig (from his wonderful post on the [travelling salesman problem](http://nbviewer.ipython.org/url/norvig.com/ipython/TSPv3.ipynb)):\n", "\n", ">In general our design philosophy is to first write an English description of the algorithm, then write Python code that closely mirrors the English description. This will probably require some auxilliary functions and data structures; just assume they exist; put them on a TO DO list, and eventually define them with the same design philosophy." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will consider the problem in the frame of points in the 2D plane and found in the range $[-1, 1]^2$. We will represent these points using the complex number type available in Python (inspired by Peter Norvig).\n", "\n", "Our first requirement will be to plot a list of points. We can write the following function for this." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def plot_points(points, ax=None, style={'marker': 'o', 'color':'b'}, label=False):\n", " \"\"\"plots a set of points, with optional arguments for axes and style\"\"\"\n", " if ax==None:\n", " ax = plt.gca()\n", " for ind, p in enumerate(points):\n", " ax.plot(p.real, p.imag, **style)\n", " if label:\n", " ax.text(p.real, p.imag, s=ind, horizontalalignment='center', verticalalignment='center')\n", " ax.set_xlim(-1.1, 1.1)\n", " ax.set_ylim(-1.1, 1.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will examine two types of datasets:\n", "\n", "- points distributed on a unit circle\n", "- points distributed randomly in the [-1, 1]^2 interval\n", "\n", "We write functions for both datasets below:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import math\n", "import random" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def create_circle_points(n):\n", " \"\"\"creates a list of n points on a circle of radius one\"\"\"\n", " return [math.cos(2 * math.pi * i / float(n)) + \\\n", " 1j * math.sin(2 * math.pi * i / float(n)) for i in range(n)]" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def create_point_cloud(n):\n", " return [2 * random.random() - 1 + 1j * (2 * random.random() - 1) for _ in range(n)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's test these two datasets with our plotting function:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(5, 5))\n", "circle100 = create_circle_points(100)\n", "plot_points(circle100)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(5, 5))\n", "cloud100 = create_point_cloud(100)\n", "plot_points(cloud100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we will turn to our problem: can we find $k$ points that are as far possible apart from each other?\n", "\n", "Our approximate algorithm will work as follows:\n", "\n", "- choose one point at random as a starting point\n", "- add the farthest point from the remaining points to the solution set\n", "- do this until we have reached $k$ points in the solution set" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def incremental_farthest_search(points, k):\n", " remaining_points = points[:]\n", " solution_set = []\n", " solution_set.append(remaining_points.pop(\\\n", " random.randint(0, len(remaining_points) - 1)))\n", " for _ in range(k-1):\n", " distances = [distance(p, solution_set[0]) for p in remaining_points]\n", " for i, p in enumerate(remaining_points):\n", " for j, s in enumerate(solution_set):\n", " distances[i] = min(distances[i], distance(p, s))\n", " solution_set.append(remaining_points.pop(distances.index(max(distances))))\n", " return solution_set\n", "\n", "#TODO: function distance" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now define a distance function (the absolute value of the difference of two complex numbers returns the distance between them)." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def distance(A, B):\n", " return abs(A - B)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's run the algorithm:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(-0.30901699437494756-0.9510565162951535j),\n", " (0.30901699437494745+0.9510565162951535j)]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "incremental_farthest_search(circle100, 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot the result of the algorithm." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nf77GtdMh1oioAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(5, 5))\n", "plot_points(circle100)\n", "plot_points(incremental_farthest_search(circle100, 2), style={'marker': 'o', 'color':'r', 'markersize': 12})" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(5, 5))\n", "plot_points(circle100)\n", "plot_points(incremental_farthest_search(circle100, 5), style={'marker': 'o', 'color':'r', 'markersize': 12})" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAU4AAAEyCAYAAACVsznTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzt3X10HNd53/HvsyRFAtBJREq0LUvi\nixPFsewkcgTCaXLqRLQdy6IFKIcvpkAbcCKXx85bk9BtpDKtc5TwVHbCYzetT2PGdUyKIPVKF2Ak\nVUcSxbZ/hAThRtabj0yaEiWWisVEdlISkAQST/+YgThY7MssdnZ3Zvb3OWfO7s7c3XsHu/fBzL13\n7pi7IyIi8RVaXQARkaxR4BQRqZECp4hIjRQ4RURqpMApIlIjBU4RkRopcIqI1EiBU0SkRgqcIiI1\nmt/qAszFZZdd5itWrGh1MUQkZ7797W//g7svrZYuk4FzxYoVjI2NtboYIpIzZnYiTjqdqouI1EiB\nU0SkRgqcIiI1UuAUEamRAqeISI0UOCVb3OHwYVi/Hrq6oFAIHjdsgNHRYLtIgylwSnZMTkJ/P6xe\nDfv2wfh4ECjHx+GBB4L1/f1BOpEGSiRwmtk3zOxVM3umzHYzs78ws2Nm9pSZ/Xxk26CZHQ2XwSTK\nIznkDgMDMDISBMqpqZnbp6bg7FkYHoaBAYZ2OytWBAekK1bA0FArCi15ldQR5zeBGyps/xhwdbhs\nBv4rgJktAb4AfADoAb5gZosTKpNk2NAQMwLf/7hjFPbvD4JmJRMTnPvWfr72mSOcOBHE2xMnYPPm\nmcGz+POLA2u17dLm3D2RBVgBPFNm29eAWyKvnwcuB24BvlYuXbnluuuuc8mv3bvdOzvdg7AXLPcX\n1vt5K8xcWWY5R8H3smHWpuXLy39+Z2ewPs52yS9gzGPEu2a1cV4BvBx5fTJcV279LGa22czGzGzs\n9OnTDSuoNE+5o7qtW2cfWN4w9SAFnyr+iJLmMcXHeXDW+pdeKv/54+PB+jjbK5Vd2kOzAqeVWOcV\n1s9e6b7D3bvdvXvp0qrX4EsKVAouQ0PB6XOp0+npABfVwURNeZdKv2xZ8Fjq86Prq22vVPZpCqw5\nF+ewNM6CTtUlotrp7vLlpc+0ly8vve0MnaXfUGY5Q9ec8k5iu071s4uYp+rNCpxrgIcJjjB/ARgN\n1y8BXgAWh8sLwJJqeSlwpsPu3UGwMAseo4GhWnAxK73drP42Ti8U/IUPbChbtnrbOCuVPc6+V/vb\nSes0NXACe4FXgEmCdspbgc8Cnw23G/BV4PvA00B35L2/ARwLl1+Pk58CZ+s1OrgUB5aH//iQe1dX\nvMDZ2el++HDV8lcKXI36pxDnbyet0/QjzmYuCpyt1/TT2akp940b3Ts6KgfNjo4g3dRUw/a9nmaI\nONuldRQ4JRHljrySOKqq+XT1zTeDoNjV5V4oOm0vFIIMNm4M0jVYpbLXezSu0/jWUeCUulUKAC1r\nx5uaCk7D16+/EEC7utw3bHAfHU0gg2TM9VRfp/GtpcApdVMFb4x6/yFJ48QNnJrko81VGm9YaTzj\npk2wYwcsXw5mweOOHcF6qazS3y7OGFKND02BONE1bYuOOJNRbyeHJE9H+a2FjjilmmqXFm7bBp2d\nM7d3dgbrpTEq/c3jXAoqzaHA2caqnRbqdLz56jmNl+ZR4GwD5drFpq/dLhZdv2kTvPhiMN3liy8q\naDZDub95te9L7Z/No8CZc5UmpNCpeLZU+r7iTDwiCYrTEJq2RZ1D8dV6aaM6GtKt3PeljrxkELNz\nyIK02dLd3e1jY2OtLkYmFApBFSpmNvvuE5Jd+p6TYWbfdvfuaul0qp4T9bRjSvap/bO5FDhzQO2Y\novbPJotzPp+2RW2cM6kdU9zV/pkE1MbZPtS+JZXo9xGf2jhzqlRbldoxpRK1fyZPgTNDyrVV3Xij\n2jGlPLV/Jk+BM0PKXav80EO6NFLKq3QZZ+nflHPf5w/D+vXQ1RUcinZ1wYYNMDpa+ry/zaiNM0PU\nViVJK/5NzWeSnQzQywgXF16f+cMqFKCjA266CXbtggULml/gBlMbZw6pLVOSNvO34+xkgD5GuJjx\n2f+Np6bg7FkYHoaBgbY+8lTgTKFyjfUakylJi/6mehill/10MV75TRMTsH8/HDnS+AKmlAJnylRq\nrNc0b5K06G9qC9vpYCLeGycmYPv2xhYuxRJp4zSzG4D/BMwDvu7udxZt/zJwffiyE3ibu18SbjtP\ncK91gJfcvbdafnlu41yxIgiWxZYvD6YYE2mYrq7ZPUXV0p8507jytEDcNs75CWQ0D/gq8BHgJHDE\nzEbc/bnpNO7++5H0vwO8P/IRE+5+bb3lyAtNVistMxHzaHOu6XMkiVP1HuCYux939zeBu4G+Culv\nAfYmkG8uqQNIWqajo7HpcySJwHkF8HLk9clw3SxmthxYCRyIrF5kZmNmdsjMbi6XiZltDtONnT59\nOoFip0NxR5AGs0vLrFkT/BBjOE+Be86uadsrjZIInFZiXbmG043A/e5+PrJuWdim0A98xcx+otQb\n3X2Hu3e7e/fSpUvrK3FKlOoI2rkTBgfVASQtsGVL7KPI11nEdra07ZVGSQTOk8BVkddXAqfKpN1I\n0Wm6u58KH48DB5nZ/plrla4E0n1+pOl6eoLB7VWC51k6GKaXI6wC2vNOm0kEziPA1Wa20swuIgiO\nI8WJzOzdwGLgbyPrFpvZwvD5ZcAvAc8Vvzev1BEkqWIWXBHU13fhUsuoQoGzdDJMH4PsInqy2W6/\n2boDp7ufA34beAT4LnCvuz9rZneYWXRo0S3A3T5z/NN7gDEz+w7wBHBntDc+79QRJKmzYAHs2QMH\nDsDatTOvVV+3jlvecZBN7OUcMy+3bLvfbJxJO9O2ZHEi41KTzO7e7d7ZOXNy2c5OTTQs6VXpN5uH\nCbOJOZGxrhxqgnJXA4GuBJJsKXf1GrTX9HSaHakJdDWQ5F1efuOaHakV3OHw7HkMv3RiA6sYpXiU\nVrs1qEt+tVtHpwJnUiYnob8fVq+GffuCMRruMD7OWh7gAKsZop/5TL71lrZrUJfcareOTgXOJLgH\n8xOOjAQBs2gew3lMcTFn6WOYnQwArquBJFfabcpDBc4kjI4G8xNWmVmmiwl62U/vO46oE0hypVKn\nUR5vBKfAmYTt22PPFHNxYYLhD25X0JTc2bRp5hVvkN+edvWqJ0HzGIrMksWedvWqN5PmMRSZJc89\n7QqcSdA8hiKz5LmnXYEzCTXMY0ihEKQXybk897QrcNZpaAhu/t9bODMV8yhy0aJg3kORnMtzT7sC\nZx2mr0Ef/vseRriJs1QJnh0d0NsLq1Y1p4AiLZbXnnYFzjpcmIjYGGQXw/Rxhi7OF/9ZC4XgHKWv\nL5jv0EpNmi+Sf+Um787aRMgKnHWI9g6eYwGb2MNqDvAAs+cx5OBB2Ls3mO9QpE3lpae97tsDt7Nl\ny4rHqRlH6OHfLr+XDS+2qFAiKTa7zlxYnyU64qxDnnsNRRohL3VGgbMO5XoNdTmlSGl5qTMKnDUo\nvgf60NDsXsOs/QBEmq1UT3vWhiepjTOm6aFH0z2C0dtfKFiKzE1W65Um+YgpixMWiKRd2uqVJvlI\nWF6GUYikSVbrVSKB08xuMLPnzeyYmd1WYvunzey0mT0ZLp+JbBs0s6PhMphEeRohzxMWiLRKVutV\n3YHTzOYBXwU+BlwD3GJm15RIeo+7XxsuXw/fuwT4AvABoAf4gpktrrdMjZCXYRQiaZLVepXEEWcP\ncMzdj7v7m8DdQF/M934UeNTdX3P3HwKPAjckUKZERHvRt26FwcHsD6MQSZNSw5MGB4P6luZe9iR6\n1a8AXo68PklwBFlsrZl9EPge8Pvu/nKZ915RKhMz2wxsBljWhOP4Ur19O3cqWIokbdOmC3UqK73s\nSRxxlpqxorirfj+wwt1/FngM2FnDe4OV7jvcvdvdu5cuXTrnwsaVl8kIRLIkK/UuicB5Ergq8vpK\n4FQ0gbv/o7u/Eb78K+C6uO9tlaz29olkWVbqXRKB8whwtZmtNLOLgI3ASDSBmV0eedkLfDd8/gjw\nq2a2OOwU+tVwXctltbdPJMuyUu/qDpzufg74bYKA913gXnd/1szuMLPeMNnvmtmzZvYd4HeBT4fv\nfQ34E4LgewS4I1zXclnt7RPJsqzUO105VMHQUNC28tJLwX+8bdvS1UAtkketrHe6cmiOiocgbdum\nCTxEmikLk4Boko+IrAyFEGkXaa2TOlWPSNuEAyLtrtl1Uqfqc5CVoRAi7SKtdVKBMyIrQyFE2kVa\n66QCZ0RWhkKItIu01kkFzoi83A9FJC/SWifbPnAW30cIdA8hkTSJDk/ati0dMye19XCktA51EJHZ\n0lRf23o4koYfiWRHM+qrhiPFkNahDiIyW5rqa1sHzrQOdRCR2dJUX9s6cKZ1qIOIzJam+trWgTOt\nQx1EZLY01de27hwSEYlS51AVxeM30zBVlYjE18o63JbjONM0HkxEatfqOtyWp+oavymSbY2qwzpV\nryBN48FEpHatrsPtETjd4fBhWL8euro45wXO0MXdbGAVo0zfyl3jN0WyodVjOvMfOCcnob8fVq+G\nfftgfJwCThfjrOMBDrCaIfr5sY5Jjd8UyYhWj+nMd+B0h4EBGBkJWpGnpmZsnscUF3OWm22YJ39u\ngE392WvvFWlHrR7TmUjgNLMbzOx5MztmZreV2P4HZvacmT1lZo+b2fLItvNm9mS4jCRRnreMjsL+\n/Re63sro9AlWPr0fjhxJNHsRaZzp6ebuuit4/alPNW9YUt2B08zmAV8FPgZcA9xiZtcUJfs7oNvd\nfxa4H/hSZNuEu18bLr31lmeG7dthYiJe2omJIL2IZMb0sKQTJ4ITzOlhSY0OnkkccfYAx9z9uLu/\nCdwN9EUTuPsT7j592HcIuDKBfKt78MFZp+dlTU0F6UUkM7ZunX1COT4erG+kJALnFcDLkdcnw3Xl\n3Ao8HHm9yMzGzOyQmd1c7k1mtjlMN3b69Ol4JYt7tDnX9CLSUq0alpRE4LQS60r2spjZJ4Fu4M8i\nq5eFA077ga+Y2U+Ueq+773D3bnfvXrp0abySdXTESzfX9CLSUq0alpRE4DwJXBV5fSVwqjiRmX0Y\n2Ar0uvsb0+vd/VT4eBw4CLw/gTIF1qwJLmSNo1AI0otIZrRqWFISgfMIcLWZrTSzi4CNwIzecTN7\nP/A1gqD5amT9YjNbGD6/DPgl4LkEyhTYsiX+UeSiRUF6EcmMVg1LqnuSD3c/Z2a/DTwCzAO+4e7P\nmtkdwJi7jxCcml8M3GdmAC+FPejvAb5mZlMEQfxOd08ucPb0wE03wfBw5fbLjg7o7YVVqxLLWkSa\nY9Mm3awtlpom+ZichIEBzn1rP/bGBPOI9LIXCsGRZm8v7NoFCxY0psAi0nBDQ0Fv+ksvBW2c27bV\nHlA1yce0BQsYWrOH1RzgftZyhi7OU+AsXby4ah0cPAh79ypoimRYs8dz5v+IE00jJ5J3SdVxHXFG\ntHoKKhFprGbX8bYInK2egkpEGmvZVU4Ph7mH9W81x52hi5GODcGcFQmfWbdF4Gz1FFQi0kCTkzzx\nzn4OsJq17KOLC1NH3jjxQDClZH9/0FGckLYInK2egkpEGiScOnLlUyN0MT5z1AxQ8Ck4ezYYkjgw\nkNiRZ1sEziSGKYhICsWcOpKJiSBdQlNH5j5wtmraKRFpghZNHZn74UgaiiSSY11d1Y82i9OfOVN2\ns4YjhTQUSSTHWjR1ZO4Dp4YiieRYi6aOzH3g1FAkkRxr0dSRuQ+cGookkmMtmjoy94ETLtwNb2oq\neFTQFMmJ6akjqwXPhKeOzH3gHBoKetYLhebdOlREmsQsmBKyry/oMS86bT9PgXMXdQbbd+0K0icg\n14FTYzhF2sCCBbBnDxw4wInutZyNXKt+H+u43g4y9PFkp47M9ThOjeEUaS/11nmN40RjOEXaTbPq\nfK4Dp8ZwirSXZtX5XAdOjeEUaS/NqvO5DpwawynSXppV53PdOSQiUoumdg6Z2Q1m9ryZHTOz20ps\nX2hm94TbD5vZisi228P1z5vZR5MoT5TGcYq0l2bU+fn1foCZzQO+CnwEOAkcMbMRd38ukuxW4Ifu\n/pNmthH4IvAJM7sG2Ai8F3gn8JiZ/ZS7n6+3XHBhHOf0rFPT4zhBp+siedSsOp/EEWcPcMzdj7v7\nm8DdQF9Rmj5gZ/j8fuBDZmbh+rvd/Q13fwE4Fn5eIrZunT1V3/h4sF5E8qdZdT6JwHkF8HLk9clw\nXck07n4O+Cfg0pjvBcDMNpvZmJmNnT59OlbBNI5TpL1kaRxnqYs/i3ucyqWJ895gpfsOd+929+6l\nS5fGKpjGcYq0lyyN4zwJXBV5fSVwqlwaM5sP/DjwWsz3zpnGcYq0lyyN4zwCXG1mK83sIoLOnpGi\nNCPAYPh8HXDAg3FQI8DGsNd9JXA1MJpAmQCN4xRpN5kax2lmNwJfAeYB33D3bWZ2BzDm7iNmtgi4\nC3g/wZHmRnc/Hr53K/AbwDng99z94Wr5aRyniDRCU8dxuvtD7v5T7v4T7r4tXPcf3H0kfP66u693\n9590957poBlu2xa+791xgmatNI5TpL1kYhxnmmkcp0h7aVadz/Ull5qPU6S9aD7OBGgcp0h7ydI4\nztRadpXTw2HuYT1nItPpj3RsgNHR4H4aIpIbWRrHmU6Tkzzxzn4OsJq17KOLcQo4XYxz48QDsHo1\n9PfD5GSrSyoiCcnSOM70cYeBAVY+NUIX48xjasbmgk/B2bMwPAwDAzryFMmJZo3jzGfgHB2F/ftn\nX+1fbGIiSHfkSHPKJSINNTQUTOjx0kvB6fm2bY0ZQZPPwLl9exAU45iYCNKLSKY183bg+RyO1NVV\n/WizOP2ZM/UXTERaJonhh+09HCnu0eZc04tI6jRz+GE+A2dHR2PTi0jqNHMayXwGzjVrggtV4ygU\ngvQikmnNnEYyn4Fzy5b4R5GLFgXpRSTTmjmNZD4DZ08P3HRT9eDZ0QG9vbBqVXPKJSINtWlT0BE0\nNRU8Nmoyn3wGTjPYtQv6+oIe86LT9vMUOHdRZ7B9164gvYhkWjOnkMxn4ARYsAD27IEDBzjRvZaz\nkWvV72Md19tBhj6+N0gnIpnWzDGckNdxnEU0vZxIviVVx9t7HGcRTS8nkm/NruNtETh1m2CRfGt2\nHW+LwKnbBIvkkDscPgzr13PslQt9GHezgVWM0tnhDavjub7n0LTpIQnNmDVFRJpgcjKYEnJkBF5/\nnflTwdSRXYyzjge4yR7iBz93Eys37AKS7wCu64jTzJaY2aNmdjR8XFwizbVm9rdm9qyZPWVmn4hs\n+6aZvWBmT4bLtfWUp5Jmje8SkQYL59tlZCSYzGdq5ny785ii08+y8juNm2+33lP124DH3f1q4PHw\ndbFxYMDd3wvcAHzFzC6JbP837n5tuDxZZ3kq0q2CRXIgBfPt1hs4+4Cd4fOdwM3FCdz9e+5+NHx+\nCngVWFpnvjVr9jgvEWmQFMy3W2/gfLu7vwIQPr6tUmIz6wEuAr4fWb0tPIX/spktrLM8ZW3dOvsf\n1Ph4sF5EMuTBB2ednpc1NRWkT1jVziEzewx4R4lNNYUcM7scuAsYdPfpvb4d+HuCYLoD+EPgjjLv\n3wxsBlg2hzEGGsspkhMpmG+3auB09w+X22ZmPzCzy939lTAwvlom3Y8BDwJ/5O6HIp/9Svj0DTP7\na+DzFcqxgyC40t3dXXNr77Jlpa8s0FhOkYzp6KjtDg8NmG+33lP1EWAwfD4IDBcnMLOLgG8Bu9z9\nvqJtl4ePRtA++kyd5SlLYzlFciIF8+3WGzjvBD5iZkeBj4SvMbNuM/t6mGYD8EHg0yWGHQ2Z2dPA\n08BlwJ/WWZ6ymjlXn4g0UArm222LST5KadZtREUkYe7Q38+5fcPMf7NC+2VHRzB15J49saeO1CQf\nFWhokkiGmbHnhl3sO9/HmXC6yBkKhaAdroHz7bZl4NTQJJFs+3dfWMAnzu9hNQe4n7VvBdBx64J1\n6+DgQdjbuPl22/JUvVAofRWWWfzhYSLSOo2qwzpVr0DTzIlkW6vrcFsGTg1NEsm2VtfhtgycGpok\nkm2trsNtGTjhwjRzd90VvP7UpzRjkkjaRWc427o1OMJsxVSRbTGRcTnTw5Kme9inhyWBjj5F0iZN\n9bUte9Wn6e6XItnRjPqqXvUYNGOSSHakqb62deBs9ZAGEYkvTfW1rQNnq4c0iEh8aaqvbR04Wz2k\nQUTiS1N9bevOIRGRKHUOzZHuhCmSLmmsk209jrNYmsaJiUh666RO1SM0rlMkXZpdJ3WqPgdpGicm\nIumtkwqcEWkaJyYi6a2TCpwRaRonJiLprZMKnBHF48QuvTS435NmThJpnuIZkAYH0zF2M0qdQ2UU\n9+ZB8J8uDV+aSF61ut7F7RyqK3Ca2RLgHmAF8CKwwd1/WCLdeYJ7pwO85O694fqVwN3AEuD/AJ9y\n9zer5duMwKkedpHma3W9a1av+m3A4+5+NfB4+LqUCXe/Nlx6I+u/CHw5fP8PgVvrLE9i0tqbJ5Jn\nWal39QbOPmBn+HwncHPcN5qZAauB++fy/kZLa2+eSJ5lpd7VGzjf7u6vAISPbyuTbpGZjZnZITOb\nDo6XAj9y93Ph65PAFXWWJzFp7c0TybOs1Luql1ya2WPAO0ps2lpDPsvc/ZSZvQs4YGZPA/9cIl3Z\nBlcz2wxsBljWhH8/0w3RW7cGpwnLlgVfnjqGRBonK/Wu6hGnu3/Y3d9XYhkGfmBmlwOEj6+W+YxT\n4eNx4CDwfuAfgEvMbDp4XwmcqlCOHe7e7e7dS5curWEX5276hm7TN4OC9E02IJJ1xZN4wMx6l7ag\nCfWfqo8Ag+HzQWC4OIGZLTazheHzy4BfAp7zoDv/CWBdpfenxfQwiRMnwP3CZAMKniJzl9V6Ve9w\npEuBe4FlwEvAend/zcy6gc+6+2fM7BeBrwFTBIH6K+7+38L3v4sLw5H+Dviku79RLd9WzMfZ6mES\nInmUtnrVlHGcrdKKwFkoBP8Ri5kFpxQiUru01SvNjpSwrAyTEMmSrNYrBc6YsjJMQiRLslqvFDhj\nStONokTyIqv1SoGzBsXDkzZtSuf9UETSLIvDj4rpnkN1SOv9UETSKi91Rr3qdUjbUAqRtEt7nVGv\nehNkZSYXkaZzh8OHYf166OoKzsu7uvjSiQ2sYpTiq6uzVmcUOOuQ1aEUIg01OQn9/bB6NezbF5yX\nu8P4OGt5gAOsZoh+5jP51luyVmcUOOuQ1aEUIg3jDgMDMDISBMyiUezzmOJiztLHMDsZADyTdUaB\nsw7lhlKAetqlTY2Owv79M+99UUIXE/Syn953HMnE8KNiCpx1KjWDUhYnLRBJxPbtMDERK+nFhQmG\nP7g9c0ET1KueuLT3Goo0VFdX1aPNWenPnGlceWqkXvUWUU+7tLWYR5tzTp8SCpwJU0+7tLWOjsam\nTwkFzoSV62m/8UZ1GEm+DQ3B37CG83HDSqEAa9Y0tlANosCZsFI97YODsHOnOowkv6YvpfyT8S1M\nEPMoctEi2LKlsQVrEHUONYE6jCTvLvzGnSH66WOYLiq0X3Z0QF8f7NkTHGGkhDqHUkQdRpJ3F37L\nxiC7GKaPM3TNPm0vFIK2q74+2LUrVUGzFgqcTaAOI8m76G/5HAvYxB5Wc4CHO9fOuFaddevg4EHY\nuxcWLGhZeeulwNkEujRT8m72b9x4trOHf9pxbzBO8/z54PGee2DVqlYVMzEKnE1QaZZrTYQsWVPq\nN5vVmdznSp1DLVQ8qSsE/7Xz/IOTbMv7b7YpnUNmtsTMHjWzo+Hj4hJprjezJyPL62Z2c7jtm2b2\nQmTbtfWUJ2u2bi2+Os153/hhLvlXM+cwZMOGYPKEDP6Tk3yZ/ZsNXm/d2prytEpdR5xm9iXgNXe/\n08xuAxa7+x9WSL8EOAZc6e7jZvZN4G/c/f5a8s3LEWf0ntLzmWQnA/QyQgevM4+pmQk7OuCmm4Ke\nyAw3qku2pe0+6Elr1nCkPmBn+HwncHOV9OuAh929hlkA8utCT6SzkwH6GOFixmcGTQh+kWfPwvBw\nMNehjjylRTRCJFBv4Hy7u78CED6+rUr6jcDeonXbzOwpM/uymS2sszyZMt0T2cMoveyniyr/TyYm\ngrkOjxxpTgGlrZXqBNIIkUDVwGlmj5nZMyWWvloyMrPLgZ8BHomsvh34aWAVsASodJq/2czGzGzs\n9OnTtWSdWtM9kf++czsdla6yiJqYCOY8FGmg6U6g4suEob16z8upt43zeeBX3P2VMDAedPd3l0n7\nr4H3uvvmMtt/Bfi8u3+8Wr55aeN8S8bnMJT8adfLhJvVxjkCDIbPB4HhCmlvoeg0PQy2mJkRtI8+\nU2d5sqlN5jCU7NBlwpXVGzjvBD5iZkeBj4SvMbNuM/v6dCIzWwFcBfzPovcPmdnTwNPAZcCf1lme\nbGqTOQwlO9QJVFldgdPd/9HdP+TuV4ePr4Xrx9z9M5F0L7r7Fe4+VfT+1e7+M+7+Pnf/pLu35/nn\nmjVBC3wMU1Zgv6/RlUaSGHUC1U6XXKbBli2xjyInfBF/Mr5F83pKItQJNDe65DIN3KG/PxinWaH9\nctw6+O/exyb2ABem48p7g700Trt2ApWj+TizxCy4Iqiv78KlllHhHIbD3scgu4gGTVCDvcydOoHm\nRoEzLRYsCGbDPnAA1paew/D25Xs5x+zLLZct0yxLUlm534c6gebI3TO3XHfddd6Odu927+x0D87t\ng6Wz0/1znyu9fvfuVpdY0qDc72b37srb2hEw5jFikI44M6TcnIcPPaQZa6S8SjMatds8mklR51AO\n5H3GGqmPfh/xqXOojVRrp1L7Z3tQO2bzKHDmQKXByuXG6Sl45kul71mD2RsgTkNo2pZ27RyqZPdu\n9+XL3c2Cx+nG/eXLZzb8Ty/Ll7eurJK8at9zud+HzETMziG1ceac2rfag77nZKiNUwC1f+aN2jHT\nQYEz59T+mR9qx0yROOfzaVvUxlkbtX/mg9oxGw8NgJdpmzYFEzZMTQWP04Ob41ynrFP55iv3N6/2\nfZX7niV581tdAGmdZctKz4zXQ7N2AAAJAUlEQVQTbf/cvPnCVSfRKcdUKRuj0t+82vclzaMjzjZW\nrV2s0qV6oKPRepT721X6m6sdM0XinM+nbVEbZ3IqtYuZlW5TM9PkEPWo9Ler9Deffq/aMRsHjeOU\nelWa5BZyOgGuO4yOwp//eTB7ysREMDv/mjXw+c/DqlXB4Mg6tOXfNSM0jlPqVunUMJcdS5OTwUz8\nq1fDvn3BObJ78PjAA8H6/v4gXRWV9r3S306n4xkR57A0bYtO1ZtnrkOZ4pzKp+q0c2rKfePG2YUu\nXjo63Ddu9N13TZUte7V917Ci9CLmqXrLg+BcFgXO1ksiOFR6f9ODx6FD7l1dlYNmuEwu7PJ/ufBw\nw/ZdWqcpgRNYDzwLTAHdFdLdADwPHANui6xfCRwGjgL3ABfFyVeBMx3m2rHkXjm4JHG0Wuv2F3vW\nuxcKsQLnOQq+lw1lA2O1fY9TPmmNZgXO9wDvBg6WC5zAPOD7wLuAi4DvANeE2+4FNobP/xL4XJx8\nFTjTr9pRV6XgksTRaq3bz1DlFL1o+X90zemfgqRbU0/VqwTOfwE8Enl9e7gY8A/A/FLpKi0KnOlX\nz6l8PUerc91+njKZVjjq1Kl4/sQNnM3oVb8CeDny+mS47lLgR+5+rmh9SWa22czGzGzs9OnTDSus\nJKPavWwq9R5Xm+mnWo/+XLZP0FF+Z0p4vSh9tOdb9/FpA9UiK/AY8EyJpS+S5iDljzjXA1+PvP4U\n8J+BpcCxyPqrgKfjRHsdceZDuXa+ejue5rL9btb7OeK1cXqh4C98YIPaKHMInapLllXqPGlEG+cH\nFx7yyYXxetW9s9P98OFm/0mkCdIUOOcDxwl60Kc7h94bbruPmZ1DvxknPwVOSbpXffdd4TjOjo7K\nQTMcx+lTU83YTWmyuIGzrksuzezXIqfdPwKedPePmtk7w9PzG8N0NwJfIehh/4a7bwvXvwu4G1gC\n/B3wSXd/o1q+uuRSGmJyEgYGYP/+4FLL6D0nCgVYtAh6e2HXLliwoHXllIaJe8mlrlUXiXKHI0cq\nX6suuRU3cGo+TpEoM+jpgXvvbXVJJMU0yYeISI0UOEVEaqTAKSJSIwVOEZEaKXCKiNRIgVNEpEaZ\nHMdpZqeBEndmqegygks8W6GVebd7/u28763OP4v7vtzdl1ZLlMnAORdmNhZnYGve8m73/Nt531ud\nf573XafqIiI1UuAUEalROwXOHW2ad7vn38773ur8c7vvbdPGKSKSlHY64hQRSYQCp4hIjXITOM1s\nvZk9a2ZTZlZ2CIKZ3WBmz5vZMTO7LbJ+pZkdNrOjZnaPmV1UY/5LzOzR8P2PmtniEmmuN7MnI8vr\nZnZzuO2bZvZCZNu1SecfpjsfyWMkif2Pue/Xmtnfht/RU2b2ici2Oe17ue8ysn1huC/Hwn1bEdl2\ne7j+eTP7aNx9rTH/PzCz58L9fdzMlke2lfweEsz702Z2OpLHZyLbBsPv6qiZDdaad8z8vxzJ+3tm\n9qPItnr3/Rtm9qqZPVNmu5nZX4Rle8rMfj6yre59B5K5dUYaFlp0j/fIZ38JuC18fhvwxSrplwCv\nAZ3h628C6+rY/1j5A2fKrJ/z/sfJG/gp4Orw+TuBV4BL5rrvlb7LSJrfBP4yfL4RuCd8fk2YfiHB\nLV2+D8xrQP7XR77fz03nX+l7SDDvTwP/pczv7nj4uDh8vjjp/IvS/w7BnR/q3vfw/R8Efh54psz2\nG4GHCe5r9gvA4aT2fXrJzRGnu3/X3Z+vkqyH4M6ax939TYLbdvSZmQGrgfvDdDuBm2ssQl/4vrjv\nXwc87O7jNeaTVP5vSWD/q+bt7t9z96Ph81PAqwS3XJmrkt9lhXLdD3wo3Nc+4G53f8PdXwCOhZ+X\naP7u/kTk+z0EXFljHnPOu4KPAo+6+2vu/kPgUeCGBud/C7C3xjzKcvf/RXDQUU4fsMsDh4BLzOxy\nktl3IEen6jElco/3Mt7u7q8AhI9vq5J+I7N/TNvCU4svm9nCBuW/yIL70x+abiag/v2vad/NrIfg\nSOX7kdW17nu577JkmnDf/olgX+O8N4n8o24lOAqaVup7SDrvteHf9H4zu2qO5a4nf8LmiZXAgcjq\neva9nvIlse9Axm6dYWaPAe8osWmruw/H+YgS67zC+tj5x8g7+jmXAz8DPBJZfTvw9wQBZQfwh8Ad\nDch/mbufsuBGeQfM7Gngn0ukm7H/Ce/7XcCgu0/fDa3qvpf6qGplrpAm1vedQP5BQrNPAt3AL0dW\nz/oe3P37pd4/x7z3A3vd/Q0z+yzBkffqWspdZ/7TNgL3u/v5yLp69r2e8iWx70DGAqe7f7jOjzgJ\nXBV5fSVwimAigEvMbH54ZDK9Pnb+ZvYDM7vc3V8Jg8OrFcqxAfiWu09GPvuV8OkbZvbXwOcbkX94\nmoy7Hzezg8D7gQeosv9J5G1mPwY8CPxReAoVe99LKPddlkpz0szmAz9OcIoX571J5I+ZfZjgn8sv\ne+QOrmW+h7jBo2re7v6PkZd/BXwx8t5fKXrvwZj5xs4/YiPwW0Vlq2ff6ylfEvseqKeRNo0LTb7H\ne+Sz/4yZHSRfqpD2EHB90brLw0cjuJXynUnnT9AgvjB8fhlwlAudY3Pe/5h5XwQ8DvxeiW0173ul\n7zKS5reY2Tl0b/j8vczsHDpO7Z1DcfKfDghXx/0eEsz78sjzXwMOhc+XAC+EZVgcPl+S9L6H6d4N\nvEh4oU0S+x75nBWU7xxaw8zOodGk9v2tPObypjQu4Y/jJPAG8APgkXD9O4GHIuluBL4X/qC3Rta/\nCxgl6Ci4b/rLrSH/S8PAcDR8XBKu7ya4x3z0C/+/QKHo/QeAp4FngN3AxUnnD/ximMd3wsdbk9j/\nmHl/EpgEnows19az76W+S4JT/N7w+aJwX46F+/auyHu3hu97HvjYHH9z1fJ/LPwtTu/vSLXvIcG8\n/yPwbJjHE8BPR977G+Hf5Bjw643Y9/D1H1P0TzChfd9LMCpjkqDO3wp8FvhsuN2Ar4Zle5rIgVQS\n++7uuuRSRKRW7darLiJSNwVOEZEaKXCKiNRIgVNEpEYKnCIiNVLgFBGpkQKniEiN/j/wmeLCAh6z\nPAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(5, 5))\n", "plot_points(circle100)\n", "plot_points(incremental_farthest_search(circle100, 10), style={'marker': 'o', 'color':'r', 'markersize': 12})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Due to the random initialization, this will return different solutions to the problem if we run it multiple times." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbcAAAGfCAYAAADcaJywAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJztvX+QXGd57/l5ejSyutuQ4LGDHWB6\nIKFyQ7G7N3g0cMNWKjGklniiGVLWKGMPkUiRq7VZKq5CqVtmVXUry642l3sR9zp7SbhOLkRajWQZ\nw96ZQWKpgNDeqt3SjMZVgDGUg6E0RmUDinwvaH6Ykaaf/eN0Sz3dfbpP9/l9zvOpOjXd57zT5zmn\n328/73me94eoKoZhGIaRJQpxG2AYhmEYQWPOzTAMw8gc5twMwzCMzGHOzTAMw8gc5twMwzCMzGHO\nzTAMw8gc5twMwzCMzGHOzTAMw8gc5twMwzCMzLEjbgPcuPPOO3VkZCRuMwzDF88888w/qupdcdtR\nx3RlpB2vmkqscxsZGWF5eTluMwzDFyKyErcNjZiujLTjVVMWljQMwzAyhzk3wzCMsFGFxUWYmoJy\nGQoF5+++fbC05Bw3AsWcm+ENE6dh9Mf16/DQQ3DfffDFL8L6uqOX9XX4whec/Q895JQzAiMQ5yYi\nnxWRn4jIt12Oi4j8pYi8ICLfEpF3BHFeozuzszAy4viikRHnvdd9NzFxRo5pKrn0pKmKcmrnftZP\nzzt6qVa3f1i1CmtrMDcH+/dbIzFIVNX3BvwW8A7g2y7H7we+DAjwLmCx22fee++9avTGiROqlYqq\niPP3kUdUSyVVRzHOtnOn6uBg932lkvP/leGqnmRa16Tpg5q3YlF1elq1Wo37NiQKYFkToik1XfWM\nX02NcUGvUe6snfpWLqsuLsZ9yYnHq6YCcW7O+RjpIMT/ADzY8P554J5On2ci7IwX0Yl405TbJmLi\n9Eu/zk1D0JSarjoShqaeZEpvUPBU+AYFnS/t0xMn4r4TycarpqLKub0B+GHD+8u1fdsQkYMisiwi\ny1euXInItOTTHPL48Ifh4EFYWXFUsbICn/mME/VoRH1GOFThoxylyIan8ltrGyz8ztHtIU0jLDxp\nCkxX7YhKU7/PGQaodi8IDFDld9bPcPCgY49rmsDwhhcP6GWjcyvzDPDfN7z/GnBvp8/Lawsziiey\nXrZVuoQjm7ZrlG+FNBuuI6+tUcJ7cutZU5pTXcWpqS16++AbFNraY5q6hVdNRTWI+zLwpob3bwRe\niujcqWF21mk91luL9dajNrUWm993QmR7+Z07nfeNfT/a7av/n9entjpFNlhf3273yopzXQAzMz19\nnOGOacoDcWtq43qRMuutH+LCBsW29pimeieqsOQ8sL/Ww+tdwE9V9eWIzp1oGsMjBw74C4OIbH9f\nKsHDD0Ol4hyrVOCzn4XPfa77vocfdv6/LjavdBLno49aqCVATFMuJElTXy+Ns+XxZ3aLAl9i3PW4\naapHvDzedduAU8DLwHWcFuWHgIeBh2vHBfg08H3gWWC022fmIXxy4kRreMTrFkXY4sQJ1YVSbwnx\nU+zzfA2lUvZDK/TfWzJwTWkOdJU4TV244HS08mDAKiXdzaKvEKlpqkFDXgrFsWVRhM2x/6GhGEXn\nlZDFOTSU7TxCv84trC1rukq8pqpVZ4hMsdjRoDUp6kmmtTJc9Z0TNE2ZcwuGatVxAHv3OjVSxPk7\nNeV0i6+N++q3RRl7Ijkgcea15WnOLTxSo6nNTUdD5bJqoSkKUig4Bk1PO+Uarq1bJ5i+NOXx9yrJ\nmHOLgnqlLZVaKu2WFHRNynqSaf2V4U3PLUpQHRhIWKsrAHGm+vp9YM4tOFJdp6pVx3lMTd3SUbms\num+f6tKSp4/we/2DbOp/Kk3r9Z2tv1c37WnScRIx5xY29SeaLs2pVYo6y7RCNd1PLj7F6aeVncj7\n4RFzbsHgJ5eW9jrkRm/3pKqzTHcf2pOCmYbMuYVND7moa5R1N4ttD2c9Pt5Ivy3P2FvdPjDn5gGX\nUNmlsSmduHtRhaoODHj9ETdNtbsnWZppyJxb2ExNtT7au2xuvQiz2qL0Sj+t8bTdM3NuXegQ2r9B\nQa9R1lmmdQebmawfQeOmqV6mAdNCwYnIJBSvmrIlb/rlzJnWGb5dGKDK73OGoaHtY2GeeCLfAzBn\nZpx7UL8nAwPd/2d9HQ4fDt82IwJUnZnw59vPmD9AldtZY5I5jrEf0JaPME1tx01TvUwDRrXq/L6l\nHHNufaLrvc3cUWKDxx+HS5ecunPpUr5FWGdm5tY9OXbMGSTbjZUVG7iaCZaWYGGhdZR1E2U2mGCB\n3Vzctr9UwjTVhnaa6nWmoV5/35KIObc+mJ2F9R5n7qjeVjThdcHrk5zI9gluDx40B5dKjh6FDW8/\nokU2+ChHGRiwp7ReqGvqVent92pdi6nXlDm3Pjh8GL6E92l1KBTYMek+rY5xi25Pcs3z+oGFKlNL\nj6H9PZzh2DF7SuuVmRko7R13Qh0e2KLAAuOp15Q5N480zle3sgKf4pD3eRd37YJDh0K1L4s0P8lV\nKq2Orc7KioUp00bPoX3ZMIfWL4cOQdHb79Wr7OJTHEq9psy5eaA+s3g9FAawxBjz7GGtm4MrFmFi\nAnbvDt/QDNL4JHfpkuPg3LAwZXroJ7Qvpd7KGw2MjcGePV0d3BpF5pjgIs7vVZo1Zc7NA4cPt8t5\nCwc4zhyTrFJuDVEWCk5MbXISjh9vnV7c6IsjR7p3OrEwZfLpJ7TPuIX2+0bE+R2anIRyuSVEuUWB\nNUrMMckBjuPMy32LNGrKnJsLzWHIdtxgkA9wkpm7z3F57IFblaZchr174fx5OHUKBgejND3TNIcq\n3aj3qExbazPLWGg/ZgYH4eRJOHcOHtj+e/XDd+7lwbvP8wE5xQ3a/16lLkzpZTBcHFucg029Di6u\nVGIz0ahRqSR7UC82iFtV3TRVnxKq86TcaZgSKkt001TcuvKqKXtya0P7MOR2SiUnRGbES7cwZRrD\nKVnEQvvpISuhf3NubXjxRfdjNsYmWTSGKd3o9H0a0eD2HVhoP3l4Df0nXVfm3Go05gPchoNUKjbG\nJonUe1S6Obj6d5qaXEFG8KwpFeZeHqOy+BSsrsLWlvP39GnrZRwTjb2U3XSlmmxNmXOjtav/1lZr\nGQtDJh+3cMrWVrq7NKcR01R26BSmTLKmzLnhnmOzqX7ShZfpu9KQK8gCpqns0C30n1RNibpN+RAz\no6Ojury8HMm5CoX2M1+IeJ4dyEggSfheReQZVR2N5mzdiUpXSbj3RvAk4Xv1qqlcP7nVcwJu/n14\nOFJzjIBx+/6SnitIM6apbJMmTeXWuTXmBNph+YD0k9ZcQVoxTWUfd00pr19ZpLh/ihu3NfR43bfP\nWdoojgihl8FwcWxhDzbtNFAx60vT54kTJ7p/12FCjgZxm6byQbOmdrCps0zrNUqtq30XCqrlsjMI\nf3MzkPN71VRuc25JiB0b0RHX952nnJtpKl8437cyy0NMMk+ZDjNfFIvOYPyTJ30PxrecmwuWE8gn\nbt+rjYHzj2kqnwwPwxhLTLDQ2bGBsyjtwgJcvNi5XIDkyrlZTiC/tM8VKPduLfKkTvHcSpkHP1Bw\n8gVx5glShmkqvxw5Av+icJQiHtfl29hwVl+PCi+xyzi2MHIDlhPIN/VcgYjqbYVo8gRkPOdmmso3\n13d6mGG+cSuXfZ/Tq6Z2ROdG48dtLjQRZ6oZI9vMzNQGDatyqrCfCbc8QbUKa2swNwf79weSJ8gq\npql8s+N6b6ups9FjeR/kIixpOQFjG0tLTEoy8wRpwTRlAF1X9vZd3geZd26WEzBaOHqUXUnNE6QA\n05Rxk/Fx91mxm6hKtKupB+LcROR9IvK8iLwgIo+1Of5BEbkiIt+obX8SxHm90GltNpvfLqecOUNB\nPfZNr1bhzJlw7WmDacpIBYcOeX4ae5VoV1P3nXMTkQHg08DvApeBiyIyr6rfaSp6WlU/4vd8vWI5\nAaOFXuP+EeYJwDRlpIixMdizx8lPd9DJGkXmdYIHI1zCKIgntzHgBVX9gapuAk8CkwF8rm9mZ92f\nmC0nkGMSnCeoYZoy0oGIs0r65OSthWYb2KLAGiXmmGQ/xxl5s0Q2njQI5/YG4IcN7y/X9jXzgIh8\nS0SeFpE3tfsgETkoIssisnzlyhVfRtXzAraOlNFCD3mCLQpcent0eYIagWkKgtOVacpoy+Cg06P4\n3Dl44AFu3FamSoFVynyevfw255nhFDcYjHRO1yCcW7s+0s19qBaAEVX9b4GvAsfafZCqPqGqo6o6\netddd/kyqtN6UpYTyDk95gkeXYkuT1AjME1BcLoyTRmuiDghyqeeYserq5w6scXbK6s8yGmW2R6K\njGr9tyCc22WgsdX4RuClxgKqelVVf157+zfAvQGctyNueYFq1USYe+p5gi4Obo0ic0yw8KPo8gQ1\nTFNGqpmZcfKvbsND3epSkATh3C4CbxWRN4vITmAamG8sICL3NLydAL4bwHnbYuNvjK70kCc4wHEK\nA9HlCWqYpoxM0GlO17A15du5qeoN4CPAV3AE9pSqPiciHxeRiVqxPxWR50Tkm8CfAh/0e9522Pgb\nwzNNeQLKZVQKrLXJE2xtRbv2m2nKyApu679FoalMLXkzMuIuwkrFudEWPjE6MTsLBw607zRRqfTe\n1T3tS96Ypgy/xKWpTDk3W0/KCIIg61HanZtpygiCODSVqem33OK7lhMwesHq0S3sXhhBEEc9yoxz\nm52F1dXW/ZYTMHrFLU+wupqvBU1NU0ZQxKGpTDi3etL76tXt+4eGbPyN0TszM069GRravv/q1Wg7\nlsSJacoIkjg0lYmcm1vSu59kpWHUCaJepTXnZpoywiBKTWXiyc1tQGAUAwWN7JLnepXnazfCI8p6\nlXrnZhO5GmER5wDUuLnjjvb7TVOGH6LUVKqdm03kaoRJnANQ42R2Fq5da90/OGiaMvwRpaZS7dxs\nIlcjTOpJ8IGB1mNRTf4aB4cPw+Zm6/7XvtY0ZfgjSk2l2rnZRK5G2MzMuA8yzWr+ye26XnklWjuM\nbBKVplLt3GyAqREFeatnebteI3qiqGOpdm7339+6pILl2oygaZcnEHHqX9awgdtGFEShqdQ6t9lZ\nOHZs+3xlIs4EnRaSNIJkZsapV40NKVWn/mWpU4kN3DaiIgpNpc+5qcLiIr/4z6f4yXqZrdpy5k+y\nj1Fd4uyZZA5KN9LN2bOtE79mplNJB03tZonby2qOzQicsDWVrhlKrl+H/fthfp6t9VcZ4FZWcosC\nGxRZYA8Pbh53+i0bRkD0O6t54mcoMU0ZMRG2ptLz5KZ6U4Ssr28TIcAAVW5njUmZc8ol1Gkb6SST\nnSxMU0aMhK2p9Di3pSVYWGg/sK2Bkm445S5ejMgwIw9kslOJacqIkbBXCkiPczt6FDY2vJXd2HDK\nG0ZAZLJTiWnKiJGwVwpIj3M7c8b7kq3VqlPeMAIkc51KTFNGzMzMwO23t+4PQlfpcW5eW5j9ljeM\nLmRupnzTlJEAwtJVepxbsRhuecPoQuY6lZimjAQQlq7S49zGx93XtmmmUHDKG0aAZK5TiWnKSABH\njsDOndv37dzpf0ac9Di3Q4e8txx37XLKG0aAZK5TiWnKSAjNuewgRp2kx7mNjcGePaxLFzEWizAx\nAbt3R2OXkSsy1anENGUkgMOHnbkEGrl+PU8dSkTg+HHmdJJVnCmCGtmi4MSMJifh+PHWGZUNIwAy\n1anENGUkAOtQAjA4yMeGT3If53iaB24KcpUyZ0t74fx5OHXKpgkyQiNznUpMU0bMWIeSGkf+d+Eb\ng2NM8xSvYZUdbHHH4Co/e+K0hU2M0MlcpxJMU0a8hKWp1Dk3aI2OWLTEiIrMdSqpYZoy4iIsTaVr\nVQBgZARWVlrLVypw6VLoZhlGT3Uw8asCYJoy4icMTaXuyS1TCX0jlWStDmbteoz0EUYdDMS5icj7\nROR5EXlBRB5rc/w2ETldO74oIiP9nitzCX0jdURRB01TRp4Iow76dm4iMgB8Gvg94G3AgyLytqZi\nHwL+i6r+KvBvgU/0e74jR1o7bg0O+h/NbhheCWtGhTqmKSNvhKGpIJ7cxoAXVPUHqroJPAlMNpWZ\nBI7VXj8NvEek/5S1Jb+NuAljRoUGTFNG7ghaU0E4tzcAP2x4f7m2r20ZVb0B/BRoWsXHG4cPw+bm\n9n2bmymdIcJIJWHNqNCAacrIFWFoKgjn1q6N1+xzvZRBRA6KyLKILF+5cqXtySz5bcRNBHUwME1B\nd12Zpoy4SWqHksvAmxrevxF4ya2MiOwAfgF4pfmDVPUJVR1V1dG77rqr7cks+W3ETQR1MDBNQXdd\nmaaMuElkhxLgIvBWEXmziOwEpoH5pjLzwIHa673AOe1zgJ0lv424iaAOmqaMXBFGHdzhzyQn3i8i\nHwG+AgwAn1XV50Tk48Cyqs4D/xH4P0XkBZzW5bSfc1ry24ibMOugacrII0HXQZuhxDB6xGYoMYyA\nUIWlJc78zif57Y2zFNlggyJfYpyj/Bk/Gd7NpZXtXs6rpnw/uUWNJb+NuMlaHcza9Rgp4fp12L8f\n5ud538arDFAFoMw6e/kC45xl4cU9cP14X6tSpG76LUt+G3GTtTqYtesxUoDqTcfG+vpNx1ZngCq3\ns8akzDnl+ogwps65WfLbiJv772/NB5RK6a2DpikjcpaWYGHBWca+AyXdcMpdvNjzKVLn3MCS30YM\nqMLiIivvnOLf/HWZG+os6Pkk+xhjiQP7lZmZuI3sH9OUESlHj8LGhreyGxtO+R6xDiWG0Y2G3MDW\n+qvbQihbFNigyNdKe5j8r625AetQYhhtKJe7PrW1lF9dBWzJG8MIBo+5gfeu958biBvTlBE5Xp/a\n+i1PCp2bW5L7jjuitcPICR5zA2X6zw3EjWnKiJxiMdzypNC5tUt+A1y75m9JcsNoSwS5gbgxTRmR\nMz4OBY/up1BwyvdI6pzbzAy89rWt+20WcyMUzpyBarV7OXDKnTkTrj0hYJoyIufQIe9PY7t2OeV7\nJHXODeCVttPDWo7ACIEIcgNJwDRlRMrYGOzZ093BFYswMQG7d/d8ilQ6Nxt0akRGBLmBJGCaMiJF\nBI4fh8lJ1qXMVpMr2qLAupRgctIp18fYlFQ6tyNHnEGzjYg4g2sNI1AiyA0kAdOUETmDg8yOn2Ty\nNed4mgdYxXFyq5T5vwb28v/8+Xk4daqvqbcgpc5tZgYOHNjuzFXh2DFLgBsBE0FuIAmYpoyomZ2F\ng/+j8NWfjTHNU7yGVXawxcjQKj8/dprf+5e9hyIbSaVzAzh7tnVI0fq6JcCNgKnlBtYlvNxAUjBN\nGVFy+HD7ETa3304gs/2k1rnZwFMjEmq5gTmdvBk2aWSLghPP85EbSAqmKSNKwq5vqXVulgA3ImNw\nkI8Nn+Q+WnMDZ0t74fx5X7mBpGCaMqIk7PqWWudmCXAjSu4fF5Zle27g9aVVfvbE6VSHIhtppylw\npvSzvJsRNGGvrpFa52YJcCMqZmedetWYjxJx6l+aVwJoZmYGnngChoa27796FQ4eNF0ZwRGFplLr\n3MAS4EY0tEt8qzr1L2vMzDgJ/WZMV0aQRKGpVDs3S4AbUZC3epa36zWiJ4o6lmrnZglwIwryVs/y\ndr1G9ERRx1Lt3CwBboTN7OzNNRK3EWTiO2lYZy0jTKLSVKqdmyXAjTCZnXXq0dWr2/cPDTn1Lkud\nSRqxzlpGWESpqVQ7N7AEuBEeYc+gkGSss5YRBlFqKvXODSwBboRDnutVnq/dCI8o61UmnJtbErJQ\nsDCK0R+zs+6LAeShY4VpygiaqDWVCefm1rFka8tyb0bv1PMCW1utx7LckaQR05QRJHFoKhPOrd6x\nZGCg9ZjlCYxeccsLDAxkuyNJI6YpwzeqsLgIU1P8wR+VubbuzMf6JPvYzRKgoWpKtDlrnBBGR0d1\neXm5p/8pFFqT4OD0+qpWAzLMyDxB1iMReUZVR4OxzD+96so0ZfTF9euwfz/Mz8Orr26rLFsU2KDI\nPHv4IMfZ1N4mHPeqqUw8udWxwadGEFg9uoXdC6NnVG85tvX1llbQAFVuZ41J5vh8aX/71lMA+HJu\nInKHiPy9iHyv9vd1LuW2ROQbtW3ezzk74Tb4dGUFRkYsT2B0J+5B26YpI/UsLcHCQvvYfgNlNhjf\nWoCLF0Mxw++T22PA11T1rcDXau/bsaGq/7S2Tfg8pyv1PEGl4rwXlN26yGmmeG6lzIMfKHDjtjLs\n2+d8AQkNyRoR0ZAToFxGpcD7P1Dm01dv5QQg8kHbydaU3JLNyop1LjHacPQobGx4Krrj+oZTPgxU\nte8NeB64p/b6HuB5l3KrvX72vffeq374leFNnWVar1HSGxRUHU06W6GgWi6rTk+rbm76Oo+RUjY3\nne+/VHLqQ0P9uEFBr1HWWaZ1B5taqfR/GmBZE6Ip9amrSmW7jOqbn/tjZJBSqX1FcdvK5Z4+3qum\n/D65vV5VX645yZeBX3Ipt0tElkXkgoi83+c5u6PK//rifiaZ53bWGaAp812twtoazM05sWF7gssX\nPeQEjrGfF1cirR/J1BQ2sNvwiMentr7Le2RHtwIi8lXg7jaHeukMPKyqL4nIW4BzIvKsqn6/zbkO\nAgcBhv1krJeWmJQFSto55svGhhMbvngRxsb6P5+RLnrICUywwJ67LwLB1Y8oNVU7XyC6Gh52QpHN\n1Ad252GIhOGBYrGrtlrKh0DXJzdVfa+qvr3NNgf8WETuAaj9/YnLZ7xU+/sD4DzwGy7lnlDVUVUd\nveuuu/q8JODoUXbhsTWwEWLM10gmPeQEimzweCXY+hGlpmplAtFVa+cSZYxFTm5N8f4PODlLypbT\nzjsrbx9ny2tQsFCA8fFQ7PAblpwHDtReHwDmmguIyOtE5Lba6zuBdwPf8Xnezpw5Q0E9DsKpVuHM\nmVDNMRLGmTOeB2kNUGXk25HWj2Rqiu0Du3dwnVke4mvcxwN8kTLrCOq02L/wBbjvPnjoIWe8k5Er\nHn3xEBt4fBrbtQsOHQrFDr/O7V8Bvysi3wN+t/YeERkVkb+tlfl1YFlEvgl8HfhXqhquEBMS8zUS\nSrLrRzI1VWNmBqpbyjEsp220Z/5HY8yzh7VuDq5YhIkJ2L07FDu65tw6oapXgfe02b8M/Ent9f8H\n/Dd+ztMzCYn5GgklwfUjsZpqYOLuJSZ+tEAZy2kb25mdhcKAcGDrOMfYzwQLFNnY3gAqFJwntokJ\nOH58+8KBAZKpGUpuMj7uPv10E1sUuPT2cGK+RkIZH6cq8ecE0srjw0cpWk7baKJxcuQbDDLDSe7j\nHE/zAGs05GT37oXz5+HUKRjsbeqtXsimczt0yHNr+1V28ehKODFfI6EcOsSrCcgJpJXKt8+0hiLd\nsJx2bmidcFy4yBgzA0/xn06sItUtZ/qf06dDC0U2kk3nNjYGe/Z0dXBrFJljgoUfhX+jjQQxNsac\nxp8TSC3JzlkaMeE23rFajWeYSDadm4gTy52cdB6Dm0KUWxRYo8QckxzgOIrYPHk5YHbWmQ+xMCD8\nceE4c0yySrm123Kh4PR5n5wMNSeQWnrNQVpOO7Pc1FQheYv7ZtO5gRPLPXkSzp2DBx64OXfgGmU+\nz15+m/PMcIobODFfmycv29TzASsrTue9n1e35wRWKVOlNvdoRDmB1GI5bYNWTSVucV8vc3TFsfmd\nW9KNEyfc58izefKyi9t3PjCgKuIcP3Ei+PPS49ySYW+B6OrCBWc+QA/zBq5S0om7F/2f00gcSdeU\nr6EAaWRmxtncFmG0efKySad8gC262SP1nPbcXMd8muW0s03SNZXdsGQX3OLAqrZOVZao5wTcxhHb\nopt9YDntXJMWTeXWubVbhLGO5d+yQWNOoB2x5gPSjuW0c0mqNOUldhnHFlbOrRHLv2Wbbt9tGPmA\nZshizq0DpqlskyZN5fbJDZzc26VL7j29V1aciIuFVNJDY9dkt9aliPO92xItwWOayiZ1XaVJU7l2\nbnU6xYhVLaSSFpq7JruRlJxAljFNZYduoUhIpqbMudE5/1Znfd2ZXsZILq3T/7SSqJxAhjFNZYdu\nukqqpsy5cWudqkql82QUFlJJJt1CJuB8r5WK8z0nKXSSVUxTKUEVFhdhaupWz9dymZV37mPyniUK\noh11lWhNeUnMxbFF0aHEjU5J0/pWKkWTPDU6c+KE8110+q7i7MRAzjqUuGGaSiCbm6rT086NLxS2\nfRk3KOg1yjrLtO5gM1G68qope3Jrg4VU0kNaQyZ5wzSVMFSdhWTn550b3zTqeoAqt7PGJHMcYz+w\nPYmdBl2Zc2uDhVQSgEu4hH37+L8/vsRIRTv2iISEh0xyhmkqYSwtOQvJdklSl9lgggV2cxFIWXjf\ny+NdHFucYclmLKQSMR3CJVtS0NUu4ZK4Q5GNYGHJtpimYmZqqkVbbtsNCnqKfanTlD25ecBCKhHS\nJVxS0CrlDuESSEfIJO+YpmLmzBnPE0AOUGUPZ1KnKXNuHrCQSoT0GS6BlIVMco5pKl50vbcFZEuy\nkTpNmXPzSH3mhWrVEaQbagNU/XH0qOeVm4ts8FGOAs53Uq0mb5YEwx3TVDzMzsJ6t1Xom5BS+hac\nNefWBxZSCZEewyW/zxkLQ2YA01R0HD4MX2K8dQV6NwoFZ4HalGHOrQ8spBIePYdL2LAwZAYwTYVH\n43yr9ckOPsUhNrw+ve3aBYcOhWliKJhz6xMLqQRPP+GSQrloji0jmKaCp3m+1ZUVp/GwxBjz7GGt\nm96KRZiYgN3pW3DWnFsAeA2pPPro9haUCXN7q/LAgXyES4zumKb6p1lTzX2zVEFEOMBx5phklXKr\n5goF5wuYnHQWpu30OJ1UvIwXiGNLyngcr9TXsRLxNHTExvFo+6mzxrig1yh7v4GLi3FfRkewcW59\nY5rqHS/T0TWOBRWqOnH3ol4am1Itl52xb+Wy6r59qktLcV9OW7xqKnaxuW1pEmEzXgao1rehoVsC\nblnsr1pVvXBBde9ep8aKOH+nppwf9Wo1ngvsk8Yfq0rFufbWe1LVWaZ1lWLnG1csOgO9E34PzLkF\nQ2CayhjeNNXesaUVc24x0ksm4zwXAAAgAElEQVTrybXl2WGWjputq+lpp1wU+HS0vdyTHWzqLNN6\njbLeoM21l0rRXrsPzLkFQyCaciOljch+70nan27NucVMvy0qUB0oVPUk07omXWpuVE8vfThaX9c/\nkM5wSTvMuQWH7zrV7kkuaY3IDoRy/SnEnFvC6KWV1VPeqVwON+9Urd4Sfwc71qSoJ5nWynBVH3kk\nxFZ2yjDnFh5+nlweeUS1MpywRmTTtTU6MtPULcy5JRCvLa8nmWoNx7lsNyjofGlfeJX3wgXHgXqw\n5Rpl3c1iTx0Asp4fMecWLv0+zYgkpxHpxZGZpm4RiXMDpoDngCow2qHc+4DngReAx7x8dtZE2A63\nlucqvTXRrlG+1RqtbK/UzcLpdd9CqTdHe4p9uW1RtqNX5xampjQHuurlaa7fRqRfTQXpyExT4Tm3\nXwd+DTjvJkRgAPg+8BZgJ/BN4G3dPjvrIqzTWNkHBpxvZIveavcNCm1FMTiounOnv339ONq8tijb\n0YdzC01TmhNdtdNUu62fuh2EpoJyZKapzpuvQdyq+l1Vfb5LsTHgBVX9gapuAk8Ck37OmyUaZ2U4\ndswZN+l5Wpwa9fLO794trl+HzU1/+4r0Nh1WvXzzmM9SCR5//Na12gTH7TFN+aedphqp181+6nYQ\nmmqkWbOdME31RhQzlLwB+GHD+8u1fS2IyEERWRaR5StXrkRgWrKoz6/39ZL3WTq2KPAlwpulox9H\nWyrBww/fmifQlqEJHM+agnzrqnnOykrFqZt+GpFR0M6RmaZ6Y0e3AiLyVeDuNocOq+qch3O0m7el\nbXtFVZ8AngAYHR3toU2THWZmgF89BO85C2trXcu/yi4+xSFEemsFeuVLjLOXLzBA95n6tyjw9dK4\nia4LUWoKTFczM6318d3vhq8fHOf31r3X7bAakc3aLZWcabPOnoUXX4ThYWc6MtNUb3R1bqr6Xp/n\nuAy8qeH9G4GXfH5mthkbgz17YG6u49pm61JkXif4yfBuHh53QjCN88gNDjrCaQyF9LrvU5uHGOcs\nt9Pd0Q6UdrHn64ecoJnhimkqfvptRAahqcZ95sjCI4qw5EXgrSLyZhHZCUwD8xGcN72IOJOVTk5C\nuexMYtpIbVLT0h9O8uDmcS6tCH/1V63hl899Dj77WX/7fjw8xgJ7WJfszh6eQkxTQVBvRBY71+11\nKTKP04gMQlPNocW/+ivLm4WCl14nbhvwBzityJ8DPwa+Utv/y8DZhnL3A/+A08PrsJfPzkOvrq5U\nq87YmqmYZ+moz+JQt6Gxu1bKpsOKGnrvLRmaptR01YrV7dThVVOiYSRqAmB0dFSXl5fjNsOoowoX\nL8InP+nEUDY2nBbv+Dj82Z/ZE5sLIvKMqo7GbUcd01UbrG6nCq+a6ppzMwzAiaOMjcFTT8VtiWEE\ni9XtTGKLlRqGYRiZI7FhSRG5Aqx0KXYn8I8RmNMvZp9/km5jN/sqqnpXVMZ0w4Ou0n6/4ybp9kHy\nbQxEU4l1bl4QkeUk5TOaMfv8k3Qbk25fryT9esw+/yTdxqDss7CkYRiGkTnMuRmGYRiZI+3O7Ym4\nDeiC2eefpNuYdPt6JenXY/b5J+k2BmJfqnNuhmEYhtGOtD+5GYZhGEYL5twMwzCMzJEq5yYiUyLy\nnIhURcS1q6iIvE9EnheRF0TksQjtu0NE/l5Evlf7+zqXclsi8o3aFvqEt93uh4jcJiKna8cXRWQk\nbJt6tO+DInKl4Z79ScT2fVZEfiIi33Y5LiLylzX7vyUi74jSPj+Ypvq2yzTlz77wNeVlAsqkbMCv\nA78GnAdGXcoM4Ewm+xZgJ/BN4G0R2fevgcdqrx8DPuFSbjXCe9b1fgAfBj5Tez0NnE6YfR8E/n2M\n9e63gHcA33Y5fj/wZZx11t4FLMZlax/XZprq3SbTlH8bQ9dUqp7cVPW7qvp8l2JjwAuq+gNV3QSe\nBCbDtw5q5zlWe30MeH9E5+2El/vRaPfTwHtEmtcCjtW+WFHV/wy80qHIJHBcHS4Avygi90RjnT9M\nU31hmvJJFJpKlXPzyBuAHza8v1zbFwWvV9WXAWp/f8ml3C4RWRaRCyIStli93I+bZVT1BvBTYChk\nu1rOXcPt+3qgFp54WkTe1OZ4nMRZ56LANLUd01T4+K5ziVsVQES+Ctzd5tBhVZ3z8hFt9gU23qGT\nfT18zLCqviQibwHOicizqvr9YCxswcv9CPWedcHLuReAU6r6cxF5GKdFfF/olnknzvvXFdNU4Jim\nwsf3/Uucc1PV9/r8iMtAYyvkjcBLPj/zJp3sE5Efi8g9qvpy7RH6Jy6f8VLt7w9E5DzwGzgx8jDw\ncj/qZS6LyA7gF+gcMgiSrvap6tWGt38DfCICu3oh1DrnF9NU4Jimwsd3nctiWPIi8FYRebOI7MRJ\n5obee6rGPHCg9voA0NIqFpHXichttdd3Au8GvhOiTV7uR6Pde4FzWsvqRkBX+5pi7RPAdyOyzSvz\nwP5aD693AT+th9IygmlqO6ap8PGvqbh6y/TZw+YPcDz6z4EfA1+p7f9l4GxTT5t/wGm5HY7QviHg\na8D3an/vqO0fBf629vo3gWdxejA9C3woArta7gfwcWCi9noX8HngBWAJeEvE32s3+/4CeK52z74O\n/JOI7TsFvAxcr9W/DwEPAw/Xjgvw6Zr9z+LS6zCJm2kqtDprmupsX+iasum3DMMwjMyRxbCkYRiG\nkXPMuRmGYRiZw5ybYRiGkTnMuRmGYRiZw5ybYRiGkTnMuRmGYRiZw5ybYRiGkTnMuRmGYRiZw5yb\nYRiGkTnMuRmGYRiZw5ybYRiGkTnMuRmGYRiZw5ybYRiGkTnMuRmGYRiZw5ybYRiGkTnMuRmGYRiZ\nw5ybYRiGkTnMuRmGYRiZY0fcBrhx55136sjISNxmGIYvnnnmmX9U1bvitqOO6cpIO141lVjnNjIy\nwvLyctxmGIYvRGQlbhsaMV0ZacerpiwsabSiCouLMDUF5TIUCs7ffftgack5bhiGd0xTkWPOzdjO\n9evw0ENw333wxS/C+rojvPV1+MIXnP0PPeSUMwyjO6apWAjEuYnIZ0XkJyLybZfjIiJ/KSIviMi3\nROQdQZzXCBhV2L8f5ucd4VWr249Xq7C2BnNzTjlrbYaGaSojmKZiI6gnt78D3tfh+O8Bb61tB4G/\nDui8RgOzszAy4kQ8Rkac973se/8vL7H65IIjwk5sbMDCAly8GPYl5Zm/wzQVO6apFKOqgWzACPBt\nl2P/AXiw4f3zwD2dPu/ee+9Vw50TJ1QrFVUR5+8jj6iWSqpO08/Zdu5UHRz0vu9JpvQGhe0HXbYb\nFHS+tE9PnIj7TiQbYFkToik1XXXENJUOvGoqqpzbG4AfNry/XNtneKC5VfjhD8PBg7Cy4qhiZQU+\n85nWxuHmZmsYv9O+3+cMAzSFTVwYoMrvrJ/h4EHHnuZWqxE6pikfmKayT1RDAaTNvpbgsogcxAmx\nMDw8HLZNqWB21hFdXWR10TWH5oMI1RfZ6Ln8+vp2e1ZWHHsBZmb822S44klTYLpqxjSVD6J6crsM\nvKnh/RuBl5oLqeoTqjqqqqN33ZWYca+R0tyifPTR1tZjWDnnDYp9lW+2Z33dsdtanqHiSVNgujJN\n5ZOonNs8sL/Ww+tdwE9V9eWIzp1oGoV3553wx3+8PTRy9ar3z5KmtvzOnTA46H3flxhny2OV2KLA\nlxh3PX716vbrsFBL4JimXDBNGUAwHUqAU8DLwHWcFuWHgIeBh2vHBfg08H3gWWC022fmIfF94kRr\nwtrrJrL9fankJMAbE+InTrQmyTvtm7z7gl6j7MmAVUq6m8UWO3q1OevJc/rsUBKGpjQHujJNmabq\nWyDOLYwtiyJsFsDQUH8idBOdb6pV1elp1WKxowFrUtSTTGtluNq2R1kv29BQCNeRIPp1bmFtWdOV\naco05bbFLja3LYsi7LfCRlpZNzcdMZbLqoWmLsyFgnMR09NOuYZrC+IHJostT3Nu4WGaMk112mIX\nm9uWdhEG2aKMvGJWq6qLi6pTU7cEWS6r7tunurTU9d/b/ej0EmoZGMhOq9OcW3CYpkxTqt41FbvY\n3La0i7DfFuXOnY5o014RvQyITewPUYCYcwsG05Rpqo45txipVLxXtKzHxxvpt+VdqcRsuA/MuQWD\naao9pin3zVYF6BXVtktXrLxzH5P3LFEQZcXjCl6lEjz+OFy65MyfeulStgdpzsxsv9bHH3fuQTdW\nVqyrc6YxTfWNH01lfgiBFw8Yx5bIFmY9MVwqtSSGb1DQa5R1lmndwWbuW5ReaWx5Dgx0b3GmLaSC\nPbl1xjQVOF40leYhBF41FbvY3LbEibDepbdLkHuVos4yrVBNbeWJC695lTSFVMy5dcA0FTq9dERJ\ni668asrCkl5ZWnKWpOiydEWZDSZYYDfO0hUiUKnAE09kOzwSBDMzzn2qVFpnhmgkFyGVPGCaCp1m\nTVUqjitrR9bC/+bcvHL0qLPmkgeKbPBRjlKp5CPuHySNOYRKpX0ZkdZpiLIgxtxhmoqE5rycm64g\nW5oy5+aVM2daV9F1YYAqezjDkSMh25RxjhxpTY6LtLY819fh8OHo7DICwjQVC+101UwWNGXOzSO6\n3tvSFSXZsJalT/IcUskDpql46CX8n2ZNmXPzwOwsrPe4dIWUeitvtCevIZWsY5qKFy/hf0i3psy5\neeDw4d6WrqBQgHH3pSuM/slLSCXrmKaSQ1Y1Zc7NhcY1oVZW4FMc8r7w4K5dcOhQqPbllV57VKat\ntZllTFPJJKthSnNubagvQ1/vkQewxBjz7GGtmxiLRZiYgN27wzc0p3gNqaQ1nJJFTFPJJothSnNu\nbTh8uN3QG+EAx5ljklXKreGUQsF5tp+chOPHOzeBjMDoFlJJYzgli5im0kNWwpTm3Go0h0zacYNB\nPsBJZu4+x+WxB7bNg8fevXD+PJw61brmvBEajSEVN9IWTskKpql0kpXQv6hb3+qYGR0d1eXl5UjO\nVQ+ZdJkogUrFeXQ3ksnIiPuPaJ1SKdqZLUTkGVUdjeZs3YlKV6ap7NBNV0nVlD254RYy2U6phA0g\nTThZCadkAdNUdkhr6N+cG/Dii+7HbB679OA1nNLp+zaCwTSVHbyE/pOoqVw7t3pOwC0ya/PYpQ8v\nvb5Uk50rSDOmqWxS11WaNJVb59bYNbkdFjJJP+7hFOX1K4sU909x47aGDgz79jkz1Sc0D510TFPZ\nJ1Wa8rIuThxb2OtOdVq23hY9zA71hRvr3+0ONnWWab1GSW+wfXFMLRRUy2VnjbHNzUDOT47WczNN\n5YO0aCq3vSULhfaNCRHPE5UbKcL5vpVZHmKSecp06O1QLDpjq06e9D22Kk+9JU1T+SLpmspdWLJb\nTmB4OFJzjIgYHoYxlphgobMIwVljbGEBLl6MxriUY5rKJ0nXVK6cm+UE8suRI/AvCkcp4nGZlY0N\nZzFNoyOmqfySdE3lKizZaTBipeJ8WdaDK7vcuK3Mjs0uLcxGymVYXfV1zqyHJU1T+SbJmtrh6ywp\nw20shojNkpAHdlzvbXFMNnosn0NMU/kmyZrKRVjScgIG4CS1wyyfI0xTBpBoTWXeuVlOwLjJ+LjT\nxcsDVbHFMd0wTRk3SbCmAnFuIvI+EXleRF4QkcfaHP+giFwRkW/Utj8J4rxe6DTHnU0BlDMOHfLc\ncnyVeBfHNE0ZqSDBmvKdcxORAeDTwO8Cl4GLIjKvqt9pKnpaVT/i93y9YjkB4yZjY7BnD8zNdYz9\nr1FkXid4MKbFMU1TRmpIsKaCeHIbA15Q1R+o6ibwJDAZwOf6ZnbW/YnZcgI5RMRZ9HJy8ta6YQ1s\nUWCNEnNMsp/jjLxZ4porzzRlpIMEayoI5/YG4IcN7y/X9jXzgIh8S0SeFpE3BXDejtTzAltbrccs\nJ5BjBgedWRLOnYMHHuDGbWWqFFilzOfZy29znhlOcYNBVlacOhSDgzNNGekhqZryMkdXpw2YAv62\n4f0fAf9HU5kh4Lba64eBcy6fdRBYBpaHh4d9zT/mNs/dwIDNcWdsp3muvHbzIvYLfcwtGaSmNEBd\nmaYMryRBU74HcYvIPwP+XFX/h9r7j9Wc5l+4lB8AXlHVX+j0uX4Hm9o8d0avhFFn+hnEHZamwJ+u\nTFNGr8SpqSDCkheBt4rIm0VkJzANzDcZc0/D2wnguwGctyNu8X/LCxhuJKjOmKaMTBBnnfHt3FT1\nBvAR4Cs4AntKVZ8TkY+LyESt2J+KyHMi8k3gT4EP+j2vG/XBpSsrrZNPW17A6ITbWlWrq9Hm3UxT\nRlaIVVNeYpdxbP2sO3XihGqptD22K3Irxmt5AaMbJ06oDg215ghKpf7qDylfz800ZfglLk1lauJk\nt0lcKxUbf2N4J8h6lPaJk01TRhDEoalMTb/lNrjUbb9htMPq0S3sXhhBEEc9yoxzs8GlRlC41ZdC\nIZYxb7FhmjKCIg5NZcK52eBSI0jckuBbW7EN6o4c05QRJHFoKhPOzW0i14EBm8TV6J2ZGafeDAy0\nHltfd+pb1jFNGUESh6Yy0aHEBpcaYRBEvUprhxLTlBEGUWoqE09uNrjUCIM816s8X7sRHlHWq9Q7\nt9lZZ0BgM5YXMPySlEHdcXD//TZg2wieKDWVaudWT3pfvbp9/9CQ5QUM/9TzBEND2/dfvZrtjiWz\ns3Ds2PbwkQgcOGCaMvwRpaZS7dzckt63324iNIJhZsapT81kuWNJO12pwtmz8dhjZIuoNJVq52YD\nTI0oyFs9y9v1GtETRR1LtXOzpLcRBXmrZ3m7XiN6oqhjqXZulvQ2oqBdElzEqX9ZwzpoGVEQhaZS\n69ws6W1ExcyMU68aG1KqTv3LUqcS66BlREUUmkqtc7OktxElZ8+2Dj7NWqcS66BlREnYmkqtc7Ok\ntxEleahvebhGIzmEXd9S69ws6W1ESR7qWx6u0UgOYde31Do360xiREkeOpWYpowoCXu2knQ5N1VY\nXGTlnVP8m78uc0MLrFLmSfYxxhIH9qvlBoxQyGynEtOUERNhz1aSnlUBrl+H/fthfp6t9VcZ4NYU\n0lsU2KDI10p7mPyvx2FwMAaLjawzMgIrK637KxW4dKn9/yR6VQDTlJEAetVVtlYFUL0pQtbXt4kQ\nYIAqt7PGe9fnnHIJddhGuslUhwvTlJEQwtJVOpzb0hIsLLTvp9xAmQ2n3MWLERlm5Am3RPcdd0Rr\nRyCYpoyEEFbHknQ4t6NHYWPDW9mNDae8YQTMkSOwc2fr/p/9LIV5N9OUkRDcOmX57ayVDud25oz3\nZVqrVae8YQTMzAy85jWt+69fT+FgbtOUkRDcJt7wOyFHOpyb1xZmv+UNwyOvvNJ+f+rybqYpIyHk\nO+dWLIZb3jA8kpmBzqYpIyHkO+c2Pg4Fj6YWCk55wwiBzAzmNk0ZCSEsTaXDuR065L3luGuXU94w\nQiAzg7lNU0ZCCEtT6XBuY2OwZ093MRaLMDEBu3dHY5eRSzKxQoBpykgQYWgqHc5NBI4fh8lJVimz\n1WT2FgXWKMHkpFOueYI8wwiQTAzmNk0ZCSIMTaXDuYEz/c/Jk8zcfY6neeCmIFcp83n28uDd5+HU\nKZsmyAidzHQqMU0ZCSEMTQXi3ETkfSLyvIi8ICKPtTl+m4icrh1fFJGRPk/Evk+O8UeDT/EaVtnB\nFq9hlf2Dp/nDT1rYxIiGdoO5d+4MdvZ805SRJ8LQlG/nJiIDwKeB3wPeBjwoIm9rKvYh4L+o6q8C\n/xb4hL9zdn5vGGHTnB8IcupF05SRR4LWVBBPbmPAC6r6A1XdBJ4EJpvKTALHaq+fBt4j0p98Dh+G\nzc3t+zY3U5bMN1LN4cPOrCSNBDxLiWnKyBVhaCoI5/YG4IcN7y/X9rUto6o3gJ8CTav4gIgcFJFl\nEVm+cuVK25NlIplvpJoI6mBgmoLuujJNGXGT1A4l7VqLzQ+UXsqgqk+o6qiqjt51111tT5aZZL6R\nWiKog4FpCrrryjRlxE1SO5RcBt7U8P6NwEtuZURkB/ALgMssfZ05cqS189bgYLDJfMPoRAR10DRl\n5Iow6mAQzu0i8FYRebOI7ASmgfmmMvPAgdrrvcA59bEEuCW/jbgJuQ6apozcEXQd9O3cavH+jwBf\nAb4LPKWqz4nIx0VkolbsPwJDIvIC8FGgpWuzVyz5bcSGKiwu8ov/fIpXNm+NCXuSffx3m0sc/p+D\n6TJpmjJyQ4iaEh+NvVAZHR3V5eXllv2FQvsuoiLel6cyjJ65fh3274f5ebbWX2WAW5VtiwIbFFlg\nDw9uHt8WXxGRZ1R1NA6T29FOV6YpIxZC1lR6ZiipYclvI3JUb4qQ9fVtIgQYoMrtrDEpc065hDYY\n3TBNGZETgaZS59ws+W1EztISLCw4M7l2oKQbTrmLFyMyLBhMU0bkRKCp1Dk3sOS3ETFHj3pfiXpj\nwymfMkxTRqREoKnU5dxGRmBlpbV8pQKXLoVulpFHyuWuLcyW8qurQDpybqYpI3Ii0FTqntxsNgUj\ncry2MPstHzOmKSNyItBU6pybJb+NyPG6YnW/5WPGNGVETgSaSp1zO3IESqXt+0Tg/vvjscfIAePj\nTn95LxQKTvkUYZoyIicCTaXOuc3MwIED2xPeqnDsGMzOxmeXkWEOHfLecty1yymfIkxTRuREoKnU\nOTeAs2dbhz2sr9uMCkZIjI3Bnj2sSxcxFoswMQG707fIp2nKiJSapro6OB+aSqVzswS4ESkicPw4\nczrJKs4UQY1sUXDiepOTcPx4KvvRm6aMSKlpikl3Ta3hT1OpdG6WADciZ3CQjw2f5D7O8TQP3BTk\nKmXOlvbC+fNw6lTraOiUYJoyImdwEE6eZObuVk19nr08ePd5X5pKpXOzBLgRB/ePC8syxjRP8RpW\n2cEWry+t8rMnTqcyFNmIacqIg9mTwv97fbumXsMqHyqd5g8/6U9TqXRulgA3omZ21qlfjXkpEace\nzszEZ1dQmKaMqJmdhYMH4erV7fuHhuCJJ/zrKpXODSwBbkTL4cOtEyqoOvUwK5imjChppymA228P\npsGYWudmCXAjSvJQ3/JwjUZyCLu+pda5WQLciJI81Lc8XKORHMKub6l1bpYAN6Lk/vtbeyOXStla\nFqadpsCZr9bybkbQhK2p1Do3S4AbUZH1ziR1ZmacRP7Q0Pb9V686iX/TlREUUWgqtc4NLAFuREMe\nOpPUmZlxEvrNmK6MIIlCU6l2bpYAN6Igb/Usb9drRE8UdSzVzs0t8VgoWAjFCIbZWffJy7Pa0cLt\nuu64I1o7jGwSlaZS7dzcEuBbW5YjMPxTH2S6tdV6LGudSRo5cqT9jEfXrpmmDH9EqalUO7d6Anxg\noPWY5QgMv7gNMh0YCGYGhaQyMwOvfW3r/s1N05Thjyg1lWrnBs7NqFbbH7McgeEHt/pTrWbXsdV5\n5ZX2+01Thh+i1FTqnRvY4FMjHPJcr/J87UZ4RFmvMuHcbPCpETSzs079aSbLubZGTFNG0EStqUw4\nNxt8avhGFRYXYWqKG7eVefADBVaulnmSfexmCdDAZitPA6Ypwzcxa0q0eRR0QhgdHdXl5eWe/mdk\nBFZWWvdXKnDpUiBmGVnk+nXYvx/m5+HVV7clcbcosEGRefbwL4eP88JKbwsnisgzqjoatMn90quu\nTFNGXyRAUzt6tzq52OBTo2dUb4mwTTeuAarczhqTzCEv7gc92deS92nFNGX0TEI0lYmwZB23pKSq\n0wK1UIrRwtISLCy075/cQJkNJmUBLl6MyLBkYJoyeiYhmvLl3ETkDhH5exH5Xu3v61zKbYnIN2rb\nvJ9zdsItCQ5OaMVyBUYLR4/CxoanorvYcMqHiGnKSD0J0ZTfJ7fHgK+p6luBr9Xet2NDVf9pbZvw\neU5X6knwSqX9cRvYbbRw5oz7QMkmClp1yoeLacpINwnRlF/nNgkcq70+Brzf5+f5ZmbGSXS7hXAt\nV2Bsw2MLs+/yvWOaMtJNQjTl17m9XlVfBqj9/SWXcrtEZFlELohIJGK1SZUNTxSL4ZbvHdOUkW4S\noqmuzk1Evioi326zTfZwnuFa182HgH8nIr/icq6DNcEuX7lypYePb8UmVTa8sPL2cba8tvEKBRgf\n933OKDVVO18gujJNGV6IQ1NtUdW+N+B54J7a63uA5z38z98Be7uVu/fee9UvJ06oDgyoOn27qjrG\nBT3NXl2lpFuIaqmkOjWlurioWq36Pp+RPibvvqDXKNcrSeetVHLqSg8Ay5oQTWkAujJNGd1Iiqb8\nhiXngQO11weAueYCIvI6Ebmt9vpO4N3Ad3ye1xP1SZV3cJ1ZHuJr3McDfJEy6xRQJxv+hS/AfffB\nQw85Aw+NXDH/ozHm2cMaXUIjxSJMTMDu3aGbhGnKSDGJ0ZQXD+i2AUM4Pbq+V/t7R23/KPC3tde/\nCTwLfLP290NePjuIJzdV1cpwVWeZ1lVKnVsQxaLq9LS1NnNGpaK6g02dZVqvUdYbFLbXi0LBaV1O\nT6tubvb8+fT+5BaapjQgXZmmjE4kRVO+nFuYW1DO7ct/fkFXvT4il8s9PyIb6eXECdWhofrXX9Xd\nLOqTTOkqZa1KwakP+/apLi31fY5enVvYWxC6Mk0ZbiRJU5mafqsd73vuKFXZAC9TaG7UBhSePh26\nXUa81FcEvjWJgnCRMf6noae48Xg+JkfuF9OU0Y6kaSpTEye3pVzuOg1MS/l26zIYmSKqCYHTPnFy\nW0xTRhuSpqlMzS3ZloQMKDTiZ3bWEWCh0F6EYAOSPWGaMmokWVOZD0tSLPbUyrwxWMzBTckfrSGT\n9thK0x4wTRkkX1PZf3IbH3eaFR7YosCXB0IaUGjEyuHD3UWYl1W2fWOaMki+prLv3A4d8jy9y6vs\n4n9bPxSyQUYcdAqNiDh5gbyssu0b05RB8jWVfec2NgZ79nQV4xpF5phgid22TlWGqOcE3PpNVSrO\noORLl8yxecY0lWvSoqMvt9oAAAtlSURBVKnsOzcROH4cJiedXltN4ZQtCqxRYo5JDnAcEFunKiPU\ncwJuiW4LQ/aJaSq3pEpTXgbDxbEFNYj7JtWqM5h0asoZSFgo6PXbyjpf2qejLLUdf1qpBGuCES2V\nivvY4krFGXAaNmRwEPdNTFO5I02ayv44Nw8UCu0fsUU8r7lnJJAkfK+ZHOfmgSTceyN4kvC92ji3\nHui0TlWhgOULUkTjuBu3Dn3W3T98TFPZolueLYmaMudG53WqVLF8QUpozAeoOt9fM4nKCWQY01R2\nSFWerQFzbjg9ep54wunlIwIDA61l1tedcR1GcnEbdzMwkIyuyXnCNJUdOo1nS7KmzLnVmJlxuq5W\nq+6x45UVC6nEiiosLsLU1K1eeuUyK+/cx+Q9S6ystI+Z1L/TuLsm5w3TVArooqmCqOsTm0iyNWXO\nrQ2d4scWUomJ69edxS/vuw+++EWnKanO4phvXPoCsz+6j1keYgeti2MmMR+QN0xTCcSDpk64aAqS\nrytzbm1wyxc0YiGVCFGF/fthft658U2PAQNUuZ01JpnjGPtpXIslqfmAvGGaShg+NAXp0JU5tzY0\n5wvcWFmBgijvv2eRlXduf6xn3z5YWnLvXmR4Z2kJFha6TmRXZoMJFtjNRSDZ+YC8YZpKGH1qKlW5\nay+D4eLYAh/E7QO3gYu3llIvtV9KvVzueyl1o4GpKed+elj5+QYFPcW+xAwWJsuDuH1gmoqZHGjK\nntw80D6kohxjP5PMczvrDNCUMa9WYW0N5uacx39rbfbPmTOeR4gOUGUPZxIfMsk7pqmYyYGmzLl5\noF1IZYwlJligTJc1HzY2nMf/ixfDNzSDzM5Cdb23xS5LspH8kEnOMU3Fi+ZAU+bcPNLYrblSgY9y\nlCIeK8jGBhw9Gqp9WaQ+eHQDb8ur1JFSb+WNeDBNxcPsLKznQFPm3PrgyBH4fc60hk3cqFa5MXcm\nXKMyQuP0WQcOOPnuLzHOlteqWig4i2kaqcI0FR6NmhoZgUcfzYemzLn1wcwMlLy2MGsUfr5hY3i6\n4DZ91qc45P3pbdcuZzFNI1WYpsKhWVMrK3D1aj40Zc6tT3p9TF+nyKOPbm9BmTDbP6k1s8QY8+xh\nrZsYi0WYmIDdu0Ox1QgX01QwmKYczLn1y/i4+7TzTWxR4EuMc/Xq9hZU3mdk8DLRsYNwgOPMMcka\nZarSdN8LBafr3eSks4hmp4FURnIxTfmmH02tUm4NUWZBU17GC8SxJWU8jisXLjhjbjyME1mlpLtZ\nbHt4aMgZ8yMS3WJ/cXHixPZrHRrydPt0YKD2P8NV/fL/sn1xTC2XVfftU11aivvy2oKNc/OOaapn\n+tXUzXtEVSfuXtRLY9nTVOxic9sSLUJVZxXi6WnVYrGLCIs6y7RC1VOlK5WyKcYTJ5xr83IPsnQ/\nzLn1gGmqJ0xT5tzCY3PTEWO9xdNQg7akoGtS0pNM668Mb3puUW17Uql4rITVqtPq3bvXqbkizt+p\nKdXFRed4xPTbouzr+hOMObceMU25YppyMOcWFdWqU9m7hMr8tLIeeaRDmKX+Y1AqtU6nE9F0Rc2i\ne+SR/q41C63KZsy59YFpyjTVAXNuCaTflpeIS2Wth3G61fpi0SkXQmuz3Q9Ms72dtqznR8y5hYtp\nyjTltvkSCjAFPAdUgdEO5d4HPA+8ADzm5bOzJsJ29NvyrFfgybsv6DW8JeC1XHZawz3a1ywSP6GR\nrLco29GrcwtTU5oDXZmmTFP1rSdn1vLP8OvArwHn3YQIDADfB94C7AS+Cbyt22dnXYR1Giv2wEBv\nFflJplpnTnfZblDQ+dK+tmJqt69dGGRwUHXnzv6Fl/UWZTv6cG6haUpzoivTVLaJNCzZRYj/DPhK\nw/uPAR/r9pl5EGEzvYYjVumtiXqNclsxtdvXSxik3eYa9skZ/YYlw9CU5lBXpqns4VVTUQzifgPw\nw4b3l2v7jCaaZ0qvVODhh91XMPY8yWxD+evXYXNz+/52+5zfzP4olRy7G68jFYsbpgfTlEdMU/ll\nR7cCIvJV4O42hw6r6pyHc7Qb2t72axaRg8BBgOHhYQ8fnT1mZlor7LvfDYcPw4svwvAwrK4688Nt\nUOy+PEgDvc6u75WhIbj99lv2HTlioutElJqqnS/XujJN5RQvj3fdNiwsGSn1UEuv+YFT7PMVBmkX\naslraMQrWFgyFZim0oNXTUURlrwIvFVE3iwiO4FpYD6C82aWeqjl1N3eZ/Z+lV18ikMMDsLOnduP\ntdvXLgzyuc/BZz9roZEEYJoKGNNUBvHiAd024A9w4v0/B35MrTUJ/DJwtqHc/cA/4PTwOuzls62F\n6QGP0xWtSVFPMq2V4arnnl3WcgwGeu8tGZqm1HTVHdNU4vGqKXHKJo/R0VFdXl6O24zkc/067N8P\nCwvO6sTVhsUeCwVnLaaJCWdm78HB+OzMKSLyjKqOxm1HHdOVB0xTicarpmzJm7QzOAgnT8K5c/DA\nA1AuOwIsl2HvXjh/Hk6dMhEahldMU5mga29JIwWIwNgYPPVU3JYYRjYwTaUee3IzDMMwMkdic24i\ncgVY6VLsTuAfIzCnX8w+/yTdxm72VVT1rqiM6YYHXaX9fsdN0u2D5NsYiKYS69y8ICLLSUrWN2P2\n+SfpNibdvl5J+vWYff5Juo1B2WdhScMwDCNzmHMzDMMwMkfandsTcRvQBbPPP0m3Men29UrSr8fs\n80/SbQzEvlTn3AzDMAyjHWl/cjMMwzCMFlLl3ERkSkSeE5GqiLj2phGR94nI8yLygog8FqF9d4jI\n34vI92p/X+dSbktEvlHbQp/wttv9EJHbROR07fiiiIyEbVOP9n1QRK403LM/idi+z4rIT0Tk2y7H\nRUT+smb/t0TkHVHa5wfTVN92mab82Re+prxMQJmUDfh14NfovBzIAM5ksm8BdgLfBN4WkX3/Gnis\n9vox4BMu5VYjvGdd7wfwYeAztdfTwOmE2fdB4N/HWO9+C3gH8G2X4/cDX8ZZZ+1dwGJctvZxbaap\n3m0yTfm3MXRNperJTVW/q6rPdyk2Brygqj9Q1U3gSWAyfOugdp5jtdfHgPdHdN5OeLkfjXY/DbxH\nRNotiBmXfbGiqv8ZeKVDkUnguDpcAH5RRO6Jxjp/mKb6wjTlkyg0lSrn5pE3AD9seH+5ti8KXq+q\nLwPU/v6SS7ldIrIsIhdEJGyxerkfN8uo6g3gp8BQyHa1nLuG2/f1QC088bSIvCka0zwTZ52LAtPU\ndkxT4eO7ziVu4mQR+Spwd5tDh1V1zstHtNkXWJfQTvb18DHDqvqSiLwFOCciz6rq94OxsAUv9yPU\ne9YFL+deAE6p6s9F5GGcFvF9oVvmnTjvX1dMU4Fjmgof3/cvcc5NVd/r8yMuA42tkDcCL/n8zJt0\nsk9Efiwi96jqy7VH6J+4fMZLtb8/EJHzwG/gxMjDwMv9qJe5LCI7gF+gc8ggSLrap6pXG97+DfCJ\nCOzqhVDrnF9MU4Fjmgof33Uui2HJi8BbReTNIrITJ5kbeu+pGvPAgdrrA0BLq1hEXicit9Ve3wm8\nG/hOiDZ5uR+Ndu8FzmktqxsBXe1rirVPAN+NyDavzAP7az283gX8tB5Kywimqe2YpsLHv6bi6i3T\nZw+bP8Dx6D8Hfgx8pbb/l4GzTT1t/gGn5XY4QvuGgK8B36v9vaO2fxT429rr3wSexenB9CzwoQjs\narkfwMeBidrrXcDngReAJeAtEX+v3ez7C+C52j37OvBPIrbvFPAycL1W/z4EPAw8XDsuwKdr9j+L\nS6/DJG6mqdDqrGmqs32ha8pmKDEMwzAyRxbDkoZhGEbOMedmGIZhZA5zboZhGEbmMOdmGIZhZA5z\nboZhGEbmMOdmGIZhZA5zboZhGEbmMOdmGIZhZI7/H7DojOF99vjMAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(2, 2, figsize=(7, 7))\n", "for ax in axes.ravel():\n", " plot_points(circle100, ax=ax)\n", " plot_points(incremental_farthest_search(circle100, 10), \n", " ax=ax, \n", " style={'marker': 'o', 'color':'r', 'markersize': 12})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How does this extend to a point cloud?" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(5, 5))\n", "plot_points(cloud100)\n", "plot_points(incremental_farthest_search(cloud100, 5), style={'marker': 'o', 'color':'r', 'markersize': 12})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, we can see how this compares when we do it multiple times:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(2, 2, figsize=(7, 7))\n", "for ax in axes.ravel():\n", " plot_points(cloud100, ax=ax)\n", " plot_points(incremental_farthest_search(cloud100, 10), \n", " ax=ax, \n", " style={'marker': 'o', 'color':'r', 'markersize': 12})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In fact, we can compare the different solutions using an animation. Since version 2.1, `matplotlib` includes [support for javascript based frame-by-frame animations](http://matplotlib.org/users/whats_new.html#interactive-js-widgets-for-animation)." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "from IPython.display import HTML\n", "import matplotlib.animation as mpl_anim" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " Once \n", " Loop \n", " Reflect \n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fig, ax = plt.subplots(figsize=(5, 5))\n", "\n", "def init():\n", " return\n", "\n", "def animate(i):\n", " ax.cla()\n", " plot_points(cloud100, ax=ax)\n", " plot_points(incremental_farthest_search(cloud100, 5), \n", " ax=ax, \n", " style={'marker': 'o', 'color':'r', 'markersize': 12})\n", "\n", "animation = mpl_anim.FuncAnimation(fig, animate, init_func=init,\n", " frames=10, interval=100, blit=False)\n", "plt.close(fig)\n", "HTML(animation.to_jshtml())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Based on the previous implementation, we can define a criterion to distinguish between solutions and find the best among a given set of solutions. We choose the sum of the distances between the candidate solutions." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "def evaluate_solution(solution_set):\n", " return sum([distance(a, b) for a, b in zip(solution_set[:-1], solution_set[1:])])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the case of the circle, the optimal solution can be shown to be $n-1$ times the distance between two points rotated by $2 \\pi \\over n$ (in particular we pick the point with coordinates $(1, 0)$ and its rotated version):\n", "\n", "$$\n", "d_{opt} = (n-1) \\sqrt{(\\cos{\\frac{2\\pi}{n}} - 1)^2 + (\\sin{\\frac{2\\pi}{n}})^2}\n", "$$" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "def optimal_circle_solution(n):\n", " return (n-1) * math.sqrt((math.cos(2 * math.pi / n) - 1)**2 + \\\n", " math.sin(2 * math.pi / n)**2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can check that the solution is correct for test cases 2 and 4, since they are easy.\n", "\n", "Here's test case 2 points on a circle. " ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.0" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimal_circle_solution(2)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.0" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAU4AAAEyCAYAAACVsznTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzt3XuQHeV55/HvM1yEJJeNBGNbBkYC\nR2YD8a4wg+K1q2wjIGCx1pDiYmEBQ4xrCsdJNgnOGmqy9hYb1WInFCS7VGKFEAQoXIyTMFSgHG7K\npmoDaLzG3FyyhLhpJRvZgF14xFXP/tF9rJ4z59LndJ++/j5Vp8453W+ft3vOeZ/pft+nu83dERGR\n+IbyXgERkbJR4BQR6ZECp4hIjxQ4RUR6pMApItIjBU4RkR4pcIqI9EiBU0SkRwqcIiI9OjDvFejH\n4Ycf7suWLct7NUSkYr773e/+xN2Hu5UrZeBctmwZ09PTea+GiFSMmT0fp5wO1UVEeqTAKSLSIwVO\nEZEeKXCKiPRIgVNEpEcKnCIiPVLgFBHpUSqB08xuMLOXzOzJNvPNzP7CzLab2eNm9pHIvHEz2xY+\nxtNYH5FNm2DZMhgaCp43bcp7jaRK0trjvBE4o8P8TwPLw8cE8JcAZrYY+Brw68BK4GtmtiildZIS\n6xb4Os3ftAkmJuD558E9eJ6YmFum388Xwd1TeQDLgCfbzPsmcH7k/VZgCXA+8M125do9TjzxRJfq\nuuUW9wUL3IOwFzwWLAimx5m/dOnseY3H0qXpfL5UFzDtMeJdVn2cRwAvRt7vDKe1mz6HmU2Y2bSZ\nTe/Zs2dgKyrZabdXNzkJMzOzy87MBNPjzH/hhdb1NaYn/fxO6y71kFXgtBbTvMP0uRPdN7j7qLuP\nDg93PQdfCqDfw+luga/b/JGR1vMb05N+fhpdAVJycXZL4zzQobpEJDmc7naonfRQPOnnJ61fiouY\nh+pZBc4zgXsJ9jA/CjwaTl8MPAssCh/PAou71aXAWQy33BIEC7PgORoYugUXs9bzzdLpg+y0bkk/\nv9O6x9n2busn+ck0cAK3AruBtwj6KS8BLgUuDecbcB3wDPAEMBpZ9vPA9vDxW3HqU+DM36CDS7fA\nkjTwJPn8JP8U4vztJD+Z73Fm+VDgzF+dD2cH3RUg+YkbOHXmkHTUbpCj2wDK+vWwYMHseQsWBNMB\n1q2DDRtg6VIwC543bAimF123de+27XEGnzSwVHBxomvRHtrjzEanPSv143XW76F+mffEqwAdqktS\nauCDkfQfkgxO3MCpQ/Wa63RY2OmQssyH2nnr9LfTYXxJxImuRXtojzMdSQc5JH3ay88X2uOUbrqd\nWthtkEPS1+lvHudUUMmGAmeNdTss1OF49pIcxkt2FDhroF2/WLdzuiFosM89B/v2Bc8KmoPX7m/e\n7ftS/2d2FDgrrtMFKXQoXi6dvq84Fx6RFMXpCC3aQ4ND8SU9tVGKpd33pYG8dBBzcMiCsuUyOjrq\n09PTea9GKQwNBU2omVlwKCjVoO85HWb2XXcf7VZOh+oVkaQfU8pP/Z/ZUuCsAPVjivo/MxbneL5o\nD/VxzqZ+THFX/2caUB9nfah/SzrR7yM+9XFWVKu+KvVjSifq/0yfAmeJtOurWr1a/ZjSnvo/06fA\nWSLtzlW+5x6dGintdTqNU+e/90d9nCWivipJm35Ts6mPs4LUlylp02+qPwqcBdSus145mZK2bv2f\nGjRq7cC8V0Bma3TWN/qdGp31sL/PcnIyuJTYyEjwA1dfpvSr3W8Kuv8O6yyVPk4zOwP4c+AA4Hp3\nv6pp/jXAyeHbBcB73f3QcN47BPdaB3jB3dd0q6/KfZzLlgU/0mZLlwaXGBPJQl1/h3H7OBPvcZrZ\nAcB1wGnATmCLmU25+9ONMu7+B5HyvwucEPmIve6+Iul6VIUuVitFoN9hZ2n0ca4Etrv7Dnd/E7gN\nGOtQ/nzg1hTqrSR11ksR6HfYWRqB8wjgxcj7neG0OcxsKXA08GBk8iFmNm1mD5vZWe0qMbOJsNz0\nnj17UljtYmjugFcyuxSBBo06SyNwWotp7TpO1wJ3uvs7kWkjYZ/C54BrzeyDrRZ09w3uPuruo8PD\nw8nWuCBanbWxcSOMjyuZXfLVLmkedKYRpDOqvhM4KvL+SGBXm7JrgS9FJ7j7rvB5h5ltJuj/fCaF\n9SoGd3j0UfizPwtO8dm7F+bPhzPP5I5//TIzMycR/d/TOBOoyh3wUg7r1s39h71sWfszjer0zz2N\nPc4twHIzO9rMDiYIjlPNhczsWGAR8G+RaYvMbF74+nDg48DTzcuW1ltvwec+B6tWwd//ffALcw+e\nv/1tNv1oFZv4HAfy1qzF1AEvRaVBo0DiwOnubwO/A3wH+AFwh7s/ZWZXmlk0teh84Dafnf/0q8C0\nmX0feAi4KjoaX2rucNFFMDUVBMrm89f27eNd/IIx7mIjFxHt3VAHvBSVBo0COld9UB55BE45BX7x\ni65FX2Mhq3iQLaxkwQL1aUpxNZ+gAfzyNwvlPzlD56rn7eqrg/7MGOazl8u4WgNBUngaNApoj3NQ\nFi6c24verfxrrw1ufUQGqCpnGmmPM28x9zb7Li9SIHUbNFLgHJT58wdbXqRA6jZopMA5KGeeGZxa\nEcfQUFBepKTqdslDBc4B2LQJzvrXy3htX8y9yEMOgcsuG+xKiQxQp0GjKp6eqcCZska6xl0/WskU\nn+EXdAme8+fDmjVw0knZrKDIgKxbFwwE7du3f0CoqiPtCpwp23/zK2Ocm7iLMV5jIe80/6mHhoJj\nmbExuOmm4N+0SIVU+UZwCpwpi44ivs1BrOPvWMWDfJuzg5SjoaHg+ZxzYPNmuPVWOOig3NZXZFCq\nPNKuW2ekbGSkOZ/N2MJK/svSOzjvuZxWSiQHc9vC/ullpz3OlNVtdFGknSq3BQXOhJov6gqtRxd1\nGqXUTZVH2nXKZQKdLnigQCkyV9HbTNxTLhU4E6jK+bkiWSl6m9G56hmo8qihyCBUpc0ocCZQt/Nz\nRZKqSptR4EygyqOGIoNQlTajwJlAu1HDInRyixRRVdqMAmcPWt1Puvn83LL9AESy1uqc9rKlJ+nM\noZia0ygaFywABUuRfpW1XSkdKaaip1GIlFHR2pXSkVJWlTQKkSIpa7tKJXCa2RlmttXMtpvZ5S3m\nX2xme8zssfDxhci8cTPbFj7G01ifQahKGoVIkZS1XSUOnGZ2AHAd8GngOOB8MzuuRdHb3X1F+Lg+\nXHYx8DXg14GVwNfMbFHSdRqEqqRRiBRJWdtVGnucK4Ht7r7D3d8EbgPGYi57OnCfu7/s7q8A9wFn\npLBOqYiOok9Owvh4+dMoRIqkVXrS+HjQ3oo8yp7GqPoRwIuR9zsJ9iCbnW1mnwB+CPyBu7/YZtkj\nWlViZhPABMBIBvvxrUb7Nm5UsBRJ27p1+9tUWUbZ09jjbHXPh+ah+ruBZe7+74H7gY09LBtMdN/g\n7qPuPjo8PNz3ysZV5cv+ixRVWdpdGoFzJ3BU5P2RwK5oAXf/qbu/Eb79a+DEuMvmpayjfSJlVpZ2\nl0bg3AIsN7OjzexgYC0wFS1gZksib9cAPwhffwf4DTNbFA4K/UY4LXdlHe0TKbOytLvEgdPd3wZ+\nhyDg/QC4w92fMrMrzWxNWOz3zOwpM/s+8HvAxeGyLwP/nSD4bgGuDKflrqyjfSJlVpZ2pzOHOti0\nKehbeeGF4D/e+vXF6qAWqaI8253OHOpTcwrS+vW6gIdIlspwERBd5COiLKkQInVR1DapQ/WIol1w\nQKTusm6TOlTvQ1lSIUTqoqhtUoEzoiypECJ1UdQ2qcAZUZZUCJG6KGqbVOCMqMr9UESqoqhtsvaB\ns/k+QqB7CIkUSTQ9af36Ylw5qdbpSEVNdRCRuYrUXmudjqT0I5HyyKK9Kh0phqKmOojIXEVqr7UO\nnEVNdRCRuYrUXmsdOIua6iAicxWpvdY6cBY11UFE5ipSe6314JCISJQGh7pozt8swqWqRCS+PNtw\nLfM4i5QPJiK9y7sN1/JQXfmbIuU2qDasQ/UOipQPJiK9y7sN1zJwFikfTER6l3cbrmXgLFI+mIj0\nLu82XMvAWaR8MBHpXd5tOJXAaWZnmNlWM9tuZpe3mP+HZva0mT1uZg+Y2dLIvHfM7LHwMZXG+rSj\nO1iKVEfjcnM33xy8v/DC7NKSEqcjmdkBwHXAacBOYIuZTbn705Fi3wNG3X3GzL4IfAP4bDhvr7uv\nSLoe3eSdviAi6curXaexx7kS2O7uO9z9TeA2YCxawN0fcvdw03gYODKFensyObn/j9swMxNMF5Fy\nyqtdpxE4jwBejLzfGU5r5xLg3sj7Q8xs2sweNrOz2i1kZhNhuek9e/b0vJJ5py+ISPryatdpBE5r\nMa1lVr2ZXQCMAn8amTwSJpx+DrjWzD7Yall33+Duo+4+Ojw83PNK5p2+ICLpy6tdpxE4dwJHRd4f\nCexqLmRmpwKTwBp3f6Mx3d13hc87gM3ACSms0xx5py+ISPryatdpBM4twHIzO9rMDgbWArNGx83s\nBOCbBEHzpcj0RWY2L3x9OPBxIDqolJq80xdEJH15tetUzlU3s9XAtcABwA3uvt7MrgSm3X3KzO4H\nPgzsDhd5wd3XmNnHCALqPoIgfq27/023+nRZOREZhEzPVXf3e9z9Q+7+QXdfH077qrtPha9Pdff3\nufuK8LEmnP5/3P3D7v4fwueuQbNfuoycSLVl2cZrcVk55XCKVFvWbbwWl5XTZeREqi2tNq7LykUo\nh1Ok2rJu47UInMrhFKm2rNt4LQKncjhFqi3rNl6LwKkcTpFqy7qN12ZUfXIy6O8YGQn+CyloilRL\no0032nrjQh+DaOuVD5xKRRKphyzbeuXTkZSKJFIPabR1pSOFlIokUg9ZtvXKB06lIonUQ5ZtvfKB\nU6lIIvWQZVuvfOBUKpJIPWTZ1is/OCQiEpcGh0K6nJxIvWTR5iudx6kcTpF6yarNV/pQXTmcIvWS\ntM3rUB3lcIrUTVZtvtKBUzmcIvWSVZuvdOBUDqdIvWTV5isdOJXDKVIvWbX5Sg8OiYj0ItPBITM7\nw8y2mtl2M7u8xfx5ZnZ7OP8RM1sWmXdFOH2rmZ2exvpEKY9TpF5KkcdpZgcA1wGnATuBLWY25e5P\nR4pdArzi7r9iZmuBrwOfNbPjgLXA8cAHgPvN7EPu/k7S9QLlcYrUTVZtPo09zpXAdnff4e5vArcB\nY01lxoCN4es7gVPMzMLpt7n7G+7+LLA9/LxUTE7u/wM2zMzsvzK0iFRLVm0+jcB5BPBi5P3OcFrL\nMu7+NvAz4LCYywJgZhNmNm1m03v27Im1YsrjFKmXMuVxWotpzSNO7crEWTaY6L7B3UfdfXR4eDjW\niimPU6ReypTHuRM4KvL+SGBXuzJmdiDwHuDlmMv2TXmcIvVSpjzOLcByMzvazA4mGOyZaiozBYyH\nr88BHvQgD2oKWBuOuh8NLAceTWGdAOVxitRNqfI4zWw1cC1wAHCDu683syuBaXefMrNDgJuBEwj2\nNNe6+45w2Ung88DbwO+7+73d6lMep4gMQqZ5nO5+j7t/yN0/6O7rw2lfdfep8PXr7n6uu/+Ku69s\nBM1w3vpwuWPjBM1eKY9TpF5KkcdZZMrjFKkXXY+zA12PU0Ra0fU4U6A8TpF6KVMeZ2Epj1OkXsqU\nx1lYyuMUqZcy5XEWlvI4ReolqzZf6VF12P8Hm5wM+jkaJ/sreIpUz6ZN+9v6yEiwpzmItl75wKmU\nJJF6yLKtVzodCZSSJFIXabR1pSOFlJIkUg9ZtvXKB06lJInUQ5ZtvfKBUylJIvWQZVuvfOBUSpJI\nPWTZ1is/OCQiEpcGh5ro8nIi1ZZlG698Hicol1Ok6rJu47U4VFcup0i1pdXGdageoVxOkWrLuo3X\nInAql1Ok2rJu47UInMrlFKm2rNt4LQKncjlFqi3rNp5ocMjMFgO3A8uA54Dz3P2VpjIrgL8E3g28\nA6x399vDeTcCnwR+Fha/2N0f61av8jhFZBCyGhy6HHjA3ZcDD4Tvm80AF7n78cAZwLVmdmhk/h+5\n+4rw0TVoJqFcTpHqyaNdJ83jHAM+Fb7eCGwGvhIt4O4/jLzeZWYvAcPAqwnr7olyOUWqJ692nXSP\n833uvhsgfH5vp8JmthI4GHgmMnm9mT1uZteY2byE69PW5OT+P27DzMz+K8KLSPnk1a677nGa2f3A\n+1vM6mnVzGwJcDMw7u77wslXAD8iCKYbCPZWr2yz/AQwATDSR46BcjlFqievdt01cLr7qe3mmdmP\nzWyJu+8OA+NLbcq9G/gn4I/d/eHIZ+8OX75hZn8LfLnDemwgCK6Mjo72PKI1MtL6zALlcoqUV17t\nOumh+hQwHr4eB+5qLmBmBwP/ANzk7t9qmrckfDbgLODJhOvTlnI5Raonr3adNHBeBZxmZtuA08L3\nmNmomV0fljkP+ARwsZk9Fj5WhPM2mdkTwBPA4cCfJFyftpTLKVI9ebXrWlzko5WsbiMqIoMxiDYc\nN4+zFpeVa6bUJJFyy7sN13KPU5eZEym3QbVhXVauA6UmiZRb3m24loFTl5kTKbe823AtA6dSk0TK\nLe82XMvAqdQkkXLLuw3XMnBC8Ad+7jm4+ebg/YUX6opJIkUXvRLS5GSwh7lvX9CWs9zxqWU6UkPe\nKQ0iEl+R2mst05EalJYkUh5ZtFelI8WQd0qDiMRXpPZa68CZd0qDiMRXpPZa68CZd0qDiMRXpPZa\n68CZd0qDiMRXpPZa68EhEZEoDQ71SXfCFCmWIrbJWudxNitSnpiIFLdN6lA9QnmdIsWSdZvUoXof\nipQnJiLFbZMKnBFFyhMTkeK2SQXOiCLliYlIcdukAmdEc57YYYfB/Pm6cpJIlpqvgDQ+XozczSgN\nDrXRPJoHwX+6InxpIlWVd7uLOziUKHCa2WLgdmAZ8Bxwnru/0qLcOwT3Tgd4wd3XhNOPBm4DFgP/\nF7jQ3d/sVm8WgVMj7CLZy7vdZTWqfjnwgLsvBx4I37ey191XhI81kelfB64Jl38FuCTh+qSmqKN5\nIlVWlnaXNHCOARvD1xuBs+IuaGYGrALu7Gf5QSvqaJ5IlZWl3SUNnO9z990A4fN725Q7xMymzexh\nM2sEx8OAV9397fD9TuCIhOuTmqKO5olUWVnaXddTLs3sfuD9LWZN9lDPiLvvMrNjgAfN7Ang5y3K\nte1wNbMJYAJgJIN/P42O6MnJ4DBhZCT48jQwJDI4ZWl3Xfc43f1Ud/+1Fo+7gB+b2RKA8PmlNp+x\nK3zeAWwGTgB+AhxqZo3gfSSwq8N6bHD3UXcfHR4e7mET+9e4oVvjZlBQvIsNiJRd80U8YHa7K1rQ\nhOSH6lPAePh6HLiruYCZLTKzeeHrw4GPA097MJz/EHBOp+WLopEm8fzz4L7/YgMKniL9K2u7SpqO\ndBhwBzACvACc6+4vm9kocKm7f8HMPgZ8E9hHEKivdfe/CZc/hv3pSN8DLnD3N7rVm8f1OPNOkxCp\noqK1q0zyOPOSR+AcGgr+IzYzCw4pRKR3RWtXujpSysqSJiFSJmVtVwqcMZUlTUKkTMrarhQ4YyrS\njaJEqqKs7UqBswfN6Unr1hXzfigiRVbG9KNmuudQAkW9H4pIUVWlzWhUPYGipVKIFF3R24xG1TNQ\nliu5iBRFVdqMAmcCZU2lEMlLVdqMAmcCZU2lEMlLVdqMAmcC7VIpQCPtItB6BL2M6UfNNDiUsrzv\nmSJSFGVsCxocysnk5OwfCgTvJ3u5eqlImbjDI4/AuefCwoXB7uXChbxn4jyOn3mU6GV2q9IWtMeZ\nsqJdtEBkoN56Cy66CKam4PXXZ/3I32GIvcxnis8wzk28zUFAsduC9jhzUpVRQ5Gu3PcHzZmZOdHw\nAPbxLn7BGHexkYto7HlWoS0ocKas3ajh6tUaMJKKefRRuPvuuX1TTRaylzXczUlsKeUIeis65TJl\nre6Zsno1bNxY/tPMRGa5+mrYuzdW0fns5b8uuJqfb7i9Er959XFmoOinmYn0ZeHCrnubc8q/9trg\n1icF6uMskKqcZiYyS8y9zb7LF5gCZwY0YCSVNH/+YMsXmAJnBqpympnILGeeGYx2xjE0FJSvCAXO\nDHS6yrUuhCxl0/jNfvRblzHjMfciDzkELrtsoOuVJY2qZ2Tdurkj6FW5qKvUR/Q3+zwr+Uf/DGdx\nFwvo0H85fz6sWQMnnZTdig5Yoj1OM1tsZveZ2bbweVGLMieb2WORx+tmdlY470YzezYyb0WS9Skb\nnZ4pZTP7N2uMcxP/yBgztnDuYfvQUNAnNTYGN90UHG5VRNJD9cuBB9x9OfBA+H4Wd3/I3Ve4+wpg\nFTAD/HOkyB815rv7YwnXp1Q02i5l0/zbfJuDWMffcbI/CGefPetcdc45BzZvhltvhYMOymV9ByXp\nofoY8Knw9UZgM/CVDuXPAe519x6Sv6prZKR1fqdG26WoWv9mjR8vXQl33JHHKuUi6R7n+9x9N0D4\n/N4u5dcCtzZNW29mj5vZNWY2L+H6lIpOz5QiazVwqQyRkLt3fAD3A0+2eIwBrzaVfaXD5ywB9gAH\nNU0zYB7BHutXOyw/AUwD0yMjI14Vt9zivnSpu1nw/MUvui9Y4B5cQSF4LFgQlBPJyi23tP8dNv9m\nq/TbBKa9S0x092SnXJrZVuBT7r7bzJYAm9392DZl/zNwvLtPtJn/KeDL7v6futVbtlMue6HTM6UI\n6vo7zOqUyylgPHw9DtzVoez5NB2mh8EWMzPgLII92VrTgJEUgX6HnSUNnFcBp5nZNuC08D1mNmpm\n1zcKmdky4CjgX5qW32RmTwBPAIcDf5JwfUpPp2dKEeh32FmiwOnuP3X3U9x9efj8cjh92t2/ECn3\nnLsf4e77mpZf5e4fdvdfc/cL3L3Yl07JQLfOd51pJGnTIFDvdMplwXQ7PXNiIuh7ct9/ppGCp/Sr\n3W8KqnE3ykHR9ThLpK4d9jI4+k3NputxVpA67CVt+k31R4GzRDp12KvvUzpp9/vQIFB/FDhLpNOZ\nRur7lHY69Y1rEKg/Cpwl0m7g6J57dJUlaa/TVbg6DUZKexocqoChoWBPopnZnFtdSw3p9xGfBodq\npFs/lfo/60H9mNlR4KyATv1Uyv2sB/VjZizOlUCK9jjxxBP7uO5JtbW7Ys3SpbOvcNN4LF2a37pK\n+rp9z1W+olGayOLqSHlRH2d86t+qB33P6VAfpwDq/6wa9WMWgwJnxan/szrUj1kgcY7ni/ZQH2dv\n1P9ZDerHHDxi9nFqj7MG1q0LLtiwb1/w3EhujnOesg7ls9fub97t+2r3PUv6kt7lUkqs2102G4eG\njbNOopccU6McjE5/c90VtTi0x1lj3frFOp2qB9obTaLd367T31z9mAUS53i+aA/1caanU7+YWes+\nNbPOd0GUzjr97Tr9zRvLqh9zcFAepyTV6SK3oAvg9kt/1+JSHqck1unQUANLnXXa9k5/Ox2Ol0Sc\n3dKiPXSonp1+U5niHMqX+bCz07p323alFRUXMQ/Vcw+C/TwUOPOXRnDotHzewWPQgVH9w8WUSeAE\nzgWeAvYBox3KnQFsBbYDl0emHw08AmwDbgcOjlOvAmcx9Duw5N45uKSxt5pkftLA2G3b46yf5COr\nwPmrwLHA5naBEzgAeAY4BjgY+D5wXDjvDmBt+PqvgC/GqVeBs/iSBJc09laTzE8aGHVGVnlleqje\nJXD+R+A7kfdXhA8DfgIc2Kpcp4cCZ/ElCU5JA1PS+Unr16F4ecUNnFmMqh8BvBh5vzOcdhjwqru/\n3TS9JTObMLNpM5ves2fPwFZW0tHtXjadRo+7Xemn24h+0vnd6u828q37+NRAt8gK3A882eIxFimz\nmfZ7nOcC10feXwj8T2AY2B6ZfhTwRJxorz3OamjXz5f0UDrp/KpnBEh76FBdyizJ4E3S+d3ql+oq\nUuA8ENhBMILeGBw6Ppz3LWYPDv12nPoUOGWQo+pSX3EDZ6JTLs3sNyOH3a8Cj7n76Wb2gfDwfHVY\nbjVwLcEI+w3uvj6cfgxwG7AY+B5wgbu/0a1enXIpIoMQ95RLnasuIhLSueoiIgOiwCki0iMFThGR\nHilwioj0SIFTRKRHCpwiIj1S4BQR6VEp8zjNbA/Q4s4sHR1OcIpnHvKsu+7113nb866/jNu+1N2H\nuxUqZeDsh5lNx0lsrVrdda+/ztued/1V3nYdqouI9EiBU0SkR3UKnBtqWnfd66/ztuddf2W3vTZ9\nnCIiaanTHqeISCoUOEVEelSZwGlm55rZU2a2z8zapiCY2RlmttXMtpvZ5ZHpR5vZI2a2zcxuN7OD\ne6x/sZndFy5/n5ktalHmZDN7LPJ43czOCufdaGbPRuatSLv+sNw7kTqm0tj+mNu+wsz+LfyOHjez\nz0bm9bXt7b7LyPx54bZsD7dtWWTeFeH0rWZ2etxt7bH+PzSzp8PtfcDMlkbmtfweUqz7YjPbE6nj\nC5F54+F3tc3MxnutO2b910Tq/qGZvRqZl3TbbzCzl8zsyTbzzcz+Ily3x83sI5F5ibcdSOfWGUV4\nkNM93iOf/Q3g8vD15cDXu5RfDLwMLAjf3wick2D7Y9UPvNZmet/bH6du4EPA8vD1B4DdwKH9bnun\n7zJS5reBvwpfrwVuD18fF5afR3BLl2eAAwZQ/8mR7/eLjfo7fQ8p1n0x8L/a/O52hM+LwteL0q6/\nqfzvEtz5IfG2h8t/AvgI8GSb+auBewnua/ZR4JG0tr3xqMwep7v/wN23dim2kuDOmjvc/U2C23aM\nmZkBq4A7w3IbgbN6XIWxcLm4y58D3OvuMz3Wk1b9v5TC9net291/6O7bwte7gJcIbrnSr5bfZYf1\nuhM4JdzWMeA2d3/D3Z8Ftoefl2r97v5Q5Pt9GDiyxzr6rruD04H73P1ld38FuA84Y8D1nw/c2mMd\nbbn7/ybY6WhnDLjJAw8Dh5rZEtLZdqBCh+oxpXKP9zbe5+67AcLn93Ypv5a5P6b14aHFNWY2b0D1\nH2LB/ekfbnQTkHz7e9p2M1tJsKfyTGRyr9ve7rtsWSbctp8RbGucZdOoP+oSgr2ghlbfQ9p1nx3+\nTe80s6P6XO8k9RN2TxwNPBjrDMDwAAAC4klEQVSZnGTbk6xfGtsOBHegLA0zux94f4tZk+5+V5yP\naDHNO0yPXX+MuqOfswT4MPCdyOQrgB8RBJQNwFeAKwdQ/4i777LgRnkPmtkTwM9blJu1/Slv+83A\nuLvvCyd33fZWH9VtnTuUifV9p1B/UNDsAmAU+GRk8pzvwd2fabV8n3XfDdzq7m+Y2aUEe96relnv\nhPU3rAXudPd3ItOSbHuS9Utj24GSBU53PzXhR+wEjoq8PxLYRXAhgEPN7MBwz6QxPXb9ZvZjM1vi\n7rvD4PBSh/U4D/gHd38r8tm7w5dvmNnfAl8eRP3hYTLuvsPMNgMnAN+my/anUbeZvRv4J+CPw0Oo\n2NveQrvvslWZnWZ2IPAegkO8OMumUT9mdirBP5dPeuQOrm2+h7jBo2vd7v7TyNu/Br4eWfZTTctu\njllv7Poj1gJfalq3JNueZP3S2PZAkk7aIj7I+B7vkc/+U2YPkHyjQ9mHgZObpi0Jn43gVspXpV0/\nQYf4vPD14cA29g+O9b39Mes+GHgA+P0W83re9k7fZaTMl5g9OHRH+Pp4Zg8O7aD3waE49TcCwvK4\n30OKdS+JvP5N4OHw9WLg2XAdFoWvF6e97WG5Y4HnCE+0SWPbI5+zjPaDQ2cye3Do0bS2/Zd19LNQ\nER/hj2Mn8AbwY+A74fQPAPdEyq0Gfhj+oCcj048BHiUYKPhW48vtof7DwsCwLXxeHE4fJbjHfPQL\n/3/AUNPyDwJPAE8CtwDvSrt+4GNhHd8Pny9JY/tj1n0B8BbwWOSxIsm2t/ouCQ7x14SvDwm3ZXu4\nbcdElp0Ml9sKfLrP31y3+u8Pf4uN7Z3q9j2kWPf/AJ4K63gI+HeRZT8f/k22A781iG0P3/83mv4J\nprTttxJkZbxF0OYvAS4FLg3nG3BduG5PENmRSmPb3V2nXIqI9Kpuo+oiIokpcIqI9EiBU0SkRwqc\nIiI9UuAUEemRAqeISI8UOEVEevT/AWtQ7WMbzlsRAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(5, 5))\n", "plot_points(circle100)\n", "sol = incremental_farthest_search(circle100, 2)\n", "plot_points(sol, style={'marker': 'o', 'color':'r', 'markersize': 12})\n", "evaluate_solution(sol)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And here's test case 4 points on a circle." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4.242640687119285" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimal_circle_solution(4)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5.414213562373095" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(5, 5))\n", "plot_points(circle100)\n", "sol = incremental_farthest_search(circle100, 4)\n", "plot_points(sol, style={'marker': 'o', 'color':'r', 'markersize': 12})\n", "evaluate_solution(sol)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we see that our approximate algorithm does not yield the right answer. To see why, we plot the point labels, their order in the solution set." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(5, 5))\n", "plot_points(circle100)\n", "plot_points(sol, style={'marker': 'o', 'color':'r', 'markersize': 12}, label=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we see, the points don't have the expected order, thus computing the sum of the distances between points does not yield the minimal and optimal solution. However, we can compute this by hand to make sure the result is correct:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4.242640687119286" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "distance(sol[2], sol[0]) + distance(sol[0], sol[3]) + distance(sol[3], sol[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is the expected value. So our \"farthest neighbours approximate algorithm\" behaves as we expect it on these two test cases." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What about another larger test case, 10?" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5.562305898749053" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimal_circle_solution(10)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "14.693153625647701" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(5, 5))\n", "plot_points(circle100)\n", "sol = incremental_farthest_search(circle100, 10)\n", "plot_points(sol, style={'marker': 'o', 'color':'r', 'markersize': 12}, label=True)\n", "evaluate_solution(sol)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is not very satisfying. Also, the metric we use suffers again from the permutation problem highlighted in the case of test case 4." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can define a better solution by running the algorithm several times and keeping the one that minimizes the criterion above:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "def best_solution(points, k, tries):\n", " solution_sets = [incremental_farthest_search(points, k) for _ in range(tries)]\n", " sorted_solutions = sorted(solution_sets, key=evaluate_solution, reverse=False)\n", " return sorted_solutions[0]" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "12.18068388836029" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(5, 5))\n", "plot_points(circle100)\n", "sol = best_solution(circle100, 10, 100)\n", "plot_points(sol,\n", " style={'marker': 'o', 'color':'r', 'markersize': 12}, label=True)\n", "evaluate_solution(sol)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Unfortunately, this does not eliminate the ordering problem that is important when computing the metric. As a quick workaround, we could order the points by their angle:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "sorted_sol = sorted(sol, key=lambda p: math.atan2(p.imag, p.real))" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5.361390426676054" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nKZJKrUpLSuKIs9Q5bcmsejN7LzAP+MvY5N4o4XQ5cJ2ZvazUsu5+vbvPc/d5M2fOrHkjW52+ICLJ\na1W9TiJw7gfOir0/E3iiuJCZvZ1wu5BF7v58frq7PxE97wN2AhcksE0naHX6gogkr1X1OonAuQeY\nY2Znm9lUYBlQ0DtuZhcAXyQEzadj06eb2UnR61OB3yBkCSWu1ekLIpK8VtXrRK5VN7NLgOuAScBX\n3X2tmX0KGHb3QTO7CzgfeDJa5HF3X2RmbyQE1DFCEL/O3b8y3vqSunWGiEhcU69Vd/ft7v5yd3+Z\nu6+Npn3C3Qej129395cUpx25+7+6+/nu/troedygOVGtHIJKRBqvmXU8iV71tpfP9cqnLeRzvUCn\n6iJZ0Ow63hHDyuk2wCLZllQd17ByMa0egkpEGqvZdbwjAqdyOEWyrdl1vCMCp3I4RbKt2XW8IwKn\ncjhFsq3ZdbxjetUHBkJ7R29v+C+koCmSLfk6na/r+YE+GlHXMx84lYok0hmaWdczn46kVCSRzpBE\nXVc6UkSpSCKdoZl1PfOBU6lIIp2hmXU984FTqUginaGZdT3zgVOpSCKdoZl1PfOdQyIi1VLnUETD\nyYl0lmbU+UzncSqHU6SzNKvOZ/pUXTmcIp2l3jqvU3WUwynSaZpV5zMdOJXDKdJZmlXnMx04lcMp\n0lmaVeczHTiVwynSWZpV5zPdOSQiUoumdg6Z2cVm9oCZ7TWzq0vMP8nMtkTzd5vZ7Ni8j0fTHzCz\ndyaxPXHK4xTpLKnI4zSzScAXgIuA/cAeMxt09x/Fil0J/MLdf93MlgGfAd5jZucCy4DzgNOBu8zs\n5e5+tN7tAuVxinSaZtX5JI44+4C97r7P3Q8BNwP9RWX6gfXR61uBt5mZRdNvdvfn3f0RYG/0eYkY\nGDj+B8wbGTk+MrSIZEuz6nwSgfMM4Cex9/ujaSXLuPsR4L+AF1W5LABmttrMhs1s+Jlnnqlqw5TH\nKdJZ0pTHaSWmFfc4lStTzbJhovv17j7P3efNnDmzqg1THqdIZ0lTHud+4KzY+zOBJ8qVMbPJwAuB\nn1e57IQpj1Oks6Qpj3MPMMfMzjazqYTOnsGiMoPAquj1YmCHhzyoQWBZ1Ot+NjAHGEpgmwDlcYp0\nmlTlcZrZJcB1wCTgq+6+1sw+BQy7+6CZTQNuBC4gHGkuc/d90bIDwAeBI8Afufs3x1uf8jhFpBGa\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(5, 5))\n", "plot_points(circle100)\n", "plot_points(sorted_sol,\n", " style={'marker': 'o', 'color':'r', 'markersize': 12}, label=True)\n", "evaluate_solution(sorted_sol)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is closer to the optimal solution. Actually, it is even lower. This is due to the fact that our metric does not take into account the last segment \"closing the circle\"." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's finish this with an animation of different solutions for growing number of points on the circle and then on the random point cloud." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " Once \n", " Loop \n", " Reflect \n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fig, ax = plt.subplots(figsize=(5, 5))\n", "\n", "def init():\n", " return\n", "\n", "def animate(i):\n", " ax.cla()\n", " plot_points(circle100, ax=ax)\n", " plot_points(incremental_farthest_search(circle100, i+1), \n", " ax=ax, \n", " style={'marker': 'o', 'color':'r', 'markersize': 12})\n", " ax.set_title(f\"{i+1} points\")\n", "\n", "animation = mpl_anim.FuncAnimation(fig, animate, init_func=init,\n", " frames=20, blit=False)\n", "plt.close(fig)\n", "HTML(animation.to_jshtml())" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " Once \n", " Loop \n", " Reflect \n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fig, ax = plt.subplots(figsize=(5, 5))\n", "\n", "def init():\n", " return\n", "\n", "def animate(i):\n", " ax.cla()\n", " plot_points(cloud100, ax=ax)\n", " plot_points(incremental_farthest_search(cloud100, i+1), \n", " ax=ax, \n", " style={'marker': 'o', 'color':'r', 'markersize': 12})\n", " ax.set_title(f\"{i+1} points\")\n", "\n", "animation = mpl_anim.FuncAnimation(fig, animate, init_func=init,\n", " frames=20, blit=False)\n", "plt.close(fig)\n", "HTML(animation.to_jshtml())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's end this post here and review a few things. \n", "\n", "\n", "We explored an approximate solution to the farthest neighbors problem and tried to compare our expectations with the algorithm outputs on test cases. As far as I can tell, the algorithm does what it is supposed to do. However, it's far from perfect. And we couldn't compare its results to \"true solutions\" since this problem explodes in terms of combinatorial optimization, just like the [travelling salesman problem](https://github.com/norvig/pytudes/blob/master/ipynb/TSP.ipynb).\n", "\n", "Regarding the studied applications, I believe this algorithm behaves quite well for point clouds, but we can observe that for circle patterns, the solution will not be optimal since the greedily chosen points hinder the formation of well-space points on the circle." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This post was entirely written using the IPython notebook. Its content is BSD-licensed. You can see a static view or download this notebook with the help of nbviewer at [20150716_FarthestNeighbors.ipynb](http://nbviewer.ipython.org/urls/raw.github.com/flothesof/posts/master/20150716_FarthestNeighbors.ipynb)." ] } ], "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.6.3" }, "toc": { "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "toc_cell": false, "toc_position": {}, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }