{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# Algo - Apart\u00e9 sur le voyageur de commerce\n", "\n", "Le voyageur de commerce ou Travelling Salesman Problem en anglais est le probl\u00e8me NP-complet embl\u00e9matique : il n'existe pas d'algorithme capable de trouver la solution optimale en temps polyn\u00f4mial. La seule option est de parcourir toutes les configurations pour trouver la meilleure. Ce notebook ne fait qu'aborder le probl\u00e8me."]}, {"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": ["## Tirer des points al\u00e9atoirement et les afficher"]}, {"cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [{"data": {"text/plain": ["array([[0.67838254, 0.59016636],\n", " [0.79780992, 0.59358808],\n", " [0.15182002, 0.63237946],\n", " [0.7280486 , 0.79583856],\n", " [0.18308128, 0.72824711],\n", " [0.23948217, 0.66792463]])"]}, "execution_count": 4, "metadata": {}, "output_type": "execute_result"}], "source": ["import numpy\n", "points = numpy.random.random((6, 2))\n", "points"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Distance d'un chemin"]}, {"cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [{"data": {"text/plain": ["2.4430548937201975"]}, "execution_count": 5, "metadata": {}, "output_type": "execute_result"}], "source": ["def distance_chemin(points, chemin):\n", " dist = 0\n", " for i in range(1, len(points)):\n", " dx, dy = points[chemin[i], :] - points[chemin[i-1], :]\n", " dist += (dx ** 2 + dy ** 2) ** 0.5\n", " dx, dy = points[chemin[0], :] - points[chemin[-1], :]\n", " dist += (dx ** 2 + dy ** 2) ** 0.5\n", " return dist\n", "\n", "distance_chemin(points, list(range(points.shape[0])))"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Visualisation"]}, {"cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["import matplotlib.pyplot as plt\n", "\n", "\n", "def plot_points(points, chemin):\n", " fig, ax = plt.subplots(1, 2, figsize=(8, 4))\n", " \n", " loop = list(chemin) + [chemin[0]]\n", " p = points[loop]\n", " \n", " ax[0].plot(points[:, 0], points[:, 1], 'o')\n", " ax[1].plot(p[:, 0], p[:, 1], 'o-')\n", " ax[1].set_title(\"dist=%1.2f\" % distance_chemin(points, chemin))\n", " return ax\n", "\n", "plot_points(points, list(range(points.shape[0])));"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Parcourir toutes les permutations"]}, {"cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [{"data": {"image/png": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAEICAYAAACQ4bezAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAxzElEQVR4nO3deXxU9b3/8dcnk2UCZMKWTCBAQEV2BYssxQUVBW0VSlsVK9bum9ZapdV7+7PWtldvUWsX2157u4H7VqQtlauiWDUgIJtQQARCCELCmgDZ8/39kQnGGCTLzJwzyfv5eORB5syZmc+BfPjk+z3f8znmnENERET8KcnrAEREROTEVKhFRER8TIVaRETEx1SoRUREfEyFWkRExMdUqEVERHxMhVpExGfM7M9m9hMzO9fMNnsdj3hLhVpExKecc/9yzg052X5mdqeZPdyWzzCzK83sDTM7ZmavnGTfyWZWZ2ZHGn19PvJcmpn9wcwKzKzMzNaY2aVtiUk+KNnrAERExFMHgAeAocCFLdh/t3OuXzPbk4FC4HxgJ3AZ8KSZjXLO7YhOqJ2TRtQiIh4zszFm9lZkJPoEEIxsn2xmuxrt930zK4rst9nMLjKzacB/AFdFRrhrW/PZzrkXnXNPArvbcwzOuaPOuTudczucc3XOub8D24GPted9RYVaRMRTZpYKLADmAz2Bp4BPN7PfEOAG4GznXAYwFdjhnHse+C/gCedcN+fcmZH9f2Nmh07wta4dIWeb2V4z225mPzezric4rjBwOrChHZ8lqFCLiHhtApACPOCcq3bOPQ2saGa/WiANGG5mKZGR67snelPn3Dedc91P8HVGG2PdBIwG+lA/Tf4x4P6mO5lZCvAI8Bfn3KY2fpZEqFCLiHirL1DkPniHpIKmOznntgLfAe4Eis3scTPrG5cI349hj3NuY2RqezvwPZqM/s0sifrZgSrqZwCknVSoRUS89R6Qa2bWaNuA5nZ0zj3qnDsHyAMc8N8NTzXd18x+12R1duOvaE1HOxrVkcgx/AEIA592zlVH6XM6NRVqERFv5QM1wLfNLMXMZgLjmu5kZkPM7EIzSwMqgHKgLvL0XmBgZDQLgHPu65Fz1s19jWj0vgEzC1K/ajvJzIKRqesPMbMLzCzP6vUH7gGea7TLb4FhwOXOufJ2/J1IIyrUIiIecs5VATOB66m/VOoq4Nlmdk2jvjDuA/YA2cDtkeeeivy538zeamUIs6kv+r8Fzo18//uGJyMj8HMjD8cAbwBHI3+uB74d2S8P+Br157D3NBq9f66V8UgT9sHTIiIiIuInGlGLiIj4mAq1iIiIj6lQi4iI+JgKtYiIiI/57qYcvXv3dgMHDvQ6DBHfW7Vq1T7nXJbXcXwU5bNIy3xUPvuuUA8cOJCVK1d6HYaI75nZh7pX+Y3yWaRlPiqfNfUtIiLiYy0q1GY2LXJLta1mdlszzw8ws5fNbLWZrTOzyxo9d3vkdZvNbGo0gxeR1lM+iySWk059m1kAeBC4GNgFrDCzhc65jY12+wHwpHPut2Y2HFhEfTu74cDVwAjqG8+/aGanO+dqo30gInJyymeRxNOSEfU4YKtzbluk1d3jwPQm+zggFPk+k/dvQD4deNw5Vxm508pWmulhKyJxo3wWSTAtKdS5QGGjx7si2xq7E7jWzHZR/9v3ja14LWb2VTNbaWYrS0pKWhi6iLSB8lkkwURrMdks4M/OuX7AZcD8xndxORnn3EPOubHOubFZWb6+2kTkAxasLmLSPUsYdNs/mHTPEhasLvI6pGhQPkun5Nd8bsnlWUVA/0aP+0W2NfYlYBqAcy4/csu03i18rUhCWrC6iNufXU95df0p2qJD5dz+7HoAZoz50EDTL5TPIs3wcz635LfkFcBgMxtkZqnULyZZ2GSfncBFAGY2DAgCJZH9rjazNDMbBAwG3oxW8CJemrt48/GkblBeXcvcxZs9iqhFlM8izfBzPp90RO2cqzGzG4DFQAD4o3Nug5ndBax0zi0EbgF+b2Y3U78Q5XpXf//MDWb2JLCR+hujf0srRKWj2H2ovFXb/UD5LPJBzjlWFhykyMf53KLOZM65RdQvKmm87Y5G328EJp3gtT8FftqOGEV8qW/39GaTu2/3dA+iaTnlswgcrazhuTW7mZe/g017yjDqfyttyg/57LsWoiKJYs7UIR84pwWQnhJgztQhHkYlIh/l3ZIjzM8v4JlVuyirrGFYnxB3zxxFwOCHCzf6Mp9VqEXaqGGBydzFm9l9qJy+3dOZM3WI5wtPROSDamrreGlTMfPzC3ht6z5SAsZlo/pw3cQ8zhrQAzMDIDU5wPefWUdlTR25PspnFWqRdpgxJtcXiSwiH7bvSCVPrCjkkWUF7D5cQZ/MILdecjpXnT2ArIy0D+0/Y0wub7y7j6VbSnj9tgs9iLh5KtQiItJhOOd4a+dB5uUXsGj9e1TXOs45rTd3XD6CKcOySQ589MVO4VCQkrJKauscgSSLU9QfTYVaREQSXnlVLc+tKWJefgEb3yslIy2Zz43P49oJeZyW3a3F75MdClLn6kfj4VAwhhG3nAq1iIgkrO37jjI/v4CnVxVSWlHD0JwMfvqpkcwYnUvXtNaXuHBkSnxvaYUKtYiISFvU1jmWbCpmXv4O/vXOPpKTjGkjc7hu4kDOHvj+4rC2yMmsL857SyujFW67qVCLiEhC2H+kkidWFvLIsp0UHSonJxTkuxefztVn9yc7SqPfhlH03tKKqLxfNKhQi4iIbznnWFN4iPn5Bfx93XtU1dYx8ZRe/OATw5gyPEzKSRaHtVavrqkkmQq1iIjIR6qormXhmt3MX1bA+qLDdEtL5upx/Zk9IY/B4YyYfW5yIIne3dJUqEVERJpTsP8oDy8r4MmVuzhcXs3g7G78ePoIPnVWP7q1YXFYW+RkBnWOWkREpEFtnWPplmLm5RewdEsJATOmjshh9sQ8xg/q2a7FYW2RnRFk18Fjcf3Mj6JCLSIinjh4tIonVxby8PICCg+Uk52RxrcvHMw14wd4emlUOJTGqoIDnn1+UyrUIiISV2sLDzEvv4C/rdtNVU0d4wf15PvThjJ1RE7UF4e1RTgU5OCxaipraklLDngdjgq1iIjEXkV1LX9f9x7z83ewdtdhuqQGuHJsP2ZPGMiQnNgtDmuLnMhovri0kv49u3gcjQq1iIjEUOGBY5HFYYUcPFbNqVld+dEVI5h5Vi4ZwRSvw2tWdqi+O1lxWYUKtYiIdDx1dY6l75QwP7+AlzcXk2TGJcPDzJ6Qx8RTe8V9cVhrvd/0xB8rv1WoRUQkKg4dq+Kplbt4eHkBBfuP0btbGjdecBqzxg+gT2a61+G1WEOh3nPYH9dSq1CLiEi7vF10mHn5O3huzW4qa+o4e2APbrlkCNNG5JCa7P3isNbq0SWF1EASe8tUqEVEJEFVVNeyaP17zMsvYE3hIdJTAsw8qx+zJ+QxvG/I6/DaxczIDqVRrKlvERFJNLsOHuOR5Tt5YkUhB45WcUpWV354+XBmntWPzHR/Lg5ri3Ao6Js2oirUIiLykerqHK9t3ce8/AKWbNoLwJRhYa6bOJBJp/l/cVhbhENpbNpT5nUYgAq1iIicwOFj1Ty1qpBHlu9k+76j9Oqayjcmn8o14/PI7Z44i8PaIjsjyKtb9nkdBqBCLSIiTWzYfZj5+QUsWFNERXUdH8vrwU0XDebSUTm+6NQVDzmZQY5U1nCksiZuNwM5ERVqERGhsqaW59/ew7z8AlYVHCSYksSM0blcOyGPkbmZXocXd+GGpielFXTL6uZpLCrUIiKd2O5D5TyyvIAnVhSy70gVA3t14QefGMZnP9afzC4dZ3FYa4UzItdSl1Zwigq1iIjEk3OO17fuZ17+Dl78d/3isAuHhpk9MY9zT+tNUlLHWxzWWtmN+n17TYVaRKSTKK2o5plVu5i/rIBtJUfp2TWVr51/KteMG+CLntZ+kpPZ0EbU+0u0VKhFRDq4f79Xyrz8AhasLqK8upbR/btz/5VnctmoPgRTOsfisNbqlpZM19SAL/p9q1CLiHRAVTV1PL9hD/Pzd7Bix0HSkpOYProvsycMZFS/zrc4rC380vREhVpEpAPZc7iCR5cX8NiKQkrKKhnQswv/edkwPju2H927pHodXkLJDqWpUIuISPs558jftp/5+QX838a91DnHBUOymT0xj/MHZ2lxWBvlhIKs2nnQ6zBUqEVEElVZRTXPvlXE/GUFbC0+QvcuKXz5nEF8bnweA3ppcVh71U99V+Kc87RNqgq1iEiC2bK3jHn5O/jrW0UcrarljH6ZzP3MGVx+Zl8tDoui7FCQqpo6DpdXe3raQIVaRCQBVNfW8X8b9jIvfwfLtx8gNTmJy8/oy3UT8zizf3evw+uQGrqT7SmtUKEWEZHm7S2t4LE3d/LYmzvZW1pJvx7p3HbpUK4c25+eXbU4LJZyQg3XUlcyNMe7OFSoRUR8xjnH8u0HmJ9fwOINe6ipc0weksV/fSqPyUOyCWhxWFyEQ/5oeqJCLSLiE0cqa/jr6iLm5+9gy94jZKan8IVJA7l2Qh55vbp6HV6nk5Xx/o05vKRCLSLisa3FZczLL+DZt4o4UlnDyNwQP/t0/eKw9FQtDvNKMCVA9y4p7EmEQm1m04BfAAHgf51z9zR5/ufABZGHXYBs51z3yHO1wPrIczudc1dEIW4RaQPlsn/U1Nbxwsa9zMsvIH/bflIDSXzyjD7MnpjH6P7dPb0cSN4Xzgh63kb0pIXazALAg8DFwC5ghZktdM5tbNjHOXdzo/1vBMY0eoty59zoqEUsIm2iXPaH4rIKHn+zkEeX72RPaQW53dP53rQhXDW2P726pXkdnjQRzgwmxNT3OGCrc24bgJk9DkwHNp5g/1nAD6MTnohEkXLZI845Vuw4yLz8HTz/dv3isHMH9+bHM0Zy4VAtDvOzcEYaW/aUeRpDSwp1LlDY6PEuYHxzO5pZHjAIWNJoc9DMVgI1wD3OuQXNvO6rwFcBBgwY0KLARaTVYp7LkdcqnyOOVtawYE0R8/ML2LSnjIxgMtdNHMi1EwZwSlY3r8OTFgiHgpQcqaS2znn2C1W0F5NdDTztnKtttC3POVdkZqcAS8xsvXPu3cYvcs49BDwEMHbsWBflmESk9dqUy6B8Bni35Ajz8wt4ZtUuyiprGN4nxD0zR3HF6L50SdUa3kQSDqVRW+fYf6SS7MjlWvHWkp+YIqB/o8f9ItuaczXwrcYbnHNFkT+3mdkr1J/z+lByi0jMKZdjqKa2jpc2FTM/v4DXtu4jJWBcNqoP103M46wBPbQ4LEGFGzU98XOhXgEMNrNB1Cf11cA1TXcys6FADyC/0bYewDHnXKWZ9QYmAT+LRuAi0mrK5RgoKavkiRU7eXT5TnYfrqBPZpBbLzmdq84ecPw6XElcjZuejMKb+3iftFA752rM7AZgMfWXdPzRObfBzO4CVjrnFkZ2vRp43DnXeKprGPA/ZlYHJFF/XutEC1dEJIaUy9HjnOOtnQeZl1/AovXvUV3rOOe03txx+QimDMsmOZDkdYgSJccLdZl3K79bdLLEObcIWNRk2x1NHt/ZzOveAEa1Iz4RiSLlcvuUV9Xy3Joi5uUXsPG9UjLSkvnc+DyunZDHadlaHNYR9e6WSpLB3sM+L9QiIp3Z9n1HmZ9fwNOrCimtqGFoTgY//dRIZozOpWua/hvtyJIDSfTuluZp0xP9hImINKO2zrFkUzHz8nfwr3f2kZxkXDqqD7Mn5HH2QC0O60zCoaD/p75FRDqL/UcqeWJlIY8s20nRoXJyQkG+e/HpXD2uP9kZ3qz6FW+FQ2kUHVKhFhHxjHOO1YWHmJ9fwD/WvUdVbR0TT+nFDz4xjCnDw6RocVinlh0K8tbOQ559vgq1iHRaFdW1LFyzm3nLdvB2USnd0pKZNa4/syfmcVp2htfhiU/khIIcOFpFZU0tacnxv5uZCrWIdDoF+4/y8LICnly5i8Pl1Zwe7saPZ4zkU2Ny6abFYdJEOFR/PXxJWSX9enSJ++frJ1JEOoXaOscrm4uZl1/A0i0lJCcZU0fkMHtiHuMH9dTiMDmh7EbdyVSoRUSi7ODRqvrFYcsLKDxQTnZGGjddNJhrxg843sxC5KOEM97vTuYFFWoR6ZDWFh5iXn4Bf1u3m6qaOsYP6slt04ZxyQgtDpPWyclUoRYRiYqK6lr+vu495ufvYO2uw3RNDXDl2H7MnjCQITlaHCZt06NLCikB86zpiQq1iCS8wgPHIovDCjl4rJrTsrvxoytGMPOsXDKCKV6HJwnOzMjOCFKsEbWISMvV1TmWvlPC/PwCXt5cTJIZlwwPM3tCHhNP7aXFYRJV4VCaZ93JOmShXrC6iLmLN7P7UDl9u6czZ+oQZozJ9TosEWml5nJ58pAsnlq5i4eXF1Cw/xi9u6Vx4wWnMWv8APpkpnsdsnRQ4VCQLXvLPPnsDleoF6wu4vZn11NeXQtA0aFybn92PYCKtUgCaS6Xb3lyLeCodXD2wB7ccskQpo3IITVZi8MktsKhIK+9s8+Tz+5whXru4s3HE7tBeXUtcxdvVqEWSSDN5XKtc3RJDfDMNz7OsD4hjyKTzigcClJWWcPRypq43zGtw/0auvtQeau2i4g/nShny6tqVaQl7hq6kxWXxX/ld4cr1H27N3+O6kTbRcSflMviJw3NcfYcjv+Csg5XqOdMHUJ6ygebpqenBJgzdYhHEYlIWyiXxU8aCnWxByu/O9w56obz0Fr1LZLYZozJxdU5bn5qLQC5ymXxUMPUtxfdyTpcoYb6BFcyiyS+84ZkAXDn5cO5ftIgj6ORzqxbWjJdUgOedCfrcFPfItJxNCzcycrQzTPEW2ZGOBRkjwcjahVqEfGthkKdHZl2FPFSOJTmSRtRFWoR8a2G/xSzM1SoxXvhUFBT3yIijZUciYyoNfUtPlBfqCtwzsX1c1WoRcS3iksryUhLJj01cPKdRWIsOyONypo6Sstr4vq5KtQi4lslZZVkadpbfCInM9L0JM7nqVWoRcS3issqVKjFNxqansT7WmoVahHxreKySrJDOj8t/hDOUKEWEfmAkrJKrfgW38j26MYcKtQi4ktHKms4VlWrQi2+EUwJkJmeEvcbc6hQi4gvNVxDrXPU4ic5kUu04kmFWkR86XhXMl1DLT6SHUpjr6a+RUTUPlT8KRwKxr2NqAq1iPhSyfERtQq1+Ec4lEZxWSW1dfHrTqZCLSK+VFxWQWogicz0FK9DETkuJxSkts6x/2j8pr9VqEXEl0pK67uSmZnXoYgc13Bdf3Ecb86hQi0ivlSs9qHiQ150J1OhFhFfKi6r0Plp8Z1wZHFjPG93qUItIr5UUlapFd/iO1nd0jCL7405WlSozWyamW02s61mdlszz//czNZEvraY2aFGz33ezN6JfH0+irGLSCslSi5X1dRx8Fi1rqEW30kOJNG7W1pcL9FKPtkOZhYAHgQuBnYBK8xsoXNuY8M+zrmbG+1/IzAm8n1P4IfAWMABqyKvPRjVoxCRk0qkXC45Uj+tqHPU4kfhUJrvzlGPA7Y657Y556qAx4HpH7H/LOCxyPdTgReccwciCf0CMK09AYtImyVMLjeMVnSOWvwonBH03TnqXKCw0eNdkW0fYmZ5wCBgSWtea2ZfNbOVZraypKSkJXGLSOvFPJcjr213Pqt9qPhZODO+/b6jvZjsauBp51xta17knHvIOTfWOTc2KysryiGJSBu0KZchOvlcovah4mPhjCD7j1ZRVVMXl89rSaEuAvo3etwvsq05V/P+VFlrXysisZUwuVxcVokZ9OqaGquPEGmzhku0GtZSxFpLCvUKYLCZDTKzVOoTeGHTncxsKNADyG+0eTFwiZn1MLMewCWRbSISfwmTyyVlFfTqmkpyQFeQiv/Eu+nJSVd9O+dqzOwG6pMyAPzRObfBzO4CVjrnGhL9auBx55xr9NoDZvZj6v+DALjLOXcguocgIi2RSLlcXFpJls5Pi08dL9SHfVKoAZxzi4BFTbbd0eTxnSd47R+BP7YxPhGJokTJ5eKySq34Ft96vztZfAq15pVExHdKVKjFx3p0SSUlYOwt8885ahGRuKmrc+w7ohtyiH8lJRnZGfG7REuFWkR85cCxKmrqnEbU4mvZobS43epShVpEfKXhP7+G+/6K+FFOKBi3G3OoUIuIrxSXqX2o+F84pKlvEemkStQ+VBJAdiiNsooajlXVxPyzVKhFxFca+nxrMZn4WTjyi2Q8zlOrUIuIr5SUVZKRlkx6asDrUEROKCezvlDH4zy1CrWI+EpxWQVZuhmH+Fw8m56oUIuIrxSXqtmJ+F/DVQma+haRTqfkSKUWkonvZaQlk54S0IhaRDoX51zkhhwaUYu/mRk5mfG5llqFWkR840hlDeXVtZr6loSQnRGf7mQq1CLiGw2XZmVrMZkkgHAoyN4yjahFpBM53j5U56glAYRDaewtraDRrdtjQoVaRHyj5EhDodaIWvwvHApSUV1HaXlsu5OpUIuIbxRHFuZoMZkkgnDkEq1YT3+rUIuIb5SUVZKanERmeorXoYic1PFCHeOV3yrUIuIbxWWVZHVLw8y8DkXkpN7vThbbld8q1CLiG8VlFVrxLQlDI2oR6XRKytQ+VBJHMCVAZnqKCrWIdB7FZepKJoml4RKtWEqO6bsnqAWri5i7eDO7D5XTt3s6c6YOYcaYXK/DEunQKmtqOXSsOqrXUCuXJdbCoWDMz1GrUDexYHURtz+7nvLqWgCKDpVz+7PrAZTgIjFUUhbda6iVyxIP2RlB3i3eF9PP0NR3E3MXbz6e2A3Kq2uZu3izRxGJdA7Rbh+qXJZ4yMlMo7iskrq62HUnU6FuYveh8lZtF5HoeH9EHZ2pb+WyxEM4FKSmzrH/aFXMPkOFuom+3dNbtV1EoqNhRB2txWR9uzdf8FOTk3i35EhUPkOk4RfLWC4oU6FuYs7UIaSnBD6wLT0lwJypQzyKSKRzKCmtwAx6dU2NyvudPbDnh7alBAycY9oDr3LPPzdxtDK2PZql42toelIcwzaiKtRNzBiTy90zR5HbPR0Dcrunc/fMUVp8IhJjxWWV9OqaRnKg/f8trd91mH+sf48RfUPkdg8ez+W5nzmT1267iOmjc/nd0neZcv9S/r5ud8zvfiQdV05m/Yh6z+HYrfzWqu9mzBiTq8IsEmfFUWp2cqSyhhsfe4teXdN4+Evj6dHMCP3ez57JrHH9ueO5Ddzw6GoePXUnP7piBIPDGe3+fOlcendLw0xT3yLSCZSUVUZlxfcdC95m54Fj/OLq0c0W6QYfy+vJwhvO4cczRrJhdymX/uJf/OTvGymrqG53DNJ5pASS6NU1TVPfItLxFZdVkNWtfYX6mVW7eHZ1Ed++aDDjT+l10v0DScbsCXm8fOtkPju2H394fTsX3beUBauLNB0uLVbfnSx2U98q1CLiudo6x74jVe0aUW8rOcL/e+5txg/qyY0XDm7Va3t2TeXumWfw129Ook9mkO88sYar/mcZ/36vtM3xSOeREwpq6ltEOrYDR6uorXNtvoa6sqaWGx9bTWpyEg9cPZpAUttukzm6f3f++s1J3D1zFO8Ul/HJX73GnQs3cLhc0+FyYtkq1CLS0TWc32vrYrJ7/rmJDbtLufczZ9Ins309D5KSjFnjBvDyrZOZNa4/f8nfwUX3vcJTKwtj2n1KElc4lMa+I1VU19bF5P1VqEXEcyXtaHbywsa9/On1HVz/8YFMGR6OWkzdu6Tykxmj+NsN5zCgZxfmPL2Oz/zuDd4uOhy1z5COoeG+1A0/x9GmQi0inituY/vQ9w6XM+fptYzoG+L2y4bGIjRG5mby9Nc/ztzPnEHB/mNc/uvX+MGC9Rw6FruWkZJYckKx7U6mQi0initpww05auscNz2+hqqaOn41awxpyYGTv6iNkpKMz47tz5JbJ/P5iQN5dPlOLrj3FR57c6emw+X4z60KtYh0WMWlFWQEkwmmtLzY/mrJO7y5/QA/nj6SU7K6xTC692Wmp3DnFSP4x7fPZXB2Brc/u55P/eZ11hYeisvniz+Fj4+oPZz6NrNpZrbZzLaa2W0n2OdKM9toZhvM7NFG22vNbE3ka2G0AheR1vNrLre2K9nybfv55UvvMHNMLp/+WL9ohtIiw/qEeOJrE3jgqtHsPlzBjN+8zm3PrONADO+gJP7Vs0sqyUkWsxH1SVuImlkAeBC4GNgFrDCzhc65jY32GQzcDkxyzh00s+xGb1HunBsd3bBFpLX8nMslZZUtXkh28GgVNz2+hgE9u3DXjJGxCKdFzIwZY3K5aFg2v3zpHf70+g7++fYebp06hGvGDWjzJWKSeJKSjOyM2DU9acmIehyw1Tm3zTlXBTwOTG+yz1eAB51zBwGcc8XRDVNEosC3uVw/oj75QjLnHHOeXsf+o5X8+pqz6Jbm/e0KMoIp/OcnhvPPm85leJ8Q/2/B21zx69dYVXDQ69AkjsKZsbuWuiWFOhcobPR4V2RbY6cDp5vZ62a2zMymNXouaGYrI9tnNPcBZvbVyD4rS0pKWhO/iLRczHMZWp/PzjmKyypaNPX9lzd28OK/93LbpcMYmZt50v3jaXA4g0e/Mp5fXzOG/Ueq+PRv3+CWJ9fG7JId8ZdwhreFuiWSgcHAZGAW8Hsz6x55Ls85Nxa4BnjAzE5t+mLn3EPOubHOubFZWVlRCklE2qBduQytz+eyyhoqqutOuuJ7w+7D/NeiTVw0NJsvThrY0uOJKzPjk2f05aVbzucbk09l4doiLrzvFf70+nZqYtQMQ/yhvt+3d4W6COjf6HG/yLbGdgELnXPVzrntwBbqkx3nXFHkz23AK8CYdsYsIm3jy1wuLj35NdRHK2u48dHV9OiawtzPnomZv8//dk1L5vvThvL8d85jdP/u/OhvG/nkr15j+bb9XocmMZIdClJaUUN5VW3U37slhXoFMNjMBplZKnA10HTF5wLqfwPHzHpTP322zcx6mFlao+2TgI2IiBd8mcst6Ur2w4Ub2L7/KA9cNYaeH3HrSr85Nasb8744jt9dexZlFTVc9dAyvvP4aopj2BdavNHQ9CQWt7s8aaF2ztUANwCLgX8DTzrnNpjZXWZ2RWS3xcB+M9sIvAzMcc7tB4YBK81sbWT7PY1XmIpI/Pg1l0/W53vB6iKeXrWLGy8czMRTT37rSr8xM6aN7MOL3z2fGy88jUXr93DBva/w+1e3xaw3tMRfw7XUew5Hv1C3aMmkc24RsKjJtjsafe+A70a+Gu/zBjCq/WGKSDT4MZdLPqJ96I59R/nPv65n3MCefPvC02Lx8XGTnhrglkuG8Omz+vGjv23gp4v+zZMrC/nR9BF8/NTeXocn7RRu6E4Wg8WD6kwmIp4qLqskNTmJUPoHxw2VNbXc8NhbJAfqb12ZHOgY/10N7N2VP31hHP973Vgqamq55vfL+dajb/He4XKvQ5N2yG6Y+o7BaY2O8ZMvIgmruLT+0qymC8R+9vxm3i4qZe5nzqBv9/bdutKPpgwP88LN53PzlNN5ceNeLrx3Kb95ZStVNZoOT0ShYDLpKYGYrPxWoRYRT5Uc+XBXsiWb9vKH17bz+Yl5XDIix6PIYi+YEuCmKYN58bvnc+7g3vzs+c1Me+BVXt2ifhKJxswIh9LYE4PuZCrUIuKp4tIP9vneW1rBrU+tY1ifELdfNszDyOKnf88uPHTdWP78hbOpc47r/vgmX5+/il0Hj3kdmrRCdig2TU9UqEXEU43bh9bWOb7z+BrKq2r51awxrbqbVkcweUg2i28+jzlTh/DKlmKm3L+UX730DhXV0b82V6IvHArqHLWIdCwV1bUcLq8+PqL+zctbyd+2n7umj+C07PjcutJv0pIDfOuC03jplslcODSb+17YwtQHXmXJpr1ehyYnkROqvzFH/cUT0aNCLSKeOX5pViiNFTsO8MBL7zB9dF8+48GtK/0mt3s6v/ncx3j4S+NJTjK++OeVfPkvK9i5X9PhfhUOBSmvrqW0oiaq76tCLSKeKTlSX6hTk5O46bHV9OuRzk9mjPR9i9B4Omdwb/5503ncfulQ3nh3P1N+vpT7X9ii6XAfitUlWglXqBesLmLSPUsYdNs/mHTPEhasbtqqWEQSwYLVRXz5LysBmPPUOvaUVvCrWWPICKZ4HJn/pCYn8bXzT2XJLZOZNiKHX770DlPuX8riDXuiPs0qbReOnMKJ9n2pE6pQL1hdxO3PrqfoUDkOKDpUzu3PrlexFkkwDbl84GgVADV1jkCSsa3kqMeR+VtOZpBfzhrDY1+ZQJfUAF+bv4rr/7SC7fv09+YHDW1Eo73yO6EK9dzFmylvMt1TXl3L3MWbPYpIRNqiuVyurnXK5RaaeGov/vHtc/l/nxzOWwUHmfrzV5m7eBPHqqJ7blRa53ihjvKNORKqUO8+1HyLvRNtFxF/Ui63X0ogiS+dM4iXbj2fT57Rhwdffpcp9y1l0fr3NB3ukfTUAKFgMnujfGOOhCrUJ2oj2BHbC4p0ZMrl6MnOCHL/VaN56usTyeySyjcfeYvZf3iTrcVlXofWKYVDwc59jnrO1CGkN2mAkJ4SYM7UIR5FJCJtoVyOvrMH9uRvN0zirukjWLfrENMe+Bd3L/o3Ryo1HR5P4VCwc099zxiTy90zR5HbPR2j/jrDu2eOYsaYXK9DE5FWUC7HRnIgiesmDmTJrZOZeVYu//PqNi667xWeW1Ok6fA4qe9OFt0RdYvuR+0nM8bkKplFOgDlcuz07pbGzz5zJrPGDeCO5zZw0+NreHT5Tu6aPpIhORleh9ehhUNp7C2toK7OkZQUnX4ACTWiFhGRlhszoAcLvjWJn35qJJv3lnHZL//FXX/bSGlFtdehdVjhUJCaOseBY1VRe08VahGRDiyQZHxufB4v3zKZq87uz5/e2M6F9y7lmVW7NB0eA+FQQ9OT6J2nVqEWEekEenRN5b8+NYrnvjWJfj3SueWptXz2d/ls2H3Y69A6lPDxNqLRO0+tQi0i0omc0a87z37j4/zs02ewbd9RLv/Va9zx3NscPqbp8GhoKNR7NKIWEZG2Skoyrjy7Py/fMpnZE/J4eFkBF973Ck+uKKSuTtPh7ZGVoalvERGJkswuKfxo+kj+duM5DOrdle89s46Zv32DdbsOeR1awkoJJNG7W2pUm56oUIuIdHIj+mby1Ncncv+VZ7LrYDnTH3yd//jreg4ejd7K5c6k/lpqjahFRCSKzIyZZ/Vjya3n84WPD+KJFYVccN8rPLK8gFpNh7dKtLuTqVCLiMhxoWAKd1w+nEXfPpch4Qz+869vM+PB13lr50GvQ0sY4VAaew5r6ltERGJoSE4Gj391Ar+cNYbisgpm/uYNvvf0WvYfiW57zI4oOyPI/qOVVNfWReX9VKhFRKRZZsYVZ/blpVsm87XzTuHZt4q44N5X+MsbO6iJUhHqiHIygzgH+6L0S40KtYiIfKRuacncftkwnv/OeZzRrzs/XLiBy3/9Oit2HPA6NF96vzuZCrWIiMTRadndmP+lcfzmc2dx+FgVn/1dPt99Yg3FUb6tY6LLzog0PTkcnb8XFWoREWkxM+OyUX148Zbz+dYFp/L3de9x0b1L+cNr26N2TjbRHW8jGqVfYFSoRUSk1bqkJjNn6lAW33weZ+X14Md/38gnf/ka+e/u9zo0z/XqmkpykkWtO5kKtYiItNmg3l358xfO5qHZH+NoVQ2zfr+MGx9bHbVp30SUlGRkZ6TpHLWIiPiDmXHJiBxe/O753HTRYBZv2MNF973C/yx9l6qazjkdnh0KakQtIiL+EkwJcPPFp/Pizecz8dRe3P3PTVz6i1d57Z19XocWd+FQmgq1iIj404BeXfjfz5/NH68fS02d49o/LOcbD6+i6FC516HFTTgU1NS3iIj424VDwyz+znnccvHpvLy5mCn3LeXBl7dSWVPrdWgxFw4FOVxeTUV1+49VhVpERGImmBLgxosG8+J3z+f807OYu3gzU3/+Ki9vLvY6tJhquEQrGtPfKtQiIhJz/Xp04XezP8a8L44jyYwv/GkFX5m3ksIDx7wOLSai2Z1MhVpEROLmvNOzeP475/H9aUN5fes+pty/lAde3BKVKWI/ifuI2symmdlmM9tqZredYJ8rzWyjmW0ws0cbbf+8mb0T+fp8uyMWkTZTLosfpCYn8Y3Jp/LSLedz8fAwD7z4Dhf/fCkvbtzrdWhRE9dCbWYB4EHgUmA4MMvMhjfZZzBwOzDJOTcC+E5ke0/gh8B4YBzwQzPr0e6oRaTVlMviN30y0/n1NWfx6JfHE0wO8OV5K/nin1ewY99Rr0Nrt1AwmWBKEsVl8Zn6Hgdsdc5tc85VAY8D05vs8xXgQefcQQDnXMMqganAC865A5HnXgCmtTtqEWkL5bL40sdP682im87lB58YxpvbD3DJz1/l3sWbKa9K3OlwMyMcCkalQ1tLCnUuUNjo8a7ItsZOB043s9fNbJmZTWvFazGzr5rZSjNbWVJS0vLoRaQ1Yp7LoHyWtkkJJPHlc09hyS3n84kz+vDrl7cy5f6lPP/2ezjnvA6vTcIZ0elOFq3FZMnAYGAyMAv4vZl1b+mLnXMPOefGOufGZmVlRSkkEWmDduUyKJ+lfbJDQX5+1Wie/NpEMoLJfP3ht7juj2/ybskRr0NrtXBmMG5T30VA/0aP+0W2NbYLWOicq3bObQe2UJ/sLXmtiMSHclkSxrhBPfn7jedw5+XDWVN4iGkPvMo9/9zE0coar0NrsXBGfRvR9s4ItKRQrwAGm9kgM0sFrgYWNtlnAfW/gWNmvamfPtsGLAYuMbMekYUnl0S2iUj8KZcloSQHkrh+0iCW3DKZ6aNz+d3Sd7novqX8be3uhJgOD4eCHKuqpaydv1yctFA752qAG6hPyn8DTzrnNpjZXWZ2RWS3xcB+M9sIvAzMcc7td84dAH5M/X8QK4C7IttEpBkLVhcx6Z4lDLrtH0y6ZwkLVkdv0KpclkSVlZHGvZ89k2e+8XF6dUvlxsdWc83vl7Nlb5nXoX2knQfqV6+feef/tSufzW+/lYwdO9atXLnS6zBE4m7B6iJuf3Y95Y0aP6SnBLh75ihmjPnwui0zW+WcGxvPGFtL+SzRVlvnePTNndy7eDNHK2u4/uMDuWnKYDKCKV6H9gELVhfxvafXUVX7/m0+25rPybELU0RaY+7izR8o0gDl1bXMXby52cQW6YwCScbsCXl8YlQf5i7exB9e385za3fzH5cNZcboXMwspp/vnONIZQ3FZZUUl1ZSXFZBSVklJWWVFB//s4J3io/QdBzc1nxWoRah/rffuYs3s/tQOX27pzNn6pC4F8fdJ7gF4Im2i3RmPbumcvfMM7j67AHc8dzb3PzEWh5bXsiPpo/gkeUFPLa8kFrnCJgxa3x/fjJj1Ee+X22dY//RRgW3tJKSI5UUl1Y0KsD1Rbiiuu5Dr08NJJGVkUZ2KI2BvbqyZW/zq9Tbks8q1NLpNZ1yLjpUzu3PrgeIa7Hu2z292fv19u2eHrcYRBLNmf2789dvTuLJlYX89/ObuPQX//rA87XO8fCynZSUVvKps3LfL7oNo+Ej9d/vP1pFbd2HTwVnBJPJzkgjOyPI6P7d678PpdUX5Yzg8edC6ckfGM1PumdJ1PJZhVo6Pb9MOc+ZOqTZc9Rzpg6JWwwiiSgpybh63ACmjcxhzF0v0NzKq8Ub97I40ks8yaB3t4Zim8aIPpnHR8PZGe8X4ayMNIIpgTbFFM18VqGWTs8vU84NvxR4PQUvkqi6d0lttkg3+Me3zyErI41eXdMIJMX2XHY081mFWjo9P005zxiTq8Is0g4BM2qbuZopYMaIvplxjSVa+az7UUunN2fqENKbTG9pylkkMc0a379V2xOBRtTS6WnKWaTjaFjd3dpV336mQi2CppxFOpKfzBiV0IW5KU19i4iI+JgKtYiIiI+pUIuIiPiYCrWIiIiPqVCLiIj4mO9uc2lmJUBBjN6+N7AvRu/tJ53hOHWMkOecy4pXMG2hfG43HWPH0JJjPGE++65Qx5KZrfT7/XujoTMcp45ROsPfj46xY2jvMWrqW0RExMdUqEVERHyssxXqh7wOIE46w3HqGKUz/P3oGDuGdh1jpzpHLSIikmg624haREQkoahQi4iI+FiHLNRmNs3MNpvZVjO7rZnnv2tmG81snZm9ZGZ5XsTZHic7xkb7fdrMnJkl3OUPLTlGM7sy8m+5wcwejXeM0dCCn9cBZvayma2O/Mxe5kWcXlE+f2A/5bOPxSyXnXMd6gsIAO8CpwCpwFpgeJN9LgC6RL7/BvCE13FH+xgj+2UArwLLgLFexx2Df8fBwGqgR+Rxttdxx+g4HwK+Efl+OLDD67h99vejfPb5V2fI51jmckccUY8DtjrntjnnqoDHgemNd3DOveycOxZ5uAzoF+cY2+ukxxjxY+C/gYp4BhclLTnGrwAPOucOAjjniuMcYzS05DgdEIp8nwnsjmN8XlM+v0/57G8xy+WOWKhzgcJGj3dFtp3Il4B/xjSi6DvpMZrZWUB/59w/4hlYFLXk3/F04HQze93MlpnZtLhFFz0tOc47gWvNbBewCLgxPqH5gvIZ5XOCiFkuJ0cjukRlZtcCY4HzvY4lmswsCbgfuN7jUGItmfrpssnUj6JeNbNRzrlDXgYVA7OAPzvn7jOzicB8MxvpnKvzOjA/UT4nvM6Qz23K5Y44oi4C+jd63C+y7QPMbArwn8AVzrnKOMUWLSc7xgxgJPCKme0AJgALE2wBSkv+HXcBC51z1c657cAW6hM9kbTkOL8EPAngnMsHgtQ3+e8MlM/K50QRu1z2+gR8DE7oJwPbgEG8f0J/RJN9xlB/0n+w1/HG6hib7P8Kibf4pCX/jtOAv0S+7039tFMvr2OPwXH+E7g+8v0w6s9rmdex++jvR/ns86/OkM+xzOUON6J2ztUANwCLgX8DTzrnNpjZXWZ2RWS3uUA34CkzW2NmCz0Kt01aeIwJrYXHuBjYb2YbgZeBOc65/d5E3DYtPM5bgK+Y2VrgMeoTvVO0FFQ+K5+9ibj1YpnLaiEqIiLiYx1uRC0iItKRqFCLiIj4mAq1iIiIj6lQi4iI+JgKtYiIiI+pUIuIiPiYCrWIiIiP/X9vzyZzswu7TgAAAABJRU5ErkJggg==\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["from itertools import permutations\n", "\n", "def optimisation(points, chemin):\n", " dist = distance_chemin(points, chemin)\n", " best = chemin\n", " for perm in permutations(chemin):\n", " d = distance_chemin(points, perm)\n", " if d < dist:\n", " dist = d\n", " best = perm\n", " return best\n", "\n", "\n", "res = optimisation(points, list(range(points.shape[0])))\n", "plot_points(points, res);"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Module tqdm\n", "\n", "Utile seulement dans un notebook, tr\u00e8s utile pour les impatients."]}, {"cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["(5, 4, 3, 2, 1, 0): : 720it [00:00, 946.03it/s] \n"]}, {"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["from tqdm import tqdm\n", "\n", "\n", "def optimisation(points, chemin):\n", " dist = distance_chemin(points, chemin)\n", " best = chemin\n", " loop = tqdm(permutations(chemin))\n", " for perm in loop:\n", " loop.set_description(str(perm))\n", " d = distance_chemin(points, perm)\n", " if d < dist:\n", " dist = d\n", " best = perm\n", " return best\n", "\n", "\n", "res = optimisation(points, list(range(points.shape[0])))\n", "plot_points(points, res);"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Retournement\n", "\n", "Les permutations \u00e7a prend du temps m\u00eame avec les machines d'aujourd'hui."]}, {"cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["def optimisation_retournement(points, chemin):\n", " dist = distance_chemin(points, chemin)\n", " best = chemin\n", " for i in range(1, len(chemin)):\n", " for j in range(i+1, len(chemin)):\n", " chemin[i: j] = chemin[j-1: i-1: -1]\n", " d = distance_chemin(points, chemin)\n", " if d < dist:\n", " dist = d\n", " else:\n", " chemin[i: j] = chemin[j-1: i-1: -1] \n", " return chemin\n", "\n", "\n", "res = optimisation_retournement(points, list(range(points.shape[0])))\n", "plot_points(points, res);"]}, {"cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": []}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.5"}}, "nbformat": 4, "nbformat_minor": 2}