{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# Algo - TSP - Traveling Salesman Problem\n", "\n", "[TSP](https://fr.wikipedia.org/wiki/Probl%C3%A8me_du_voyageur_de_commerce), Traveling Salesman Problem ou Probl\u00e8me du Voyageur de Commerce est un probl\u00e8me classique. Il s'agit de trouver le plus court chemin passant par des villes en supposant qu'il existe une route entre chaque paire de villes."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": ["%matplotlib inline"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Enonc\u00e9\n", "\n", "On part d'un ensemble de villes al\u00e9atoires."]}, {"cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["import numpy\n", "import matplotlib.pyplot as plt\n", "\n", "villes = numpy.random.rand(20, 2)\n", "plt.plot(villes[:, 0], villes[:, 1], 'b-o')\n", "plt.plot([villes[0, 0], villes[-1, 0]],\n", " [villes[0, 1], villes[-1, 1]], 'b-o');"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q1 : choisir une permutation al\u00e9atoire des villes et calculer la distance du chemin qui les relie dans cet ordre\n"]}, {"cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": []}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q2 : tirer deux villes al\u00e9atoirement, les inverser, garder la permutation si elle am\u00e9liore la distance"]}, {"cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": []}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q3 : choisir deux villes al\u00e9atoirement, permuter une des deux moiti\u00e9s..."]}, {"cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": []}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q4 : tester toutes les permutations possibles... je plaisante...\n", "\n", "Choisir les deux villes les plus proches, les relier, recommencer, puis... vous trouverez bien quelque chose pour finir."]}, {"cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": []}, {"cell_type": "markdown", "metadata": {}, "source": ["## R\u00e9ponses"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q1\n", "\n", "On redessine le parcours entre les villes. "]}, {"cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [{"data": {"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABOIklEQVR4nO2deZxN9f/HX5+ZMRhEMXbGmq0NQzRRUkILlRihLFGWvqmkpO2XSNZSFFpUSCKSsrWJLDVSsmTPvo59GbPc9++Pl9Od5S7nrufOvZ/n43Ef995zzv2c9z333Pf5nPeqRAQajUajyf9EWS2ARqPRaPyDVugajUYTJmiFrtFoNGGCVugajUYTJmiFrtFoNGFCjFU7LlWqlFSpUsWq3Ws0Gk2+ZN26dcdFJN7ROssUepUqVZCSkmLV7jUajSZfopTa42ydNrloNBpNmKAVukaj0YQJWqFrNBpNmOBWoSulPlJKHVVKbXSyXimlJiildiilNiilGvhfTI1Go9G4w8wMfRqA1i7WtwFQ8/KjD4D3fBdLo9FoNJ7iVqGLyC8ATrjYpB2AT4WsAVBCKVXOXwKGGzNmAFWqAFFRfJ4xw2qJNBpNuOAPG3oFAPuyvd9/eVkelFJ9lFIpSqmUY8eO+WHX+YsZM4A+fYA9ewARPvfpo5W6RqPxD0F1iorIFBFJFJHE+HiHcfFhzdChwIULOZdduMDlGo1G4yv+UOgHAFTK9r7i5WWaXOzd69lyjUaj8QR/KPQFAB6+HO3SBMBpETnkh3HDjsqVPVuu0Wg0nmAmbPFzAKsB1FJK7VdK9VJKPa6UevzyJt8B2AVgB4CpAPoFTNp8zvDhQFxczmVxcVyu0Wg0vuK2louIdHazXgD095tEYUyXLnweOpQOUQB48kn7co1Go/EFnSkaZLp0Af79Fxg3ju+PH7dUHI1GE0ZohW4RSUl8njsXSE+3VhaNJj+jczvsaIVuEfXrA4ULAydOAN9/b7U0Gk3+ROd25CQsFXp+uGIXKAA0bszXs2ZZK4tGk1/RuR05CTuF7uiK3bs38N57wKlT/LEzM62Wkhhml/nzgYsXLRVFo8mX6NyOnFjWsShQOLpiX7wI9OvHh0FUFBAbm/NRsKBn7339TJEilOXsWWDKFCA5Oef66GhAqeAdu1Bixgz+lnv3Mk5/+HAdDaSx89dfwODBnLQ5IlJzO5Q4OyIBJjExUQLRgi4qyvmPPH48HZCXLvHZeLh7b3Ybf6OUdRcbs+9jYvx/0THusrJfmOPieNHTSj2y2bcPePFF4LPPgBIl6Ic6eDDnNuF+riil1olIosN14abQq1Sxx3hnJyGB4YKBQgTIyPD8InDfffYxRo2ibd0fFxdn2/ib7Bcdf11IJkwATp/Ou69A/4aa0OX0aWDkSOCtt/hf+9//gNtvB+6+G7jmGiA1lco+Eu7mXCn0sDO5DB+ed3YXGxv4bMzsis0T+vThbAIAKlYEOrtM4/INEfoPAnGhMPOZc+fcb3PpknP5I9UuGsmkpwPvvw+89hqVdteuwOuvA1dcwUix8uUZJXbVVVZLGhqEnULPno25dy/t0FddBXTqZK1czkhKsiv0WbMCq9CV4h1AgQJ2+32oIcK7LEfKu1KlvMs04YkIMGcOMGQIsHMncNttwOjRQIMGXNeuHU0tK1dqZZ6dsItyAezZmDYbT4rDh4Fp06yWyjFGpEtcHLBoEXDypLXyWI1SwIgReWveAECFCnkd3prwY+VKoGlToGNH2si/+46z8AaXm1uOHQt88w0wZow99FdDwlKhZ+fee3lyvPpqaIYGVqsGlCnD2WdGBkMYI50uXXjXkpBABV+5MvDgg8CaNbwA7t5ttYSaQPDPP0D79kCzZrSHf/gh8OefQJs2dsf7r78Czz8PPPAA8MQTVkobmoS9QleKzpQDB4B337VamrwoRSWVnk7lrpOMSPa7rD17gNmzgW+/5bKGDYGlS62WUOMvjhwB+valc/PHH+nv2r4d6NmTJlOD48dpOk1IoLKP1JBeV4S9QgeA5s15lX/jDSYXhRrGrLN5c+CHH4CjR62WKDRp0wZISaHzuHVr/p4WBWlp/MD583R21qgBfPAB8PjjwI4dwAsv5DW52WxAt27AsWPAl18CxYtbI3OoExEKHaBd9uRJhgaGGoYdvVIlICuLBbs0jqleHVi9mklYL7wAdOjAxCxN/iEzkwq8Zk3glVeAVq2ATZt4B126tOPPjBwJLF4MvP223ZauyUvEKPQbbgAeeohxrLkTEaymfn2gUCEqpjp1gC++sFqi0KZIESYfjRsHfP01cOONwNatVkulcYcIsHAhcP31LMdRpQpt4nPnAldf7fxzy5cDL73Ei/hjjwVN3HxJxCh0gLd3GRnAsGFWS5KT2Fh663/9lSftL7/Q5q9xjlLAU08By5bRttq4MbBggdVSaZyRksLQw3vu4X9w7lye7zfd5PpzR47wP1GjBh3l2m7umohS6NWr8wo/dSqdLqFEUhKwfj2jckRoJ9S4p0ULYN06zvDateMtvM1mtVQag927eWfcqJHdrLJpE3D//e6Vc1YWneOnTvH/UKxYUETO10SUQgdYB6JgQd7ChRJJSbQtnjpFE0yoRLv062ev1xITk7PAWahQqRKwYgXQowfvwu65JzSd3+GEuxLVJ04AzzwD1K7NUNyhQ+nw7N+fiW1mGDaMQQITJwLXXefnLxCuiIglj4YNG4pVDB0qAoisW2eZCHlITaVMr78u8uabfL1rl7Uy9e1LOXI/+va1Vi5n2GwikyaJFCggUr26yN9/ez+Os0dWlvNHZqbzR0aG40d6uvPHpUvOH2lpjh8XLzp/XLjg/HH+vPPHuXM5Hx9+KFK4cM5zIi5OZPp07mf0aJESJUSUEunZU2TfPs9/g6VL+flHHuFx19gBkCJO9GrYFecyw+nTjPlOTASWLLFEBIfUq8cY20mTgKpVGZb3/PPWyRMTw9teRxQsyGdnp4+r08rf63Iv16GM1lCyJFC0KPMG2rQB3nwTuPZaz8c5eJBBDPHxwG+/hW6ZCquIqOJcZihenCFvgwYxkeG226yWiCQl0VZYuTKzW2fNslahO1PmADBwoP21M1uoKxupN+s8+cyhQwyNM3jhBV6gArGvSBtv8GDH26Wm8tz98EOgZUvn47kiM5NO0PPnGd2ilbmHOJu6B/phpclFhLeGFSuKNG4cOrd006bx9vXvv0XeeouvN2+2Tp7oaMcmF0Dk1Vd5ix/KXLok0r8/5W3ZUuTYMd/HnD5dJCGB5oCEBL6PNBISHJ8TJUvS9OQLQ4ZwrM8+84uoYQlcmFwiVqGL0BYIiMyda7UkZPt2yvP++yIHDlBpvPKKdfI4s6HXrMnnq68W+ekn6+Qzy8cfixQsSEXki99k+nTaih3ZjiOJd97Je7H3x3H49luO1bu3f+QMV1wp9Ii0oRtkZtptfH//7fiWPJiIAGXLAnfeCXz6KUPyDh8GNm+2Lv62Xz/G/2Zlsa5Gnz608S9dynU7dwKPPMLKd6VKWSOjGVJSGCp37BgweTLw8MOej+GseUpcHNPSS5TI+ShePO+yQoXybyz12bPMtB47lnXrixThsqgo4KOPeB54y759tJtXqsRM4MKF/SZ22OHKhh7RM3QRka++4qzggw+sloTcd59ItWp8/f77lO3PP62VyRkXLjBiqEABkauuEvnoo9AxXzni6FGR227jMe3fnyYZT1DKuQmqdGkeB2frjUdsLLetWVOkUSORO+4QefBBzkqffVZk+HCRd9/lbHfhQpGVK0U2bhTZv1/k7NngHN/cZqVPPhGZOFEkPp7fITnZHoH1zTdctmCB9/u7dEmkSRORYsVEtm71xzcIb6Bn6M4RoQPywAFg2zbrZwZjx9JZe+gQ7xjKlgWefZYRL6HKpk0srLRyJXDLLewwU7u21VI5JjOTTRPGjAFuvplO6LJlzX3WXXtDESAtjTHwp04xmsp4nfvhbF1ammsZoqPzzvqd3Q04Wle0KGfUznDUz1UpfrdbbmGTiUaN7OsyMoBy5egE9bZkxTPPsIzDF1+wBrrGNRHVU9Qbfv6Z5o0xY3hyWcmaNbzAzJnDms9t2rBO9K5doX2rbrMBH3/Mi8+5c4zOeeEFmhhCkVmzgF69qOzmzuUxd0cwmldfuuRc2Zu5QJw/73r8qCi7gnd0Efj4Y8f9XOPjmYbv6BwcMICRLUeOsDWcJ3z9NWug9+8fmuWtQxGt0E3QujXw++9UnFaW5kxP5/779uWs5ZNPgO7dqehvvNE6ucxy9CgvitOns5ree+95H8IWaDZsYJPuffuAd96hsnZ30Zwxg1mPxkx9xAjO+EOFjIy8it+TOwVnlSuVcl5SwZiEfPwxz1Wz7N7NrOgaNVjXxcht0LhG29BN8McftAUOHWq1JCLNmzOcUkTk1CnaXQcOtFYmT1m2TKRGDR7Trl1FjhyxWiLHnDgh0qYN5ezVi+GsZjh+nJEz/fsHVr5gU7myY9t/QoLzz9hszMxt2dL8ftLSRBITRYoXF9m501epIwvosEVzJCcz/OrgQWvlGDJEJCaGadciIu3bi5QrxxTy/MTFiyIvv0xn4ZVX0vHsa5xyIMjMFHnxRf4bGjUS2bvX3Oe6dBG54gr77xQOeBua+fLLdKLu329uPwMGcOx583wWOeLQCt0k27dTkfbrZ60cCxfyl/n5Z77//POc7/MbmzfzrgMQuflmkU2brJbIMfPmMdIiPt5cfP0vv/A7ffRRoCULLt4kT23dymMxZoz7bWfP5rZPPeWrpJGJzwodQGsAWwHsAPC8g/WVAfwEYD2ADQDauhszFBW6CJNpYmJEduywTgajUNfw4Xx/7hxnSY8/bp1MvmKzMcHnqqs4Yx86lGGPocaWLSK1azNxZvx412GCNptInToMudPQTHjDDa632baNF80mTTwPG9UQnxQ6gGgAOwFUAxAL4C8AdXNtMwVA38uv6wL41924oarQDx6k8uzc2Vo56tYVadvW/r5TJ5FSpVihLz9z9Cgr6AG0uy5ZYrVEeTl9mvkAgMhDD7k2qYwfz+3++ito4oUsEybIf6UrHHHhgsj11/OivmdPUEULK1wpdDP10BsD2CEiu0QkHcAsAO1y+1YBGAFLxQGEWJM385Qrx8JTn38O/PmndXIkJQGrVtkjC5KT2Znnxx+tk8kfxMcD06bxe0RHMyu2SxeGvIUKV1zBsNHhw3ke3HQTo58c0a0bozOmTAmujKFIp078TXPXRjcYOBD46y9mQVeuHFTRIgdnml7ss+8OAD7I9r4bgHdzbVMOwN8A9gM4CaChu3FDdYYuInLyJJ14rVtbJ4NRqGvjRr6/eJEOuB49rJPJ36SlschXbCzrZ0+eHHpO00WLeC5ceaXI4sWOtwlH56i3tGkjUqlS3t9x+nSez889Z41c4QR8nKGboTOAaSJSEUBbAJ8ppfKMrZTqo5RKUUqlHDt2zE+79j8lSjC2ePFiJh1ZQVISn3/9lc+FCjFm+quvmHwSDhQsyJZxGzYwHvmxx4BmzYCNG62WzE7r1qwDU6kSk7zeeCNvvfXHHgPOnNHNvQGga1fG9a9caV+2ZYv9t339detkiwicaXqxz76bAliS7f0QAENybbMJQKVs73cBKO1q3FCeoYvQ3lehAp03VtQnsdlY8+Phh+3LFi3iLOfrr4MvT6Cx2VgzpGRJOqWffz60ZrznztGvAtC+fuaMfZ12jto5d06kSBF7xcRz50Tq1WPkkNmQRo1r4KNTNOaygq4Ku1O0Xq5tFgHofvl1HdCGrlyNG+oKXURk6lSxNFb2vvvoODRIT6fCs9phG0iOH2fbMkCkalVexEIFm01k3DhGwNSpI/LPP/Z12jlqp1s3JgxdvCjSvTvDHw3nt64n7zs+KXR+Hm0BbAOjXYZeXvYagHvFHtny62Vl/yeAVu7GzA8KPSNDpFYt/nmtSOoZM4a/0OHD9mWPPcYonHPngi9PMPn5Z4YPAozwsTrZKzs//sgZ5xVX2O+WwjVz1BsWL+bvdvfdfH7pJS7X9eT9g88KPRCP/KDQRUTmzBHLkkdWr+a+szfg+PFHLvvii+DLE2zS0kSGDaOiLF6cDaBDxWm6dy9T1w2FlZWlnaMGGRl2hd2ihX0y5KzTkauyApq8aIXuAzYb08ErVTJf58NfXLokUqiQyNNP25dlZoqULUtzTKSwbRvrhAC0U4eKWePiRbt5qG1bztbDMXPUU86csSvrLVvsy53Vk1fKOlnzI64Uur+iXMIWpYCRI+m5f++94O47Npa1p41IF4Bxvh07At99x8iKSKBmTWDZMlZw3LkTaNCAjYrdlYoNNIUKsRH1e+9Rvqef5vJIjkkXYUSLwYoV9tclSzr+jI5J9x9aoZvgttuAO+5goomjWtGBJCkJ+OMP4OJF+7LkZIYufv11cGWxEqWYgPTPP0CPHmy0UK8eL2xWy/X44wxvNeqkr1nDUMxIZMoUJmMNGwbUqsWLMMDj4ei/ExfH/5XGTzibugf6kV9MLgYpKZLDwRMsjBZfy5fbl9lstDtmLw0QaaxYwfIIgEiHDmyqbTUHD9KBbpgS8nuZBk/54w/6O+68kz6FYcN4HP74gxFLxnGJj9dRLr4AbUP3Dx07MsY2e9RJoDEKdY0YkXP54MGM1z5+PHiyhBqXLrGAWaFCLPj07rvWlxi+dMmuuJo2FTl2zFp5Ak32MMSYGGb8Hj3KdTt32o9FbCyVeqlSDL/VeI8rha5NLh7w+uvs+RjMbLerrgLq1MlpRwdodsnMZOZopBIbyzZ3GzeyY86AAXy2sgZPbCzwyy98vXo10LAhsG6ddfIEEqMl3549VNuZmTQNLl3K9dWq2bcdPRo4fJj+nwIFrJE3EtAt6Dzk8ceBjz6iLTf7CRtIevdm38vjx+0NfkXYiLliReCHH4IjRygjwj6hAwcCqal8fvVVNkW2Qpa6denALVeOhccmTwYeecQ/42dlsdVc9kd6et5lzpb7a9nixTl9OwZG0+xPP7V/56eeAsaP58Tkppv8cxwiFd1T1I8cPMgeiPffb3f4BJpp0+gI3LSJisLglVfofDpwgIpDA5w8yTo8kyez/srEicA993CdSE5l6Itic7ft6NGcsdaqBWzdapevfXs++7JvZ709/YlSvNsoUMD+yP1+0ybnn12zBmjenN/fcBBXqRL6zc7zA1qh+5khQ4A33wTWrweuvz7w+9u+Hbj6akYQ9O5tX755MyM9JkwAnngisDIYt9SBnPH5c8zz56ncs7IY6qkU5Q8G0dHcr0GpUry7MoiP58XGlbIMxDJPto2Odv89q1SxN8vOTsWKPF9iYljY7O67gbVrgeefZ3EzjW+4UugxwRbGF4yO63v3MnZ1+HCGsgWbwYOB99+n/fbbb91vb7P5rrAAxvcqlXM7APjf/3hbH0hlGSxl6KkSiotzvl1UFC96v/3G161a0cZeqJBvys7VspgYu1msa1fgm2+o9OLiWI2xZ09u8+67lCU/M3w4behGuCbA71m4MLB/P+v5lyplt5mXL2+NnJFEvlHohgPGOHn27AEefZQJP61aBc9uaDxOnWIMtFK8rXS1bfbZmi+I5JyhZ2f4cLtSMauEihXz/8zOl2UxMYG5Hd+1C+jfnzbfEydojmnQwP/7yc1jj/G8/eILmsw6daLJ7L77gFtu4Z2VcZHOjxiTKWOSVakSUL068NNP9GfccAPXGwlwf/xhiZgRRb4xuTi7vfMH0dGeK6HMTHsW3IMPurc3+rpswgRmJaakABUq2Jfv2wdccw1ttoMGBeb4hAMiwJdfAk8+CRw9yrua117jRS2Q+6xbl/X1V6+2Lz95kspw0SLO2CdO5F1Dfue994B+/WhaueYau6I3VEyxYox0iYuzVs78jiuTS76JQ3dWBwIQmT9f5NtvRZYuZbf2lStF1q4VWb+eHX+2bhXZtUtk3z6RI0dETpwQOXuWxZ98KfY0ebIErT75qlXc11df5V3XqJFIPgzrt4STJ0X69eP5VLFi4EsjjxsnDsvqZmaKvPgi1zVqxGJf+ZnlyxmH3qaNyKef5q2qGBvL51mzrJY0/4NwSCxyVqktJoaK2woyMkSuvpoF/AOd0JKWxiy8Z57Ju27sWB6LbdsCK0M4sXq1yHXX8bi1axc4hequrO68eUyKio/nZCQ/smcP5b/6al4wnf1Xo6NF7rnHamnzP64Uer5JLBo+PO+tWsGCjDNu0gSYNClva7BAExPDJKNNmwIfwliwYN5CXQYdO/JZt0AzT5MmNF+NGsXCWnXqME7a387fkiWBDh2Azz7L6Tw0aN+eTtuSJYHbb6cMFllBveLCBfoE0tKA+fNpXtq71/G2WVk0M2WP+NH4GWeaPtAPb1L/HXU7OXqUt3lGTY9Tpzwe1idsNpo7KlfmLDqQPPecSIECbI+Xm2bNeKeg8Zzdu1kXBxCpX1/k99/9O/7y5eK2rO6ZMyL338/tHnoof9RUt9koq1IiCxbYlzuboZcrx+eJEy0TOSxAOJhcXJGVJTJqFG/pqlYV+e03vw1timXLeCTfeiuw+1mwgPv55Ze86yZO5Lq//w6sDOGKzSby5ZdUOlFRIk88IXL6tP/Grl3bfc9Rm401e5SiOWjnTv/sP1CMHs1zbtiwnMunT+fEw1FnomuuYY0bjfeEvUI3WLWKM+UCBahcg9ncuWVLFh7ylxJwxPHj4rBQlwgLhkVFiQwdGrj9RwKnTokMGEClWr48u0X54zxy5hx1xKJFIldeyUco9VTNzuLFPN8eeMDx8Slf3q7MCxa0V1UcOZLLQv1iFcpEjEIXYXXCe++V/5xdqakB2U0efvuN+3zllcDup3Ztkbvucrzu9tvZVDqYF7JwZe1akRtu4G96990i//7r23ie9hzduZOzdKVYUTKUftPt21lV8dprGS3mCEOZv/Yanzdt4vK9e+3LNd4RUQpdhCf/+PGcqVeuzIiGYNChg0jRogyNDBS9enHm5ijc8oMP+Iv62wYcqWRkMIIoLo6PMWN8q3Huac/Rc+dEOnfmb3rffbSzW82ZM6xDf9VVzmfZFy/aFfqRI/wfPvWUff2ttzIiJpQuUvmJiFPoBr/9Rpt6TAxt7IFuMPzPP7Tj/+9/gdvHRx/lnPFkJzWVf55BgwK3/0jk338ZbgeIXH+9yJo13o1jxjmaG2NyEh3Nu7N//vFu3/4gK0ukfXuaWpYtc77dl1/ye95wA9936CBSsqQ9aGDqVK4Ptq8rXIhYhS7CuNgHHuA3bds28A0HevemUt29OzDjb93K7zJliuP1d9/NhtaBvnhFGjYbk7oqVKAZpH9/zyOqzDpHHfHTT4z1LlaMiXRW8OqrPPfGjXO9XePG3O6dd/h+6VK+//xzvj95kolGgZz4hDMRrdBF+Ed6912eRBUqOI4S8Rf797ODTrdugRnfZuMf+5FHHK+fPp2/6sqVgdl/pHPmjMiTT3KWWq6cyOzZnpkOPHGO5mbvXpHERH7+xReD251p3jzut1s319/35Em7uWXxYi7LyuKd8m232bd74AGR0qUjr02fP4h4hW7wxx8iNWrw9nX48MDNYgcP5ixuw4bAjN+uHb+HI86c4QVlwIDA7FtDfv9dpEED+52f2TsyT52jubl4UaRnT+63TRuWsQg0GzfSN5SY6DgHIjuGHyd35vLrr3PZ9u18b1wgQjWKJ5TRCj0bp0+LJCfzm99xR2D6g6amMgrg7rv9P7YI/QGAc9k7dNCzn2CQkcHw2KJFRQoXFnnzTXP9Mj11jubGZhN57z2a9qpXD9zEQYQXjBo1RMqUYS0kd7RowXNTqZyJdgcOcCL13HN8n5ZG536XLoGRO5zRCj0XNhtt0IUKiZQtK/LDD/7fxxtv8OiuWOH/sX/9VZwW6hIRmTOH67//3v/71uRl7146CwGG8q1a5Xp7b5yjjli1imafuLjAFL3KzBRp1YoXDjMmvP377UX0KlXKu75dO14YjItenz6U3Vnoo8YxWqE7YcMGOqmUYvy4P22S58/zz5aU5P/wLFeFukR4W1y0qMijj/p3vxrXzJ/PCo5KiTz+OO3JjvDFOZqbgwd5jgE8H/x5V/bssxx38mRz248Zw+1Llxa55Za86xcu5Pq5c/n+l1/43kg60phDK3QXnD0r8vDDPBItWvAP4i/ef5/jfvON/8Y0SEpyrRC6dOEt7aVL/t+3xjlnzjDmOiqKs9FZsxxf0H1xjubm0iXa5AE6Ho8e9X3MGTM43uOPm/9M/fq0s5cvL9KjR971mZm84N15J99nZbHuS+vWvssbSWiFboKPP+btX3y8yJIl/hkzPZ32x2uu8X9EwuDBzgt1ifAiAnBWpAk+69bZI1LuvDNvEo6vzlFHTJvGMStXFklJ8X6cdetojrz5ZvMTgs2b+V0NU2Pu+i4GL7/MOxjDifzCC7z4BcKXFa64Uuj5pnxuoOneHfj9d6B0aaB1a3Zb8bWUaoECLK+7cSMwc6ZfxPyPpCS2t3PW9KlVK5Yy1SV1raFBA3a+nzCBvTXr1QNGjrT3gXVXVtcbHnnEXl45KQmYNs3zMY4eZUnfUqWAOXPYPcsMM2eyl2rjxnxftarj7Xr25PNHH/G5Sxf23J01y3NZNQ5wpukD/Qi1GbrB+fO0PQOcoZjx7LsiK4vhbVWq+Le87rFj9hmRM3r1YiKKu1AzTWDZv9+e3Favnt3B6C/naG6OHqXpBeAdgNlZdnq6SPPmnJ17MsO32USqVWMtIcNO7sox3KYN80EMe79hqtGYA9rk4jkzZtCxWLIk29v5wpIlPNITJvhHNoNatVyHRhplfQ0nlMZaFiygOQRgRnFqqv+co7nJyGAJCID+FjO+oX79xCsn5erV/NzHH/McdxVSK8LorOy+JaPjlpVlDfITWqF7ydatrN0B0ONvJsbYETYbZ0zx8f4tsNSzJ4skOUuQyshgxMGDD/pvnxrfOHuWijY6mr9Nly7iN+eoI2bNom+oXDmGuzrDqK/iLHLKFQMG0HZ/+jQdwnFxriO70tPpMDba0R04QDv6Sy95vu9IxGeFDqA1gK0AdgB43sk2HQFsBrAJwEx3Y+YHhS7CzLy+fXmkmjTxvozq2rUc4//+z3+yffghx9y82fk2/fsz6SUUKvVp7Kxfb695olRgE2w2bGACUoECIpMm5VW2v/7KdXfc4XnYY3o6JyodOvB9u3YMAnDH889Tie/fz/d33MHyALoCo3t8UugAogHsBFANQCyAvwDUzbVNTQDrAVx5+X1pd+PmF4Vu8MUXzO4rUcL7TvH3308zjj/CykR4iwpwduWMFSu4zYwZ/tmnxn9kZrLTlNHd55VXAhdmeuKEvc1ejx6cqIhQoZYtSxu4N70DFi3imMZ/4tprzTWC3rFDckTDTJvG967uIjTEV4XeFMCSbO+HABiSa5tRAB51N1b2R35T6CI8CRs25FF78knP/3xbtnBWMnCgf+Sx2dglqXt359tkZdEBpbuthy5z58p/9U/q1Alc8bisLJo1ADoht20TadRIpEgR71sXdu3KSU5aGs/HIkX43zBDy5aMQ8/KormmcGHa8TWu8VWhdwDwQbb33QC8m2ub+ZeV+q8A1gBo7WSsPgBSAKRUrlw5eEfAj6Slseyn8afwtJVWr16s+uhrBxyDe+8VqVnT9TZPP81ZYDAKOWk8x8gcrVXL3mC5V6/AdduaP5/RT8ZFxFkJCXecO0cFbmQkHz3K8d5+29znZ82SHFUZk5MZhKCT4VzjSqH7Kw495rLZ5VYAnQFMVUqVyL2RiEwRkUQRSYyPj/fTroNLwYLA228D8+YBO3YA9eszXtcsr74KKAW88op/5ElKArZvZ/ywM5KTGf88b55/9qnxL0oBffoAW7cyHnvwYMaQ167NOHXOhfxHu3ZA16729//+69k+ZswAqlQBihYFzp8HypTh8l27+Fytmrlx2rdnPP7UqXzftSuQmgosWWJeFk0unGl6sc+qzZhc3gfQI9v7HwA0cjVufjS55Gb3bpEbb+Qso29fu13SHYMG0RHm7W1udlauzGnDdIQRJ9yqle/70wSG3Jmjf/1FJ7yRzr91q//29f33jLK57TZ7UbHOnTnjdsf06YxiMWb3AN9Pny4ycybfb9xoXpann2ZHscOH6WAtVUqkY0fvv1skAB9NLjEAdgGoCrtTtF6ubVoD+OTy61IA9gEo6WrccFDoIjwJjXjfG27IWQPaGampIsWL01ziKxcv0oTjru3cCy/wTxzIfqca38hdVjcri2Vyixensv+///M9OW3XLoa61qlDu7XNJjJiBCcY111HP5ErDJNQ7kdCgr3muSdlgY2SAW++yff9+zOx6fRpb79h+OOTQufn0RbANjDaZejlZa8BuPfyawVgHBi2+DeAZHdjhotCN1i4kH+UokU5U3HH8OHiN6/+TTeJNG3qepsNG7i/SZN8358mMDjLHD10yF7Dv1YtkZ9/9m78c+eotEuUyDvxWLyYxdxKlHDddMIoj5v7oRTt/mXLei5Xs2aseWSz5UxS0jjGZ4UeiEe4KXQR1sU2Spk++qjrmcq5czz5mzXzPfb22Wc5S3dl8rHZ2K29eXPf9qUJHO7K6i5axFhtgJFNnvTHtdmYYBYV5Vxh79zJRDqlOOFwdF4ama6OZugtWnBy4SmffsoxfvyR+6xenREwGsdohR5EMjJEhgzhkb3mGtdJP5MmcTtfSwvMn89x3DXTeO01/ll9rU+jCRzuyuqeP8/zKyaGESHTppmbEBh3hIZpwxnnz4s89BC3ve++vKaPe+7Jq8wNG3pCAsMYPeXCBd4ZdO7M96+8wvPUSDrS5EQrdAtYvJgZdHFx/NM5Ij2ds5HrrvOtv6kRLjZypOvttm7ldu66tmusw2xZ3b//5mwYELn1VuY4OGPhQirIzp3NKX+bTWT8ePpcate2j/3mm/Kfk7ZyZY6ZkEBlfumSb+n7AwbwLvP4cZqDAJHRo70bK9zRCt0iDhzgnw1gEw1HUQSff871vnZtufpqc8lD9esz5VwTupjtOZqVxVaKJUpQGb78cl6z25YtHKt+fc97mP70EyclxYqJ3HUXz9NOnRzX9t++XXyyfRs+nvHj+b5xYwYZaPKiFbqFZGbabyFr187b0Dcriydu1aq+JVT06MFbcHczMGOW5WlClCZ4eFpW9/Bhe5GvmjXtPXJPnaITtVQp7xPZ9u7NaV5x5qdZupTrly/3bj8iDAGuU4fnsFG10R+hveGGK4WuG1wEmOhoJhN9/z1w6hQbAHzwgT2RIyoKeOMNYPdue4KFNyQlMSlj61bX23XsyGfd+CJ0adaMSUVTppjbvkwZYPp0YOlSNoto2RLo1o0NNHbuZOJbQoJ3smzalPP9/fcDJ0/m3c7TpCJH9O4NbNnChiCdOvG/M2OG9+NFJM40faAfkTJDz87hw2wCYCRyGBUQbTaaZkqX9r4D+pYtHPeDD9xv27Qpoxk0oYu3PUcvXBB58UXaswHO3L2Nolq5kvVVbriBDa/ff58lJKpXz3unOXgwzT6++ILOnmXY7yOP8H2bNiKVKvk2ZjgCPUMPDcqUYVrz669zhtygAbB+PVO/33iD6ftvveXd2LVqMY3aaEHmiuRk4K+/OBvShCYPP8wyE2Zn6QaFCwPXXceZepkynOHeeqvnv/WffwJ33QVUqsRztkQJ4LHHgOXL2TKvSZOcbeN27WI5gCgfNErRosBDDwGzZ/NutmtXYN8+YMUK78eMOJxp+kA/InGGnp3ly9kdvWBBllC12RgmVqyYZ/HF2bnnHjpH3XHwIG36r7zi3X40wcGsczQ7f/7JyKqmTTlb/+ADJgwVKMCZu5l2hFu38m6xUiWRPXvyrj940J5v8cwzDNVt2FCkdWvzcjojJYXjTpxoL/7Vu7fv44YT0E7R0OToUd5WAmwQsGoVb5Wfftq78UaO5Fhm6q23aEGHmW4oELp46hw9fpy9a8uXz9ly7sgRkW7dOFaNGmxN6Ix9+xiSWKqU65Zwly4x1BDguQT4r/Rt/fo0CdpslLt4cfN1kiIBrdBDmKwskVGjGPNbtSpj0qOjWcM8e5yvGYxmFvPnu9928mRuu369L9JrAom7zNHsZGQwPjw2VmTNGsfbfP89o2AM23ruuj5Hj3J/V1whsm6dORmNxhSGX8gfGAl3v/1m78er++La0Qo9H7BqlfO0aiMTzx1Goa5nn3W/7bFjzDZ87jnfZdcEDrPO0YEDxVQc+MWLjFcvUIDx61Om2BtMNGzIwliehh5OmWI/V/1Rg+XUKZ7zvXvzQlWmDM2RGqIVej4hNZVRBc5qZZihaVPz9TRat+a42uwSupjJHP3kE54j//uf+XG3bBG55RZ+rmlTKvOYGO/KUHz5Jce56ir5z/Tia5OK7t0Z8XL2LC9WsbG6QYuBK4Wuo1xCiKuuAtLSHK/bu9fcGElJQEqK83Gyk5wM7NkDrF1rXkZNcClZkvHkn33G6JLc/PYbm2O0aAGMGWN+3Nq1gZ9+Yk5ESgqwbh3Qti0jYjxl924+b98ODBoETJoE3HYbcOiQ52MZ9OkDnDvHSJquXYH0dM8ayUQqWqGHGJUre7Y8N0lJPPnXrXO/bfv2QGxszvAzTejRpw9w5kzeZLDDh5noU64cQ/0KFPBsXBHgxx/ZzappU2DBAuDaaz3vGLRrFy88V10FjB7N82n9eqBhQyYJeUOTJkC9egzbbNCAF6Dp070bK5LQCj3EGD4ciIvLuSwujsvNcNNNfDYTj168OGdls2cDWVmeyakJHo4yRy9dAh54gFmb8+cDpUp5NqYI8MQTwMyZwIgRVLw//gjExACtWwOdO/OCYYZdu3JmiHbqxLu+uDjO+CdN8ryNnlLMHP39d2DDBqBLF+CXX3hHqXGBM1tMoB/ahu4coxSpp1EuBjVrmu+GZDTq9bZpgiY4ZHeO2mx0GAIiX3zh3XgvvsjPP/tsTh9KWho7I8XGMlzwvffcZ2rWqOG4bdyJEyJt23I/PXp4HnqYmmr3H+zcyXFGjPBsjHAE2ikaWXTvzjhiM87Oc+cYUfD444GXS+M9x49Tyfbvbw/rGzLEu7HGjpX/mrA4O0f++cceX960ad5Uf4PMTEbMPP+84/VZWSypC4gkJjpOVHJFly68sJw/z2SmunW1E18r9Ahj6lT+sq4SQ7KTnMwLQHp6YOXS+IbReALgzNdRGVt3fPghP//gg+4/b7Oxm1CpUoyAGTw4bwnoPXs43pQprseaP59Z0KVKsTORWX7+meNPm8a7BZ074Vqhaxt6GJKUxGczdnSA0S7Hj9OGqgld2rSxv545k9UIPWHOHNql77yTDkZ3n1eKVRv/+Ye1ZUaNAq65Bli0yL6N2SqL7drRHh4fD9xxBzBunDm7evPmwNVXsxLpgw/S8audo87RCj0MqVWLEQdmFXrr1nSQ6miX0OXCBSpBgIWyihf37PPLlrHwVdOmwNy5jG4yS8mSwIcfsjBXoUJ0pHfsCBw8aFfoVau6H6dWLTpL27UDnnmG8pw/7/ozSgGPPspz+cgRXtRmztROfGdohR6GREUx2sWsQi9YkCGMX33F6AlNaCHCmfWffzK++9QpRn6YZfVq/r516wILFwJFingnR/PmlGHYMIY41qnDCKmoKFZlNEOxYrxTGDGCYZhNm7JmuyseeYQz8w8+YEz6oUPAzz979x3CHa3Qw5Sbb2azi+PHzW2fnMxY58WLAyuXxnPGjuWsdNgwKtDYWPNldTds4Iy6fHl7GVxfKFgQePFF4O+/2axlyRIq29yNMFyhFDBkCE03+/cDiYmuz7vSpXlB+vRTmmuuuEKbXZzizLge6Id2igYWo1DX11+b2z49nS3skpMDK5fGMxYvZgXODh3s0R0PPWSurO727ayDUqGC9y3oXGGzMWSxQAEWlBs0yHHfXFfs3MnKikqJvP668xBJo8XdzJkiPXvSweppj9RwAdopGnkkJnImZ9bsUqAAU8wXLHBv19QEhx07eOdUrx7w8cec2QJsNOEoczQ7Bw5wNpuVRfu5ty3oXKEU5UhOBnr2ZOkBw6xjlmrVmNTUuTNn/g88wDFz07Il7fRTp9LscvYs8M03/vsu4YJW6GFKoUJMvTar0AH+MS9cAL79NnByacxx9iydh1FRwNdfs5uPgbueo6mpQKtWfF68mLbuQHDuHLts1alDWVasoJz33MPJwYED5saJi6MJZfx4Kukbb2RkTXaiooBevVh/pkIFPrTZJS9aoYcxRqEus47OZs1YF0RHu1iLzcYwwa1baTPPHUGiFOu7rFmT1zl69iwjQXbu5N1Ww4aBk/Pff/lshCzefDNruIwYwUlBnTrAO++Yi0hRChg4kM3UU1Npn58/P+c2PXow1PKjjxghs3ixeR9RxODMFhPoh7ahB55582h3/PVX85958kmmW586FSipNO549VX+buPHO98me+aowcWLzO6MjhZZsCDgYsrXX8t/jShys2OHSKtW9gzRP/4wP+7evSKNGvGzQ4fmTIBq147t8X7/Xf5rVRdpQGeKRiZHjvAXHjXK/GdWr+ZnPvkkcHJpnGNchB95xH2Ke3bnaEYGlZ1Sntf+8Zbx4ynr8eOO19tsIp9/TsdsVJTIU0+xvrkZLl4U6dWL47duba+FvnAhl82ZI3LttSxLEGlohR7B1KzJP7pZbDYWBGvTJlASaZyxcSObOjRqZK6QlVFgC2AzZUDk3XcDL6fBE08w2sTdhefECZHHHqN8lSqZa5EownHff59RNNWqsTBZZqZIxYoid95p76G7Y4fv3yU/4Uqhaxt6mJOUxCgCMVm+VCmWP122TNsng8nJk4y1LlKECV6FCrnefsYMe+YowMikAgV8jzP3BKNsrhF944wrrwTef58O+uLF+T3vuw/Yt8/155RiRM/y5WzY0rQp8OWXjKhZutRe4mLmTL98nbBAK/QwJykJOHaM3WTMkpwMZGZSsWgCT1aWvXvUV18BFSu6/8zQoXk7GGVkcHmw2L3bfQ2X7Nx0E/DHH8DIkUxIqlsXeOstnmuuaNqUDVsaNGB44+bNnKAsXcp669One15vPVzRCj3M8bRQFwDccAMLIulol+AwZAiV08SJ9gYl7nDWktBsq0JfEcnb2MIMBQoAzz3HzNKbbwaeeophiu46bJUtC/zwAzBggL0V3Ztv8kK4bRujuTQmFbpSqrVSaqtSaodS6nkX2z2glBKlVKL/RNT4gqeFugDe6iYns16GL30hNe6ZOZNt2/r2Zb0Ws/jaqtBXDh+mGcRThW5QtSrw3XdMjjp4kGGKAwcy7NIZsbEMg5w2je/T04EtW1iOQMekX8aZcd14AIgGsBNANQCxAP4CUNfBdsUA/AJgDYBEd+Nqp2jwuPtukdq1PfvMpk10OE2YEBiZNCLr1okUKiTSrJnIpUuefXb6dDYmMZyiAN8HK8Jl5Uru87vvfB/r1CmRfv0YoVOhgshXX7l3tK5Zk/O7ly7NSJ9IAD46RRsD2CEiu0QkHcAsAO0cbDcMwJsATPSb1wSTpCRm3qWmmv9M3brAdddps0ugOHqUzsH4eJoQPClnC7DH5pQpTOlXis9TpnB5MNi9m8/eztCzU7w4zU2rV7NU7/3389i4Mh/deCPL6hocPcoZf6RjRqFXAJDdH73/8rL/UEo1AFBJRFwmjSul+iilUpRSKceOHfNYWI13GHZ0TzuwJyfzM7oxr3/JyGCzhmPHgHnzWE3QG7p0YbamzcbnYClzgPZz40LiL268kbbw0aOZMVq3LiN5nDlNn89l/G3XjuabSMZnp6hSKgrAOADPuNtWRKaISKKIJMbHx/u6a41JEhPpjPLEjg4wfBFg+rnGfwwcyA72H34Y2NT8QLJrF+upuAuv9JQCBYBBgxjJcuutbITRqBG7HeWmenUW7UpIsDf8qF3b8/M8nDCj0A8AyF6+vuLlZQbFAFwD4Gel1L8AmgBYoB2joUPhwp4X6gJ4O924sTa7+JMPPgAmTaLSeughq6XxHm8iXDwhIYGFuubMoTnlxhuBJ54ATp/OuV3v3ryDfOIJvj97lheCSZMiM5TRjEL/HUBNpVRVpVQsgGQAC4yVInJaREqJSBURqQI6Re8VER1IFEIkJXGW42lHok6dGDu8bVtg5IokVq0C+vVjJcSRI62Wxjd27TLXds4XlGI53S1bGK44cSLNMHPm2JV1+/a0u2/ezItAkyY8vv37MwEpLcI8em4VuohkAhgAYAmALQBmi8gmpdRrSql7Ay2gxj8kJVGZu4v3zU3Hjnx2VXtb454DB6icKlfmHY+nDZ5DibQ02qoDOUPPzhVXABMmsLpk6dL0P9xzD/0GBQuyRd2CBcDttwO//ca7oJdfZnjjzTcHLzY/FDBlQxeR70TkahGpLiLDLy97WUQWONj2Vj07Dz2MhBVPzS4VK7Ks7uefR+YtrD9IS2Oq+7lzrG1+5ZVWS+Qbe/bwXAiWQjdo3Jh3mePGMUeiXj06ULt3p+M0M5MO4tmzgf/7Px7r7dtpbvzxx+DKahU6UzRCKFMGqFHDO4dRcjJvezdu9L9c4Y4I8PjjVESffUYllN/ZtYvPwVboABATw+zSzZvpEB08mB2Mrr+e53b9+vYko3vv5Yw9Pp7dm8aODf9JiVboEYSnhboMOnRgxxhtdvGcCROATz4BXnmF9t5wwFDogbahu6JyZc7Av/qK+RUbNrBlX5kyDH3cupXb1aoFrF3LY284osO5xaJW6BGEN4W6ANotW7ak7TfcZzj+5IcfGHbXvj1tuuHC7t0MVyxb1lo5lKIpa8sWOpsBmlaUylkKoFgxOlLfeIOTkqZN2dEpHNEKPYLwplCXQXIy/wSeOlUjld276VCuVQv49FPe4YQLZsvmBotixYB33+XxzsjgpGPsWPudBEBZn3+ebev272duxqJF1skcKMLoNNO4o3ZtOuS8Uej33cekDx2T7p7z5zkrt9loFihWzGqJ/EugY9C95cUXqcwrVAAuXmSI45tvUskbtGrFSUlCAnDXXcDrr/N3Che0Qo8goqIY7eKNQr/ySqB1a96yhtMfwN+IsJnxxo28+NWoYbVE/sXbsrnB4NprmYAUFcVwxvLlOStv0CBn2YuqVfn+oYeAl15i7ZgzZ6yT259ohR5heFOoy6BTJ96ueloTJpJ44w121Rk5ErjzTqul8T+pqczGtNIh6orevdkJqXRpKuk5c5hdmpTEaKOTJ7ldXByjjsaPBxYuZEjkP/9YK7s/0Ao9wvC2UBfAMLBChbTZxRnffsvb/s6dGVERbsyYwVkwAIwYwfehRqdOQNGiNLmkprKK5ebNwNNPA1On0uxo5FQoxbo6338PnDhBpT5/vtXfwEec1dUN9EPXQ7eGCxfYdPe557z7fIcOkVV72ixbtohccYVI/foi589bLY3/sbr+uic89phITAzP844d7cvXrRNJTKTsrVrlbC69b59I48Zc98ILbEYdqsBFPXSt0COQG28Uuflm7z47Zw7PmmXL/CtTfubUKZFatUTi40X27LFamsCQkJBTmRuPhASrJctLSgplU4oNRE6dsq/LzBR55x2RYsW4bvhwe3ORixdFHn2Un23dWiQ11Rr53eFKoWuTSwTibaEuAGjblre0OsmIZGWxDvnOnbTXBqsFXDAQoXN35EjnNfFDsU5Kw4bMGBVh2YXszc6jo1noa8sWRrkMHcptV66kOXHqVGDyZOYQNGoE/PWXdd/DG7RCj0CMQl1//OH5ZwsXZkje3Lns6RjpvPwybedvvw00b261NL6Tlsb47AED6Pi89lo2sS5QwPH2oXoBy96f1ZGtv0IFXoC/+YY1dpo142dOnAD69AGWL+exaNqUNvd8g7Ope6Af2uRiHYcP87Zy9GjvPr9wIT+/cKF/5cpvzJ7N4/Doo+57YIYyBw6ITJkicu+9djt5XJxIu3Zcvn9//rKhi9DMYsirFL+DM86dExk0SCQ6mmazzz7j73noEE2TgMjTT4eO3wjahq7JTfXqIu3be/fZS5dErrxSpGtX/8qUn/jzTyqMpk1F0tKslsYzsrJEfvtN5OWXRRo0sCvoypVF+vcXWbSI9uTcTJ9Om7lSfA5VZW7Qo4f9u5mZvPz5J/1LgEjLliLbtvFcHzCAy1q0EDl6NPByu0MrdE0eHn6YsxFvZ5aPPipStCijZiKNY8dEqlQRKV9e5OBBq6Uxx5kzInPnivTsKVKmDP/5UVEiSUkib7wh8vff+fsuwxGrVtkV+vXXm/tMZqbIxImMWCpYUOS113jB/uQTOlErVeLF0Eq0QtfkYfJk/vrbtnn3+WXL+Pk5c/wrV6iTkSFy2238s69da7U0rtm5U+Ttt0XuuIMhfIBI8eIiycmcXR8/brWEgcVmE6lXz67U//7b/GcPHGDIIyBSu7bI8uUMe6xcmb/9hx8GTm53uFLo2ikaofhSqAtg38bSpSMvyWjQIFb0mzyZiSihRGYmm08PHsw6JtWrA08+yczJJ59kU4hjx+jk69KFrdvCGaXcO0edUb48I7m++47O0VtuYQGwZcvYBalXL6Bv3xAMDHCm6QP90DN0a8nKEilRgqYTb+nfn7ehZ874T65QZto0ztiefNJqSewcP87ZdufO/D0BzsZvv13krbdEtm+3WkJrSU3ljBqguSQry/Mxzp9nIl5MjEipUiIffUQnKiBy002czQcTaJOLxhFt24rUqeP951es4BkU6s4xf7B2LRXDbbdZG+1gs4ls3CgyciQjMKKi+BuULi3SvTtNYKdPWydfKNKli93s8vPP3o+zYQOd4IaDdPx4kSJFRMqWFVm50m/iukUrdI1Dhg/nGeBtRlxWlkjFiiJ33+1fuUKNgwfpAK1ShQ7RYHPxosjixYy2qFLFrpzq1xd56SVebLyZeUYKP/9sP2a+3JGK8Di//z59EbGxIv36MWIsJobO1GA4lrVC1zjEONG/+cb7MZ55hrf4J074T65QIi2Ns7K4OJG//grefg8eFJk6lbHgRYrwdypcWOSee+jQ3rcveLLkd2w2kauvlv+cwo5CMj3l0CGauQCRGjXs4Y7duwc+8suVQtdO0QimUSM23fXWMQqwk1FGBjBvnv/kChVEmDG5ejUwbRpw3XWB25fNxl6Yr77Kbjrly9Oh98cfwMMPMxs1NRVYsICZjBUrBk6WcEMp4NFH+fr0aTo6faVsWWDmTHZAyspi39Lrr+d50qyZ81IJAceZpg/0Q8/QQ4PGjUWaNfP+8zYbbznvuMN/MoUKEyfKf9X3AsHZsyLz5on06kU7rJHVeNNNIiNG0GYbbrHhVnHkiD108777/Dv2+fMiQ4bQ7GIU/SpZUuSHH/y7HwNok4vGGU89xRPQqDjnDUOH0jl35Ij/5LKa5cv5B73rLv/ap3ftEpkwgeVbY2P5D7ziCsY8f/ppaGQihisPPsjjHRsbGBPhxo1M1DLKIiglMmaM/y/KrhS6NrlEOElJjLP1plCXQadONBnMmeM/uaxk716gQwfGcc+Y4VuD58xMYMUK4LnngHr12Lrtf//jLfmAAYxpP36cMc/dugHx8f77HpqcGDHp6emBOVfr1WMewJQpbKwBMG+hUyf2mQ0GWqFHOL4mGAHANdcwkSUckowuXGA1yUuX2OC5eHHPxzhxwp68U7o0qzCOGweUK8eWZ9u2sd3Z2LFAixbOKxlq/EvLlvbWedOnB2YfUVG8cPzzD3uWAmxJeO21LLEcaLRCj3DKluWs0ReFrhSdoytWsOdofkWEzrM//6TDq1Yt85/bvBkYNYoZhaVL88+8bBnb9n35JWfh33/Plmc1awbyW2icERXFDE+AM+lAOi7LlOFFY+lSOrh37wbq1AHuuIOBCErxuV8/P+/YmS0m0A9tQw8dunVjYoovtr6tW2k7HDvWf3IFm1Gj+B2GD3e/bVqayJIlIk88IVK1qvwX53zDDfQprF4d2m3MIpUDB1gmF6DjORhcuGCv2Ojo0bevZ+PBhQ1dcX3wSUxMlJSUFEv2rcnJ5MnsiL59O1CjhvfjNGzIjjC//eY/2YLFkiXsxvTAA7RnK5V3m8OHGfK2cCFnXufPs8vN7bcDd9/Nz1eqFHzZNZ7Rvj3NaXXrsiOTo986EERH09fkaHlmpvlxlFLrRCTR0boYb4XThA/Z7ei+KPTkZBaG2rWLZpz8wo4dlP2aa4CPP7b/wW02YP16KvCFCxknDjAGvFs3KvEWLYC4OOtk13hO795U6Js3s8XcDTcEZ7+OlDnAOHZ/oW3oGtStC5Qo4ZsdHQA6duRzfuo3evYs0K4dZ0nz53PZ11/zT1+xIpN8/u//aO98/XXa1/fuBd57jz0ptTLPf7RubU/MCpRz1BHR0Z4t9wat0DWIimLvRF8VekICcNNN+SfaxWbjTHvzZjoz+/VjSdn27YHZs1km9ZNPgCNHmC06dCizAYN1i64JDNHRQM+efD1zpn9nyK7o08ez5d5gSqErpVorpbYqpXYopZ53sP5ppdRmpdQGpdQPSqkE/4moCQZJSVRsJ074Nk5yMrBhA8cKVTIz2eU9OpqzcYCd4XfsoFL/4QfWDZ89m2n3OjY8/OjVixfmQ4eAn34Kzj4nTWINdWNGHh3N95Mm+W8fbhW6UioawEQAbQDUBdBZKVU312brASSKyHUA5gAY5T8RNcHAsKOvXu3bOB068I8SamaXkyd559C1K0PKmjWzrxszBti6lU7hceOA226zJ4ZowpPKlWl6ATxrfOErkyZxQiHCZ38qc8DcDL0xgB0isktE0gHMAtAu+wYi8pOIXLj8dg0AXToon9G4se+FugAmz9x6K5WnRQFUALjvLVuorG+9lbPszp0ZzWIkl1x9NXDxIvDMM3ytiSyMzNG5c5lQFg6YUegVAOzL9n7/5WXO6AVgkaMVSqk+SqkUpVTKsWPHzEupCThxcUD9+r4rdIBml23b6EAMJpcuMZnnyScZrVO3LvDss5ydP/ccsGoVlfypU0yo+vFHhh1qIpO77+bd2tmzwDffWC2Nf/CrU1Qp1RVAIoDRjtaLyBQRSRSRxHhtmAw5kpIYQ+5rn8T77+dsPxjO0SNHGGr4wANAqVJAq1aspVG7Nm9n9+xhaNrw4SwX3KULo1TmzgUquJqWaMKeAgWAHj34OpjRLoHEjEI/ACB7ukTFy8tyoJS6HcBQAPeKyCX/iKcJJkahrvXrfRunVCmmOH/xhf/NLiKUb9gw4MYbOdPu2ZP1qLt04UwrNZX1w/v2pa3UYMgQJgRNmsRoHI3GqJO+eDHLM+R3zCj03wHUVEpVVUrFAkgGsCD7Bkqp+gAmg8r8qP/F1AQDfxTqMkhO5ux47Vrfxzp/PmdjhwYNgFdeofN12DAq+H37gPff5220o9jwGTNoT+/Xz/4n1miqV2fRrsxMRjXld9wqdBHJBDAAwBIAWwDMFpFNSqnXlFL3Xt5sNICiAL5USv2plFrgZDhNCFOuHB2G/lDo7doBBQt6b3bZs4cz6bZtGRverh0rGDZtShPLoUPAmjXAiy8y089VbPi6dVTizZsDb73lnTya8MVwjoaD2UXXctHkoFs3OhYPHfI9geb++6l09+1znw2XlcVtv/2WafZ//83l1asD99zDmXezZp6HEx49ymxPgKn7pUt7/j004c2lS/SnpKYyF6F6daslco2rWi46U1STg6QkOhp37fJ9rORkXhhWrHC8/tQpe2OHMmWYmTlqFGfkY8awpvT27awh3rKl58o8PZ1x8cePM61fK3ONIwoWBLp35+tgxqQHAq3QNTnwpx3dqHVimF1EmMBjNHYoVYpK/7vvgDZtuN3x48zce+YZ1iP35S5h4EBeTD78kHZ3jcYZhl9lxgxr8yd8RVdb1OSgXj126fn1V6a9+0KRIszGmzyZYYxLlvCWFmAHl2efpSmlSRP/FigCgKlTWUDr2WeZUKTRuKJ2bZr0Vqygaa5RI6sl8g6t0DU58EehrqNH7XXDv/qKyyZO5Cz8qac4c08IYLWfX38F+vcH7rwTeOONwO1HE1707k2FPn16/lXo2uSiyUNSErBpEzMszSDCrNDXX+dsu2xZJmysWmWf5XfoQCXfr19glfn+/UwySkhgVIy/Z/6a8KVDB5aR/vxzICPDamm8Qyt0TR7MFOq6cIFJPI89xi499esDL71E5f7qqwwVPHCA5We7d2dCT1paYOVOS2NkzfnzdIJeeWVg96cJLwoXpoP+2DH2f82PaIWuycPu3Xy+6y6gShW75z97Y4eSJdkAeeZMZmx+9BEjWtauBV5+mU5Iw6GZnAycOUMbeqAQ4cXl9995y1yvXuD2pQlfjJj0/BrtouPQNTmYMYMZmdmrz8XEMOlo3+USbVWr2mPDmzdn2JcrMjLY+fz223k7Gwjeeov2+VdfZRapRuMtTZowD+LIEaBoUaulyYuOQ9eYZujQvKVEMzPp6Bw1io0rdu4E3n6b9VrcKXOARZA6dGD6/vnz/pf5hx+AQYPYaeill/w/viay6N2b/wGjJWF+Qit0TQ727nW8PD2dIYB16ngXG56czD/JwoW+yZebXbvYy7R2beDTTxmlo9H4QqdOnKj07s3zKbvZMdTRp78mB9mrE5pZbpabb6bZxp8ldc+d46zcZuNsqlgx/42tiVy+/pqlKNLS6JvZs4dmyPyg1LVC1+Rg+PC81Qrj4rjcF6KjOZP+7jvg9GnfxgL4R+vRg+GVX3zBhhYajT8YOpRmxuxcuMDloY5W6JocdOnCBhEJCTStJCTwfZcuvo+dnEzTjT9skyNGAHPmAG++yaYWGo2/cGZ2dLY8lNBRLpqgIcIImTp1gEUOmxSaY+FChkw+9BDw2We+V4XUaLJTpQrNLLlJSAD+/TfY0uRFR7loQgKlOEtftsz77jD//ENFXr8+67VoZa7xN4EyOwYDrdA1QSU5mQ4no8aLJ5w6xUYXhQoB8+Yxs0+j8TeBNDsGGm1y0QQVEZpcypcHfvzR/OeysmhmWbqUn2vWLHAyajShjDa5aEIGw+zy888sFWCWl15ihMyECVqZazTO0ApdE3Q6deJM/csvzW0/ezbL4PbuDTz+eGBl02jyM1qha4JOnTrAddeZSzL66y/Gm990E/Duu9oJqtG4Qit0jSUkJ7M8r6swsOPH6QS98kpg7lzPe4pqNJGGVugaS+jUic+zZzten5HBzNLDhxnRUrZs8GTTaPIrWqFrLKFaNaBxY+dml0GD2Cx6ypT82w5Mowk2WqFrLCM5GVi/Hti2Lefyjz9mNMvAgb43qtZoIgmt0DWW0bEjnZxffGFftnYtI1latgRGj7ZONo0mP6IVusYyKlRgTPnnnzOM8dAh9gStUIFKPibGagk1mvyF/stoLKVaNeCXX1het0ABKvaUFPYs1Wg0nqFn6BrLmDHDbm4RYWldpdjPUaPReI5W6BrLGDoUuHgx57L09PzRSECjCUW0QtdYRn5uJKDRhCJaoWssI1D9SzWaSEUrdI1l5OdGAhpNKGJKoSulWiultiqldiilnnewvqBS6ovL69cqpar4XVJN2JGfGwloNKGI27BFpVQ0gIkA7gCwH8DvSqkFIrI522a9AJwUkRpKqWQAbwLoFAiBNeFFly5agWs0/sLMDL0xgB0isktE0gHMAtAu1zbtAHxy+fUcAC2V0oVONRqNJpiYUegVAOzL9n7/5WUOtxGRTACnAeRJDVFK9VFKpSilUo4dO+adxBqNRqNxSFCdoiIyRUQSRSQxPj4+mLvWaDSasMeMQj8AoFK29xUvL3O4jVIqBkBxAKn+EFCj0Wg05jCj0H8HUFMpVVUpFQsgGcCCXNssAPDI5dcdAPwoIuI/MTUajUbjDmVG7yql2gJ4C0A0gI9EZLhS6jUAKSKyQClVCMBnAOoDOAEgWUR2uRnzGIA9PsofTEoBOG61ECGOPkau0cfHPfoYuSdBRBzarE0pdA2glEoRkUSr5Qhl9DFyjT4+7tHHyDd0pqhGo9GECVqhazQaTZigFbp5plgtQD5AHyPX6OPjHn2MfEDb0DUajSZM0DN0jUajCRO0QtdoNJowQSv0XJgoFfy0UmqzUmqDUuoHpVSCFXJahbvjk227B5RSopSKuBA0M8dIKdXx8nm0SSk1M9gyWo2J/1llpdRPSqn1l/9rba2QM98hIvpx+QEmTu0EUA1ALIC/ANTNtU0LAHGXX/cF8IXVcofS8bm8XTEAvwBYAyDRarlD7RgBqAlgPYArL78vbbXcIXiMpgDoe/l1XQD/Wi13fnjoGXpO3JYKFpGfROTC5bdrwNo2kYKZUsoAMAysiZ8WTOFCBDPHqDeAiSJyEgBE5GiQZbQaM8dIAFxx+XVxAAeDKF++RSv0nJgpFZydXgAWBVSi0MLt8VFKNQBQSUS+DaZgIYSZc+hqAFcrpX5VSq1RSrUOmnShgZlj9CqArkqp/QC+A/BEcETL37jtWKRxjFKqK4BEALdYLUuooJSKAjAOQHeLRQl1YkCzy63gHd4vSqlrReSUlUKFGJ0BTBORsUqppgA+U0pdIyI2qwULZfQMPSdmSgVDKXU7gKEA7hWRS0GSLRRwd3yKAbgGwM9KqX8BNAGwIMIco2bOof0AFohIhojsBrANVPCRgplj1AvAbAAQkdUACoGFuzQu0Ao9J25LBSul6gOYDCrzSLN9ujw+InJaREqJSBURqQL6GO4VkRRrxLUEM+Wm54OzcyilSoEmGJfVScMMM8doL4CWAKCUqgMqdN3mzA1aoWdD2D5vAIAlALYAmC0im5RSryml7r282WgARQF8qZT6UymV+0QMW0wen4jG5DFaAiBVKbUZwE8AnhWRiGkIY/IYPQOgt1LqLwCfA+gul0NeNM7Rqf8ajUYTJugZukaj0YQJWqFrNBpNmKAVukaj0YQJWqFrNBpNmKAVukaj0YQJWqFrNBpNmKAVukaj0YQJ/w+dyp28Sl2cJgAAAABJRU5ErkJggg==\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["plt.plot(villes[:, 0], villes[:, 1], 'b-o')\n", "plt.plot([villes[0, 0], villes[-1, 0]],\n", " [villes[0, 1], villes[-1, 1]], 'b-o');"]}, {"cell_type": "markdown", "metadata": {}, "source": ["La premi\u00e8re \u00e9tape consiste \u00e0 calculer la distance d'un chemin passant par toutes les villes."]}, {"cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [{"data": {"text/plain": ["9.978361909201357"]}, "execution_count": 10, "metadata": {}, "output_type": "execute_result"}], "source": ["def distance_ville(v1, v2):\n", " return numpy.sum((v1 - v2) ** 2) ** 0.5\n", "\n", "def distance_tour(villes, permutation):\n", " tour = distance_ville(villes[permutation[0]],\n", " villes[permutation[-1]])\n", " for i in range(0, len(permutation) - 1):\n", " tour += distance_ville(villes[permutation[i]],\n", " villes[permutation[i + 1]])\n", " return tour\n", "\n", "distance_tour(villes, list(range(villes.shape[0]))) "]}, {"cell_type": "markdown", "metadata": {}, "source": ["Ensuite, pour voir la solution, on ins\u00e8re le code qui permet de dessiner le chemin dans une fonction."]}, {"cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["def dessine_tour(villes, perm):\n", " fig, ax = plt.subplots(1, 1, figsize=(4, 4))\n", " ax.plot(villes[perm, 0], villes[perm, 1], 'b-o')\n", " ax.plot([villes[perm[0], 0], villes[perm[-1], 0]],\n", " [villes[perm[0], 1], villes[perm[-1], 1]], 'b-o')\n", " ax.set_title(\"dist=%f\" % distance_tour(villes, perm))\n", " return ax\n", "\n", "perm = list(range(villes.shape[0]))\n", "dessine_tour(villes, perm);"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q2\n", "\n", "On r\u00e9dige l'algorithme."]}, {"cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["nb perm 10\n"]}, {"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["def ameliore_tour(villes, perm=None):\n", " # On copie la permutation perm pour \u00e9viter de modifier celle\n", " # transmise \u00e0 la fonction. Si la permutation est vide,\n", " # on lui affecte la permutation identique.\n", " perm = (perm.copy() if perm is not None \n", " else list(range(villes.shape[0])))\n", " # On calcule la distance actuelle.\n", " dist_min = distance_tour(villes, perm)\n", " # Initialisation.\n", " cont = True\n", " nb_perm, nb_iter = 0, 0\n", " # Tant que la distance n'est pas am\u00e9lior\u00e9e dans les derni\u00e8res\n", " # len(perm) it\u00e9rations.\n", " while cont or nb_iter < len(perm):\n", " nb_iter += 1\n", " # On tire deux villes au hasard.\n", " a = numpy.random.randint(0, len(perm) - 2)\n", " b = numpy.random.randint(a + 1, len(perm) - 1)\n", " # On permute les villes.\n", " perm[a], perm[b] = perm[b], perm[a]\n", " # On calcule la nouvelle distance.\n", " dist = distance_tour(villes, perm)\n", " # Si elle est meilleure...\n", " if dist < dist_min:\n", " # On la garde.\n", " dist_min = dist\n", " cont = True\n", " nb_perm += 1\n", " nb_iter = 0\n", " else:\n", " # Sinon, on annule la modification.\n", " perm[a], perm[b] = perm[b], perm[a]\n", " cont = False\n", " return dist_min, nb_perm, perm\n", "\n", "dist, nb_perm, perm = ameliore_tour(villes)\n", "print(\"nb perm\", nb_perm)\n", "dessine_tour(villes, perm);"]}, {"cell_type": "markdown", "metadata": {}, "source": ["C'est pas extraordinaire."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q3\n", "\n", "Lorsque deux segments du chemin se croisent, il est possible de construire un autre chemin plus court en *retournant* une partie du chemin."]}, {"cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["nb perm 25\n"]}, {"data": {"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQQAAAEICAYAAAC5yopxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAArIklEQVR4nO2dd5xU5dXHv2epglTZ0FmUAIIt0RV7IQgLajCxomCLiiWIvrZXxYIYbESTzxuxYIkFFLDEYInoq1hfFbCgEQMigiKgIBZ62/P+cWbYYXZ2d3Z3Zu69s+f7+dzPzNz7zJ1zp/zmec5znnNEVXEcxwEoCNoAx3HCgwuC4zjbcEFwHGcbLgiO42zDBcFxnG24IDiOsw0XhBAjIg+JyJ9E5BARmRe0PU7+44IQAVT1TVXtWVU7ERktIhNr8hoicpuIfC0iP4vIYhG5upK2fUXkExH5UUS+F5F/iEjHhOMdReSfIrJKRJaIyHlJz68XE7qlIrJaRD4UkZaxY41E5C+xYz+IyF0i0iDhua1jr7c2ZucpCceuFpE1Cdt6ESkVkTY1eU/qIi4ITpwHgF1VtTlwIDBURI6toO1coERVWwIdgM+BuxOOTwS+BNoCRwE3iUjfhOM3xF7jAKA5cCqwIXbsSqAY2B3oAewNXJPw3PHApti5hwJ3i8huAKp6k6ruGN+AW4HXVHVlNd+Luouq+haSDfg18AGwGpgCTAb+BBwOLElo99/AN7F284B+wEDsh7IZWAPMqYUdHYFPgCvSaNsIuBmYG3u8I6BAYUKbCcCjsfutYvZ1q+B8s4ETEh6fAnwdu980do09Eo4/CtyS4jwCLAROD/pzjdLmPYSQICINgWewL3hr4AnguBTtegIjgH1VtRlQAixS1ReBm4Apav+Qe8Xa3xXr2qfaPk4695UisgZYgv34HqvE3i4i8iOwHrgMuC1+KOk2fn/32P09gC3A8SKyXETmi8gfk0+fdL+TiLTAegxbVHV+wvE5wG4pTDwE+AXwVEXX4JTHBSE87A80AP6qqptV9UlgVop2W7F/5d4i0kBVF6nqFxWdVFUvUNWWFWx7JrW9BWiGddMfBX6q5LxfqQ0Z2mBd+v/E9q8G3gauFZHGIrI3JmxNYk/tBMR/3DsDxwOjRaR/7PiLwEUiUigi7YCRsf1NsN7Hz0mm/BSzOZnTgSdVdU1F1+CUxwUhPHQAvtFYfzfG4uRGqroAuBgYDXwnIpNFpEOmjFDjQ+yf/4Y02q8CHgb+KSL1Y7uHYj/2rzHfwkSs10HsvABjVHW9qn6MDY2OjO0fC3wIfAT8H9Zr2gx8iw01mieZ0BwbOm1DRJoAJ8TscqqBC0J4WAZ0FJHE7nKXVA1V9TFVPRgowsbrt8YPJbcVkXuSPO+J26eV2FMf6Jam7fWx7nnzmH2LVfVoVS1U1f2wXsTMWNv4MCXR1m33YyIxQlU7quouwPfA+6paCswH6otI94Tn7gUkX8fvgVXAa2na78RwQQgP72Bj65Ei0iDm4e+T3EhEeorIb0SkEeaZXw+Uxg5/C3QVkW2fq6qepwme96Rtt9g5C0TkXBFpJUYf4I/AK6kMFZFjY3YUiEghcAfwYay3gIj0EpFmItJQRIYBA2JtiA1v3gRGxaYYewFDgOdiz+0oIh1iduwPXAtcH3vuWuBpYIyINBWRg4BjsOFNIqcDjyT1tpx0CNqr6VvZhk23fUjZLMMUkmYZgD2xf9vV2L/gc0CH2LGdgLeAH4APqvG6BdjYfRXWLZ8PXA1IQps1wCGx+xdi04prgeVYl78ooe3FwIrY8beA4qTX6xh7vTXYTMC5CccOBRYB67AZlKFJz22NDSPWAl8Bp6Q49xbgl0F/nlHcJPYmOo7j+JDBcZwyXBAcx9mGC4LjONtwQXAcZxv1q26SHdq0aaNdu3YN6uUdp87y/vvvr1TVwlTHAhOErl27Mnv27KBe3nHqLCJSLgI2jg8ZHMfZhguC4zjbcEFwHGcbVQqCiDwoIt+JyL8rOC4i8j8iskBEPo4td3UcJ4Kk00N4CMvGUxGDgO6xbTjbp9JyHCdCVCkIqvoGtuilIo4htrJMVd8FWopI+0wZGCSTJkHXrlBQYLeTJgVtkeNkl0z4EDpiiTDiLIntK4eIDBeR2SIye8WKFRl46ewxaRIMHw6LF4Oq3Q4f7qLg5Dc5dSqq6gRVLVbV4sLClHERoWHUKFi3bvt969bZfsfJVzIRmPQN0DnhcafYvkiybh08+6z1CFLx1Ve5tcdxckkmegjTgNMSMtz8pKrLMnDenLFlC0yfDqefDm3bwpAhUK9e6radO6fe7zj5QJU9BBF5HMvY00ZElmDprBoAqOo9wAtYgswFWJabM7NlbCZRhVmzzCcwZQp8+y20aAEnnQRDh8KSJXDeeeWHDc2awQ8/QKtWwdjtONmkSkFQ1ZOrOK5Y/r1I8PnnJgKPPWb3GzaEo482ETjySGjcuKxtQYH5DL76Crp0gf794eGH4YADbFjRvXvFr+M4USSwFGrFxcWaq8VNy5dbL2DSJOsViMDhh5sIHHcctGyZ/rneeAOOPRZKS+Gpp6Bv36qf4zhhQkTeV9XiVMfyNnT555/t33zAAOjYES6+GDZvhnHj7B//1VfhrLOqJwYAhx4KM2dC+/Z27vvuy4b1TpSJdPxKUNld99lnH800Gzeq/vOfqieeqNq4sSqodu2qOmqU6qefZva1fvxRdeBAe42LL1bdsiWz53eiycSJqk2a2PcivjVpYvvDAjBbK/hdRlIQJk5ULSpSFVHt0kX12mtVzz1XtXVru6KddlK94ALVt99WLS2t8ctUyebNJgagOmiQ6k8/Ze+1nGhQVLS9GMS3oqKgLSujMkGInA8hHkGY7P1v0ACOP978AgMG2ONcce+9MGIE9OhhzsZddsndazvhoqDAJCAZEfM7hYG88iGkiiAEaNfOZg6OOiq3YgBw7rkWx7BsGey3H7z5Zm5fvzIuuADq17cvZP369tjJPFu2wJgxqcUAbJYqCkROECqKFFyyJPX+XPGb38C770Lr1tCvHzz0ULD2gP34774btm61x1u32mMXhczyxRfmbL7+ejjwQBPfRJo0gbFjg7Gt2lQ0lsj2VlMfQtjHaKtWqfbrZzZdcUWwzsZ69VK/V/XqBWdTPlFaqvrgg6o77qjaooXq44+rzpxp73Hr1ubjKioKl0NRNc+cihMnqtavr6H24m7apHr++Wbb4MGqq1cHY0cqMYhvTu1YuVL12GPtvTz8cNXFi23/8OGqO+xgs1BhJa8EQVV1//1NFMKqwHH+9jfVggLVPfcs+8Lkgs2bVe+4o2IxKCjInS35yPTpqu3bqzZooDpunOrWrbZ/zRrVZs1UTz89UPOqpDJBiJwPAcyB07eveW0XLbKZhTAyYgS88ILZuO++8M472X/Njz6C/feHSy6p2JFVWgqXXZbaOetUzPr1FuBWUmJrWWbOtPexIPYreuIJWL3aAt4iS0VKke2tNj2EVq1Uzzuvxk/POXPnqu6yi2qjRtnrzaxdaz6LevVU27ZVnTLFxrjnn1/mS6hXT/WssyxmA1S7dVOdMSM79uQbH32kuttu9r6NHKm6bl35NgcdpNqjR3ZjXzIB+TRkWLXKrB43rkZPD4yVK1UPO8xsv+aasm5mJnj5ZRMcsB/8qlVVP2fGDBMEsHFvmMe8QbJ1q33XGjZUbddO9cUXU7f77DN7L2+7Lbf21YS8EoRZs8zqp5+u0dMDZeNG+8GC6nHH2ZizNqxcqXraaXa+7t2r/2+/dq3qZZeZT6FjR9Vnn62dPfnGV1+p9u1r7+/vf6+6YkXFbS+7zPxay5fnzr6akleCMHmyWT1nTo2eHjilpebwE1Hde2/VJUtqdo6JE1XbtLEv4ahRquvX19ym995T3X13e19PPln1u+9qfq58YfJk1ZYtVZs2VX3ggcqHARs3qhYWmmhEgbwShLFjzeqgpvIyxXPP2fx1+/bW60mXhQtVS0rsPdhvP9WPP86MPRs3qo4ebZ7zNm1sTj3sY+Fs8OOPqsOG2fu7//6qCxZU/ZynnrL2zz+fffsyQV4Jwh/+YE6zfODjj23atHFjcwJWxubNqn/+s8Vc7LijTWlmI+jpk09U+/Sxb8Zvf1uzHkxUef11WyxXr56J4+bN6T1v0CAbckVlxWteCcJhh6keeGCNnhpKvv3WrgdUb7gh9b/yBx+o7rNP2Y/0q6+ya9OWLaq3324BNs2bq06YkN+9hY0bVa+6yoZx3bqpvvNO+s/96it73jXXZM++TJNXgtCpk+qpp9boqaFlw4Yy52C3bttPE+61V9lU4tSpuf1hfv65ReGBOdfS6T5HgcTl8x06lIXDn3129YeiY8bYcxcuzIal2SFvBGH9evsQR4+u9lNDT2mpjVlTRRb26pXeVGI22LpV9d57raewww7Wc4hK1zgVqRKYxJPcVJetW01Mjjgi42ZmlcoEIVKRiosW2cfXrVvQlmQeEcv3mIr584PL8lxQYPknPv3UVnFeeqmt6Pt3ytK/4aei5fP/+Ef1z/XKK1a/I9KRiUlEShC++MJu8zUBSXyZcrr7c0mnTjBtmuWcWLgQ9t4bbrgBNm0K2rLqUdHy+ZoU4HngAVvu/rvf1cqkUBFJQcjHHgJUXBymov25RgROPhnmzrXsVKNHwz77wI03RiepaLt2qfdXN4HJypXWqzj11O1T90edyAlC06bwi18EbUl2GD68evuDorDQegrTpllimuuui0ZR3DVryicvgZolMJk40XpH+TRcgMzUdswZX3xhvYNUH2o+cNdddjthgg0T6tWzH1d8f9j47W+tktWPP26/f906q3q1cKH9I7drZyXy4reNGuXeVlWzadkyuOoqE7R4AZ6xY6u3YlbVhgt9+sAee2TP5iCIVJLVXr1se/rpLBnlVJuKkopWRqtWZQKRLBiJW5s2lgeypkyaVFZ5q1UrWLXKhjfXXFPzcwK8954tMZ8wAc45p3bnCoLKkqxGpodQWgpffmll15zw0KVL6krZRUUwbx58953VzVy+vGxLfDx7tt2uWVP+HCI2PKlINBIft269fc8xOTv3qlVlPo7acv/9Nsw46aTanytsREYQvvkGNm7MX4diVBk7tnxa/PiYvFEjq5adTsXstWu3F4pUIjJvnt3fuLH88xs0MN9SXCBee6389GJpqfUOhg2r+fWuWQOTJ5sYNG9e8/OElcgIQr7PMESV+Ng7sShudcfkYM7iXXapekpZFX76qfJex9KlJjCpqMn0YiJTp5oonH127c4TVlwQnFozdGju0tiJWD3Oli2hZ8+K23XtmnooU9v6CPffD7vuahXA85HITDsuXGhe96gUvHCCZexYG7okUtv6CHPnWl7Ms8/O35muyAjCF1+Yo6o2Xmen7jB0qM0CFBXZj7eoyB7XpifzwAPmqzj11MzZGTbSEgQRGSgi80RkgYhcmeJ4FxGZISIfisjHInJkpg2NxyA4TroMHWrrXzKRnXvTJnjkERg8OH8D4yANQRCResB4YBDQGzhZRHonNbsGmKqqvwaGABkPpXFBcIJk2jQLV85XZ2KcdHoIfYAFqrpQVTcBk4FjktooEJ+EaQEszZyJ8MMPtrkgOEFx//02fdq/f9CWZJd0BKEj8HXC4yWxfYmMBoaJyBLgBeDCjFgXw2cYnCBZvBheegnOPDM8C82yRaaciicDD6lqJ+BI4FERKXduERkuIrNFZPaKFSvSPrkLghMk8UreZ54ZqBk5IR1B+AZIjDXrFNuXyFnAVABVfQdoDLRJPpGqTlDVYlUtLiwsTNvIfM+D4ISXrVvhwQdtqJCJsOewk44gzAK6i8jOItIQcxpOS2rzFdAPQER6YYKQfhegCr74wuLWd9wxU2d0nMqZNMkEoEEDi27s0SNoi3JDlYKgqluAEcB04DNsNuFTERkjIoNjzS4FzhGROcDjwBmawWWUPsPg5JL4wqh4jgewXkIYczxkmkgsf+7c2ao9P/JIlo1yHCoOey4qsniGqFPZ8ufQRypu2GArHb2H4OSKTOZdjBqhF4R4pmV3KDq5IlN5F6NI6AXBpxydXDJ9uiVTSV68VNuFUVHBBcFxYjzwABx1lKXp+5//yezCqKgQ+rWD+Z5p2QmOxJyLzZtb4pWSEnjiCUseO2JE0BbmnkgIQj5nWnaCITnn4k8/WVjyKaeYGNRVIjFk8OGCk2lSlXTbutVqTNRlQi0I8UzLLghOpqnLU4uVEWpB8EzLTraoaAqxLkwtVkZoBWHSJNh3X7t//fV1I2zUyR3ZyLmYD4RSEOIOn2+/tcfffRfeeoFONEnOuQhWwLYuTC1WRigFIZXDZ9062+84mSKec3HrVkvpPnFiNCpYZ5NQTju6w8fJJY89VpaMFcoqWEPd6zGEsodQkWOnY3LiNsfJAKNGlS8PV1d7pKEUhFQOH7CIxQ0bcm+Pk994j7SMUApCqiIbf/yjFfscNszGfI6TKXwKsoxQCgKUL7Jx551w++3w1FNw8cVlmWwcp7b4FGQZoXQqVsQll1iw0h13mD/hynI1pByn+gwdaj6Es86yx0VFNatgnQ9EShAAxo2DZcvgqqugfXs4/fSgLXLyge7d7fbZZ+Hoo4O1JUgiJwgFBZYn/7vvTNHbtoWBA4O2yok6s2bZbTw6tq4SWh9CZTRsCE8/DXvsYdFl8Q/TcWrKrFmWzLdt26AtCZZICgJYQosXXoDCQstys2BB0BY5UWbmTO8dQIQFAcyH8OKLNhMxcKANIxynunz/PSxcCH36BG1J8ERaEMBi0J97DpYutZ7CmjVBW+REjXh5EO8h5IEgAOy/P0ydCh9+aD6FzZuDtsiJEnEf1D77BGtHGMgLQQCbKrrnHkujffbZHrjkpM/MmbDrrtCiRdCWBE/kph0r4+yzbehw/fXQoQPcfHPQFjlhR9V6CP37B21JOMgrQQC49lqLZrzlFotmrIuptJ30+eYbWL7c/Qdx8k4QRGD8ePuQR460slzHHx+0VU5YmTnTbn2GwcgbH0Ii9evD44+bs3HYMHjjjaAtcsLKrFn2fdlrr6AtCQd5KQhgq9WefRZ23hkGD4ZPPgnaIieMzJoFe+4JjRsHbUk4yFtBANhpJwtcatoUBg2Cr78O2iInTJSWmiC4/6CMvBYEsKWs//oXrF5t0YyrVgVtkRMWPv8cfv7Z/QeJpCUIIjJQROaJyAIRSZmFQEROFJG5IvKpiDyWWTNrx557wjPP2HqHY46B9euDtsgJA77CsTxVCoKI1APGA4OA3sDJItI7qU134CrgIFXdDbg486bWjr594ZFH4K23LPGFp2FzZs0yX1OvXkFbEh7S6SH0ARao6kJV3QRMBo5JanMOMF5VfwBQ1VAuMzrpJPjrX+Ef/7ApSY9mrNvMnGnhyvXzbvK95qQjCB2BRHfckti+RHoAPUTkbRF5V0RSpiwRkeEiMltEZq9YsaJmFteSiy6Cyy+Hu+7ySMa6zObN8NFHPlxIJlNOxfpAd+Bw4GTgPhFpmdxIVSeoarGqFhcWFmbopavPLbfYsGHUKPj73wMzwwmISZPM2bxhgw0j62qVplSk01n6Buic8LhTbF8iS4D3VHUz8KWIzMcEIpS5jAoK4MEHLX/COedYlpwjjwzaKicXxOuGxksFrlxZd6s0pSKdHsIsoLuI7CwiDYEhwLSkNs9gvQNEpA02hFiYOTMzT8OGltJ9zz3hhBPKQlid/MbrhlZOlYKgqluAEcB04DNgqqp+KiJjRGRwrNl04HsRmQvMAC5X1e+zZXSmaNbM0rC1bWvJVT7/PGiLnGzjVZoqRzQgV3txcbHOjqeqCZj58+Ggg0wg3nnHE23mM127WjHXZIqKrCBQXUBE3lfV4lTH8j5SMR169IDnn4dvvzVfwurVQVvkZIt4MZZE6mqVplS4IMTo0weeeALmzIHjjoNNm4K2yMk0W7ZYDEqLFpZyPV43dMIEdyjGcUFI4Mgj4b774OWX7Z+ktDRoi5xMcuedlnfzvvvMZxCvG+piUIbHaCVx5pmWRefaay0N2623Bm2RkwmWLLHPdNAgT5hTGS4IKRg1ykThttssDdvIkUFb5NSWkSNt/cr48TZUcFLjgpACEeteLl9upefbtYMTTwzaKqemTJtmvoNbbrGEOU7FuA+hAurVg8cegwMPhFNPhddeC9oipyasWWOJdnffHS65JGhrwo8LQiXssIP9u3TrZnkUPv44aIuc6jJ6tGXKuvdeaNAgaGvCjwtCFbRubWnYmjUzh5RHtEWHOXNsufs551hPz6kaF4Q06NLF0rCtXWtp2CZMsIi3ggK79dVy4WPrVjj3XBP0W24J2pro4E7FNNljD0vDdsQRcP75ZTEKixf7arkwMmECvPcePPqoiYKTHr6WoZoUFtqS2WTqUix82Fm2zNKiFRdbkJlPM26Pr2XIIN9XsIbTfQvh4b/+y5Kf3H23i0F1cUGoJl26VG+/k1umT4cpU+Dqq6F796CtiR4uCNVk7FhbHZeIr5YLB+vXwwUXQM+e8N//HbQ10cSditUk7ji86CIbPrRvD+PGuUMxDPzpT7BwIbz6KjRqFLQ10cR7CDVg6NCyIKWLL3YxCANz55own3aa1eBwaoYLQg3p0MGmIqdPD9oSp7QUzjvPgsf+/OegrYk2Lgi1oKTEKkGtXRu0JXWbhx6CN9+0HkKA2f3zAheEWjBggGVWev31oC2pu6xYYYV3DjnEclk4tcMFoRYccogtgPJhQ3BcdpnlwLznHo85yAQuCLWgcWM47DAXhKCYMcMqL11+OfTuXXV7p2pcEGrJgAEwb17q1N5O9ti40RyJu+wC11wTtDX5gwtCLSkpsduXXgrWjrrGrbdaPY277rJhm5MZXBBqSa9e0KmTDxtyyeefw003wZAhZYLsZAYXhFoiYsOGV16xvP9OdlG15eeNG8Nf/hK0NfmHC0IGKCmBH3+EWaGsdZ1fPPaYie/NN1vyWyezuCBkgCOOsJ6CDxuyy6pVtrR5v/0sG5KTeVwQMkDr1rDvvu5YzBaTJlmqup12skCkY46x9HVO5vG3NUOUlFjKrh9+CNqS/GLSJEtRlzit+6c/eR7LbOGCkCFKSmyRzSuvBG1JfjFqFKxbt/2+detsv5N5XBAyRJ8+0Ly5DxsyTUWp6TxlXXZISxBEZKCIzBORBSJyZSXtjhMRFZGUCRzzmQYNoF8/cywGlLc2L6koNV3nzrm1o65QpSCISD1gPDAI6A2cLCLlIsdFpBlwEfBepo2MCiUl9s81b17QluQPqVLWAey6qwtvNkinh9AHWKCqC1V1EzAZOCZFuxuBW4ENGbQvUgwYYLc+bMgcQ4dajYWiIpva7dLFiuW89JJV53YySzqC0BH4OuHxkti+bYjI3kBnVX2+shOJyHARmS0is1esWFFtY8POzjtbpl+PR8gsQ4dazYvSUptteP55C1u+8kp4+OGgrcsvau1UFJEC4A7g0qraquoEVS1W1eLCPE1tU1JilaI3bgzakvyloMCyJPXrB2edZWX2nMyQjiB8AyS6cDrF9sVpBuwOvCYii4D9gWl10bEINmxYtw7efjtoS/KbRo3g6actr+Xxx8PMmUFblB+kIwizgO4isrOINASGANPiB1X1J1Vto6pdVbUr8C4wWFWjV6ctA/TtazMOPmzIPs2bW++gbVs46ihbBenUjioFQVW3ACOA6cBnwFRV/VRExojI4GwbGDV23BEOOsgFIVe0awcvvmj3S0pg+fJg7Yk6afkQVPUFVe2hqt1UdWxs33WqOi1F28Prau8gTkkJzJnjX85c0aOHORq//RaOPBJ+/jloi6KLRypmgfj048svB2tHXaJPH3jySfjkEzj2WHfq1hQXhCzwq19ZfQAfNuSWQYPggQdsPckZZ9g0pVM9vLZjFigosF7CSy/Zl9KX6uaO006DZcssRqFdO7jjDk/PXh38q5olBgywtftz5gRtSd3jiitg5Ej461/h9tuDtiZauCBkibgfwYcNuUfE8i2eeKLVbJg4MWiLooMLQpZo1w722ssFISgKCqyIy+GHW4k3X1+SHi4IWWTAAItYXLMmaEvqJo0awTPPWFWnY4+F2XV6Mjw9XBCySEkJbN5saxucYGjRwqIZ27SB3/wGOna03kPXrp6GLRUuCFnk4IO9GGwY6NABRoyworBLl1oehcWLLVeji8L2uCBkkUaNbAzr49fgufPO8vs8N2N5XBCyTEmJ1SBctChoS+o2FeVgXLwY3n/fsy/FcUHIMvHagz5sCJaKcjMCFBfbeohrroF//zt3NoURF4Qs07OnJQT1YUOwpMrN2KQJ3HMP3HefpWi7+WbLr7D77nDjjdazq2u4IGQZEesleDHYYEnOzVhUZI/PPRfOPhv+93/N4XjnndCqFVx3nYn5PvvAuHHbF4rJZ0QDGjwVFxfr7DoyMfzkk3DCCfDWW5YrwQk/X38NTzwBkyeXFfE94ADL5XjCCdC+fbD21QYReV9VU2Y08x5CDujXz+a+fdgQHTp3hksusdRsCxbATTfB2rVw0UUWy9C3L9x7L6xcGbSlmcV7CDnigAPMk/3uu0Fb4tSGzz6DKVOs5zBvHtSrZ9W/hwyB3/0OWrYM2sKq8R5CCCgpsa7nqlVBW+LUhl69YPRoE4YPP7TFU/Pm2XqJtm2tMvXjj0c3XN0FIUcMGODFYPMJEUuEc/PNsHCh9fz++EdbL3HKKfCLX9hqy6efhvXrg7Y2fVwQckSfPhZX7/EI+YcI7LefJWP5+mt4/XXrMbz2Ghx3nPUcTj3V8j5u2hS0tZXjgpAj6te3saYXg81vCgrg0ENh/HibxnzpJespPPccHH20LYuPT3OGcRraBSGHDBgAS5bAf/4TtCVOLqhfH/r3h/vvt4zQzz5r9SOmTLH9HTvaoqs33wxP/kcXhBziYcx1l4YNrYfw6KPw3XcWm3LYYZYU9tBDLbT60kttmjPIHqQLQg4pKrLoNxeEus0OO5hvYepUE4dJkywi8m9/M19Et25w9dWWjzPX4uCCkGNKSszptGFD0JY4YaBZM5uV+Oc/bVjx4INWQfy222wWo3dvuOGG3A0zXRByzIABNg311ltBW+KEjVatbHZi+nRLJX/33TZDccMNFv/wq1/BLbfAl19mzwYXhBxz+OE2nvRhg1MZhYVw3nk2dblkiaWU32EHuOoq2GUXG1r85S/wzTc25OjaNTOp4Tx0OQD69bOaDR9/HLQlTtRYtMh8D5MnW6QkmBAkzlI0aWIrOYcOTX0OD10OGQMGWA3CZcuCtsSJGl27WiGaDz6wkOkWLcpPWdYmNZwLQgDEpx999aNTG3r0qLjSdUUp46rCBSEA9tzTnEXuR3BqS+fOqfdXljKuMlwQAqCgwCLVXn45PBFqTjQ54IDy+5o0sZRxNSEtQRCRgSIyT0QWiMiVKY5fIiJzReRjEXlFRIpqZk7doaTEkmvEHUOOU12WLrUFU3vvXT41XEUOxaqoshy8iNQDxgP9gSXALBGZpqpzE5p9CBSr6joROR+4DTipZibVDfr3t9vp0y1KzXGqyxVXWGWwJ56wqchMkE4PoQ+wQFUXquomYDJwTGIDVZ2hqutiD98FOmXGvPylbVsLNHHHolMT3nrL4g0uvzxzYgDpCUJH4OuEx0ti+yriLOBfqQ6IyHARmS0is1esWJG+lXlKSYkVg129OmhLnCixdStceKE5FK+6KrPnzqhTUUSGAcXAuFTHVXWCqharanFhYWEmXzqSlJTYmvgZM4K2xIkSEybARx/B7beXrzVRW9IRhG+AxMmNTrF92yEiRwCjgMGqujEz5uU3Bx5oH6gPG5x0+f57qzDVty8cf3zmz5+OIMwCuovIziLSEBgCTEtsICK/Bu7FxOC7zJuZnzRqZB+sxyM46TJqFPz0ky2VFsn8+asUBFXdAowApgOfAVNV9VMRGSMig2PNxgE7Ak+IyEciMq2C0zlJlJRY3v+FC4O2xAk7H3xgw4URI2C33bLzGr64KWDmzYNdd7WlruedF7Q1TlhRhYMPhs8/t5qTtan/4IubQkyPHhZM4sMGpzImToT/+z+49dbsFoNxQQiYxGKwmzcHbY0TRn7+2YKQ9tsPTj89u6/lghACBgywWIT33gvaEieM3HijpVf7299sHUw2cUEIAf36WY1AHzY4yfznP5Yt6Q9/gH33zf7ruSCEgJYtrTvoguAkogojR0LTplZ9Ohe4IISEAQOsLuD33wdtiRMWnnnGlsiPGWO1InOBC0KIULXkmrVNlOlEn/Xr4ZJLYPfd4YILcve6VS5/drLPpEmWhx9MFBYvhuHD7XFN17U70ea22yyh6owZVhIuV3gPIQSMGmWJMROpTaJMJ9osWmT1F046ydL25xIXhBBQUULMmibKdKJJvL7CzjvDxo1w0EG5t8EFIQRUlBCzogSaTv4xaZINExcvtseqcOWVufcluSCEgLFjU69r790797Y4uUXVqi9dckk4ho3uVAwBccfhqFE2TOjc2Wr5vfiiJcG49NJg7XNqz+rVtihp/nxb0Bbf5s+HtWsrfl6uh40uCCFh6NDtZxRKS+Hkk+Gyy6BdO59tiAJbt5pDMPHHHr+/dGlZOxHzFfTsCYccYrc33GCl4ZOpaX2FmuKCEFIKCuCRR+xLcsYZFpgSz9TsBMvKleX/6efNgy++gE2bytq1amU/9v797bZHD7v95S+hcePtz9mihfkQEocNtamvUFNcEEJMo0YWrXbooXDssfD665aD38k+Gzda4ppU//arVpW1a9DAfuA9esBvf2s/+Pi2007pZzVKHjZ26WJikOueoSdIiQBLl1qFng0bbE18t25BW5QfqNp7m/xPP3++df0Tq2q1b7/9jz3+b9+1a24DhzJBZQlSInYpdZMOHczBePDBMHCgpW7PVWx7PhB36CX/0yc79Jo0sR/6vvvCsGFlP/7u3aF58+DszyUuCBGhVy947jlbKn300fDqq7DjjkFbFR6SHXqJP/6KHHqHHlr2T9+zJ3TsmJ3EpVHCBSFCHHAATJ4Mv/89nHACTJtmY9i6xMqV5f/p03Hoxbv5qRx6ThkuCBFj8GC45x7zSJ9zDvz97/n3r1Zdh17PnuUdem3aBGd/lHFBiCDnnGPd4NGjzb+Qq+QZmSQeoZdq+m7x4tQOvRNO2P7fPooOvbDjb2dEue46E4WbbzZRGDEiaItSk+jQS/y3T3boNW1qP/L99oNTT93+h9+sWXD21zVcECKKCIwfb8k3R460aMZslPZKhy1bzKGXKiy3Mode4vSdO/TCgQtChKlfHx5/HI44wgJY2rTJ7vr5uEMveVy/YMH2KeRbty7v0OvZ0+In3KEXblwQIs4OO8Czz1qMwu9+B2++CXvsUfPzbdhgHvtU03cVOfQGD97+394detHFBSEPaN3aApcOOMC64k2bWle9ovDXuEMv1fRdskOvQ4fyDr2ePa3alDv08g//SPOELl3gwgvhqqvgxx9t3+LFcPbZFu7cpk2ZAFTm0DvttLJ/enfo1T1cEPKIe+4pv2/DBrjrrtQOvfiP3h16ThwXhDyiomQaIras1h16TlV4CrU8oqJkGl26uBg46eGCkEekys0YRJINJ7qkJQgiMlBE5onIAhG5MsXxRiIyJXb8PRHpmnFLnSoZOhQmTLAZABG7nTDB06856VOlD0FE6gHjgf7AEmCWiExT1bkJzc4CflDVX4rIEOBW4KRsGOxUTnJuRsepDun0EPoAC1R1oapuAiYDxyS1OQZ4OHb/SaCfiPutHSdqpCMIHYGvEx4vie1L2UZVtwA/ATsln0hEhovIbBGZvWLFippZ7DhO1sipU1FVJ6hqsaoWFxYW5vKlHcdJg3QE4RsgsahYp9i+lG1EpD7QAvg+EwY6jpM70hGEWUB3EdlZRBoCQ4BpSW2mAafH7h8PvKpBpXN2HKfGpJWGXUSOBP4K1AMeVNWxIjIGmK2q00SkMfAo8GtgFTBEVRdWcc4VwOJa2l9d2gArc/yamSbq1xB1+yH611CkqinH7IHVZQgCEZldUT76qBD1a4i6/ZAf11ARHqnoOM42XBAcx9lGXROECUEbkAGifg1Rtx/y4xpSUqd8CI7jVE5d6yE4jlMJLgiO42wjLwUhjeXal4jIXBH5WEReEZGiIOysjKquIaHdcSKiIhKqabB07BeRE2Ofw6ci8liubayKNL5HXURkhoh8GPsuHRmEnRlFVfNqw4KnvgB2ARoCc4DeSW36Ak1i988HpgRtd3WvIdauGfAG8C5QHLTd1fwMugMfAq1ij38RtN01uIYJwPmx+72BRUHbXdstH3sIVS7XVtUZqrou9vBdbH1GmEhnyTnAjVjuiQ25NC4N0rH/HGC8qv4AoKrf5djGqkjnGhRoHrvfAlhKxMlHQUhnuXYiZwH/yqpF1afKaxCRvYHOqvp8Lg1Lk3Q+gx5ADxF5W0TeFZGBObMuPdK5htHAMBFZArwAXJgb07JHnc66LCLDgGLgsKBtqQ4iUgDcAZwRsCm1oT42bDgc66G9ISJ7qOqPQRpVTU4GHlLV20XkAOBREdldVUuremJYycceQjrLtRGRI4BRwGBV3Zgj29KlqmtoBuwOvCYii4D9gWkhciym8xksAaap6mZV/RKYjwlEWEjnGs4CpgKo6jtAY2zhU3QJ2omRBWdQfWAhsDNlzqDdktr8GnMYdQ/a3ppeQ1L71wiXUzGdz2Ag8HDsfhuse75T0LZX8xr+BZwRu98L8yFI0LbXZsu7HoJaCrcRwHTgM2Cqqn4qImNEZHCs2ThgR+AJEflIRJLzOwRKmtcQWtK0fzrwvYjMBWYAl6tqaJLqpHkNlwLniMgc4HFMHCId+uuhy47jbCPvegiO49QcFwTHcbbhguA4zjZcEBzH2YYLguM423BBcBxnGy4IjuNs4/8BTD4AIkXwUbIAAAAASUVORK5CYII=\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["def ameliore_tour_renversement(villes, perm=None):\n", " perm = (perm.copy() if perm is not None \n", " else list(range(villes.shape[0])))\n", " dist_min = distance_tour(villes, perm)\n", " cont = True\n", " nb_perm, nb_iter = 0, 0\n", " while cont or nb_iter < len(perm) ** 2:\n", " nb_iter += 1\n", " # Une partie qui change. On fait une copie de la permutation.\n", " p0 = perm.copy()\n", " a = numpy.random.randint(0, len(perm) - 2)\n", " b = numpy.random.randint(a + 1, len(perm) - 1)\n", " # On retourne une partie de cette permutation.\n", " if a == 0:\n", " perm[0:b] = perm[b:0:-1]\n", " perm[b] = p0[0]\n", " else:\n", " perm[a:b+1] = perm[b:a-1:-1]\n", " # La suite est quasi-identique.\n", " dist = distance_tour(villes, perm)\n", " if dist < dist_min:\n", " dist_min = dist\n", " cont = True\n", " nb_perm += 1\n", " nb_iter = 0\n", " else:\n", " # On reprend la copie. C'est plus simple\n", " # que de faire le retournement inverse.\n", " perm = p0\n", " cont = False\n", " return dist_min, nb_perm, perm\n", "\n", "dist, nb_perm, perm = ameliore_tour_renversement(villes)\n", "print(\"nb perm\", nb_perm)\n", "dessine_tour(villes, perm);"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Il n'y a plus de croisements, ce qui est l'effet recherch\u00e9."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Q4\n", "\n", "On pourrait combiner ces deux fonctions pour am\u00e9liorer l'algorithme qui resterait sans doute tr\u00e8s long pour un grand nombre de villes. On pourrait initialiser l'algorithme avec une permutation moins al\u00e9atoire pour acc\u00e9l\u00e9rer la convergence. Pour ce faire, on regroupe les deux villes les plus proches, puis de proche en proche..."]}, {"cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [{"data": {"image/png": "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tud168Jxx5kIHHMM1K9ftG9OjvkMFi2C3Fw46ih44gno1QsmT4bdyypj4jgZSmAp1PLy8jRdk5t+/tlaAePGWatABA47zETg5JMrd7efNg1OOgkKC+H556FPn1RZ7TipQUQ+VdW8eNuyNnR53Tq7mx99NLRtC1deCdu2wd132x3/nXfgoosq3/Q/5BD45BPYZRc79ujRqbDeyWQyOn4lqOyuBxxwgCabLVtUX3pJ9bTTVOvXVwXVjh1Vhw9X/frr5J5rzRrVvn3tHFdeqZqfn9zjO5nJ2LGqDRva7yK6NGxo68MCMEPL+F9mpCCMHavaoYOqiGpuruqNN6r+8Y+qO+5oV9SihergwaoffKBaWFjl01TItm0mBqDar5/q2rWpO5eTGbRrV1wMokuHDkFbVkRWCUI8BQbVOnVUzzxTdfJk1a1bq3ToKvPII6q1a6t266Y6f356z+0Ez8KFqvffr3rkkfHFAOzmFRayShA6dIj/gbdvX6XDJY2331Zt3ly1ZUvV998P1pZYYltTHTqEq+maqRQWqs6apTpihOr++5ctAt5CSIMgiIRXgefMUe3SxVor//530NZkRn82U9i6VfWtt1T/9Keim5KI6sEHqw4aZDcCsNcNGoT7M88qQSirhRAWBV69WvWII8ymP/85WGdj2D+rsLN2reqECapnnaW6ww722dWvr3r88aqPPab688+q//qXauPGqs2aqT79tL0v7K2yrBKEsWOtvx5mBd66VfXSS822/v1V168Pxo4wt6bCypIlqg89pPr736vWrWufV8uWquefr/rCC6q//mr7rVypetJJtv2ww8yPkClklSCoqvbqZaIQVgWOcv/9qjk5qvvum94fzLZtqvfeW7YgtG6dPlvCTmGh6hdfqN5yi2peXtFntPvuqldfrTptWulW3pQpqrvsYl3Du+7KvCHnrBOEvDzVo46q8tvTypQpqk2bqu68s+qHH6b+fLNmqR5wgH2z3buX7s9GReLqq1U3bEi9PWFk2zbVd99Vveoq1d12K/psevZU/dvfLGYl3nD1xo2qQ4bYvt262WediWSdIDRvrnrJJVV+e9qZPdt+ePXqqY4bl5pzbNhgPotatUx8JkywH3XJ/uzo0RazAaqdOqlOnZoae8LG+vWqzz+veu65RfEqdeta/Mijj6r++GP57//sM9W99rL3DRli4pCpZJUg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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["from scipy.spatial.distance import cdist\n", "\n", "def build_permutation(villes):\n", " pairs = cdist(villes, villes)\n", " max_dist = pairs.ravel().max()\n", " for i in range(villes.shape[0]):\n", " pairs[i, i] = max_dist\n", " arg = numpy.argmin(pairs, axis=1)\n", " arg_dist = [(pairs[i, arg[i]], i, arg[i]) for i in range(villes.shape[0])]\n", " mn = min(arg_dist)\n", " perm = list(mn[1:])\n", " pairs[perm[0], :] = max_dist\n", " pairs[:, perm[0]] = max_dist\n", " while len(perm) < villes.shape[0]:\n", " last = perm[-1]\n", " arg = numpy.argmin(pairs[last:last+1])\n", " perm.append(arg)\n", " pairs[perm[-2], :] = max_dist\n", " pairs[:, perm[-2]] = max_dist\n", " return perm\n", " \n", "perm = build_permutation(villes)\n", "dessine_tour(villes, perm);"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Pas si mal... Il reste un croisement. On applique la fonction de la question pr\u00e9c\u00e9dente."]}, {"cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["nb perm 3\n"]}, {"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["dist, nb_perm, perm = ameliore_tour_renversement(villes, perm)\n", "print(\"nb perm\", nb_perm)\n", "dessine_tour(villes, perm);"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Ce n'est pas n\u00e9cessairement le meilleur chemin mais \u00e7a va plus vite."]}], "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.9.5"}}, "nbformat": 4, "nbformat_minor": 2}