{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Solving the Problem\n", "As you can see, manually creating solutions is a tedious task and requires taking into account each constraint carefully. This is the reason the `Dispatcher` class was created. This class allow us to just define the order in which operations are sequenced and the machines in which they are processed. The `Dispatcher` class will take care of the rest.\n", "\n", "Let's see an example of how to use the `Dispatcher` class to solve the previous instance. In this case, a reasonable solution is to process the operations in the order they are defined in the instance. We can do this as follows:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from job_shop_lib import JobShopInstance, Operation\n", "\n", "CPU = 0\n", "GPU = 1\n", "DATA_CENTER = 2\n", "\n", "job_1 = [Operation(CPU, 1), Operation(GPU, 1), Operation(DATA_CENTER, 7)]\n", "job_2 = [Operation(GPU, 5), Operation(DATA_CENTER, 1), Operation(CPU, 1)]\n", "job_3 = [Operation(DATA_CENTER, 1), Operation(CPU, 3), Operation(GPU, 2)]\n", "\n", "jobs = [job_1, job_2, job_3]\n", "\n", "instance = JobShopInstance(jobs, name=\"Example\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from job_shop_lib.dispatching import Dispatcher\n", "\n", "dispatcher = Dispatcher(instance)\n", "\n", "for i in range(3):\n", " dispatcher.dispatch(job_1[i], job_1[i].machine_id)\n", " dispatcher.dispatch(job_2[i], job_2[i].machine_id)\n", " dispatcher.dispatch(job_3[i], job_3[i].machine_id)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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+8EYFxfndPuioiLN19dXa9++vcPllTE4Xrx40f7DJz8/3+37adr/frCMGDHC6brExEQNgDZ48GC3H+9a69SmTZty71fRg2NhYaEWFBSkhYSEaJcvX3a637Rp0zQAWkJCglJnea71knvZfxMnTnS6344dO7Rq1appTZs21V544YVy/y6u5cCBA06fi6b972vJ1S9Sjz32mAZAe+mll5yumz59ugZA27Ztm8PlZb9gJCYmOt2n7Ov66uHH1d/N4cOHNQDakCFDXH4ua9as0QBo8+fPv+bnfHVTeYPjiy++6HT7LVu2aAC0v/3tb/bLygbHDz/88LrPd73B8Vruvfdezd/fXysqKrJfVjY41q9fXyspKXG6T7169bTIyEiHy1q2bKkB0A4ePHjd52zTpo3m6+urpaenO11XUlKiRUZGah07dlT+XIiMiNvVSUlycjISEhIcLqtfv77DS6OapuHzzz/HwoULceTIEaSnp6O0tNR+fXkvV179slAZs9mMmjVrIj09vWI+gUrm6nOoW7cuADh9Dje6Tp06darA4mv7+eefkZeXh7i4OERERDhd37NnT7zyyis4dOiQ03WedD766KNKh2rp0qULEhISMG3aNLz++uto3LgxPvjgA5e3vXz5Mt566y2sX78eiYmJyM3Ndbj+3LlzLu/n6u+27M1E7du3d7qubDeDs2fPOl1Xr149xMTEOF3evXt3JCQkuFzPq/3www8AgMzMTJdvIrp06RKAK++W9pS7X9P33Xcfpk6divHjx2PDhg24++67ERcXhxYtWsBkMik/7zfffIMPPvgAP/74I1JTU1FSUuJwfWpqKm655RaHy9q0aYNq1aq57C1bMwDIzc3FsWPHULNmTbRt2/aaHXl5eThy5AiqV69u3xXkj/z9/StkrYmMgIMjOalVqxZOnjxpf6ft1bp37w5N0wAAJSUlMJvNTrd59tlnMWfOHNxyyy24++67UadOHfs+ZgsXLsR///tfl89b3j6Ivr6+DgNVZYmIiICfnx+Kiopw7tw5xMbGKj+Gq8+hbL+nP34ON7pOtWrVUu66UWXvmP/jD+gyZZdnZGQ4XefNTgAYNGgQXn75ZdhsNowZMwYhISFOt8nIyEDHjh2RlJSETp064ZFHHkFERAR8fX2RkZGBd999F4WFhS4fPzw83Omysr/ba11XXFzsdF3NmjVdPkfZml3vSAWXL18GcOVYo5s2bSr3djk5Odd8HHe4+zVdv3597Nu3D9OnT8d3332HVatWAbgytE2ePBnPPPOM28/57rvvYtKkSbBarfjzn/+MevXqISgoCCaTyb7/squ/p2t9D7HZbPaPy75eXe1D/Efp6enQNA2XLl1y+qWZ6GbEwZGcxMXFYevWrfj+++8xevRopfumpKRg7ty5aNmyJXbv3o3Q0FCH65ctW1aRqRXK19cXd9xxB7Zv347vv//+hgZHd3myTjey9eZGlQ1EFy5ccHn977//7nC7q3mzs6CgAMOHDwcAWK1WzJgxAwMGDLC/oarMRx99hKSkJMTHxzttqfvhhx/w7rvveqX34sWLLi8vW2dX63m1suvfffddpYGssjVv3hzLly9HSUkJjhw5gs2bN2PevHmYOHEigoOD8fjjj1/3MUpKSjB9+nTUqlULBw8edPql5eothzeqbMAsb+vy1crWum3btjh48KDHz01kdDxzDDkZNWoUfH19sXLlSuWXXxITE2Gz2dC7d2+nYejs2bNITEyskMayl6PK2xJ5vevL88QTTwAA3n77beTl5V3ztuVtmXJHZa1TtWrVKnTrbNOmTREUFIQjR4643Kq4detWAEC7du0q7DlvxLPPPosjR47ghRdewBdffIG8vDwMHTrU6e/ol19+AQAMHjzY6TH+/e9/e6UVAM6cOePyrEZlZ0K63sund9xxBwBgx44dFZ1WIXx9fdG+fXs899xz9l+C1qxZY7/+Wv8+U1NTkZGRgc6dOzsNjTk5ORUyvAUHB6Nly5a4ePHidXcLCAkJwa233orjx48jLS3N4+cmMjoOjuQkNjYW06ZNQ1FREfr27Yvdu3e7vJ2rQaLs0Dg7d+50+KGQk5ODsWPHOu2ndKMiIyMBXPkBfCPXl2f48OG4++67cfr0aQwYMMC+Re1qRUVFmD9/Pv72t78pVv9PZa1TZGQkLl26hPz8/Btuu5qfnx9GjBiB7OxsvPTSSw7X/frrr5g7dy7MZjMefvjhCnm+G/Hll1/i/fffR1xcHBISEtC7d29MmTIFR44cwV//+leH25at+x9PVXno0CG8/vrrXiq+MjA999xzDi+fJiUlYe7cufD19cXIkSOvef8OHTrgrrvuwqpVq/DJJ5+4vM1PP/2ElJSUCu2+lgMHDrh8ib1s6+rVZ6a51r/PGjVqICgoCAcOHHB4qb24uBgTJ05EampqhfSWbal98sknnbptNpvDv/1nn30WRUVFGD16tMvve+np6dwaSTcNvlRNLr388svQNA3/+Mc/EBcXh/bt26NTp06IiIhARkYGkpOTsXnzZgBA165d7ferVasWhg0bhi+++AJt2rRB7969kZmZiU2bNiEgIABt2rTB4cOHPe7r0aMHfHx88MILL+DYsWOwWq0AgGnTpgEAevXqhbfeegtjx47F4MGDERoaCovFggkTJlzzcX18fPCvf/0LDz/8ML766is0bNgQvXr1QvPmzVGtWjUkJydjy5YtuHTpEiZPnnzD/ZW1Tr169cL+/fvRp08fdO3aFf7+/mjdujXuvffeG2594403sGPHDrz33nvYv38/evToYT+OY3Z2Nt577z2Xb/TwxOHDh6955piy65KTkzFmzBhYrVYsXbrUviXrlVdewfbt2/H++++jV69e9i2MjzzyCN566y1MmjQJW7duRePGjXH69GmsW7cOgwYNwvLlyyv08yhPq1atsHfvXrRv3x69e/e2H8cxIyMDb775plu7SSxduhQ9e/bE448/jrlz5+L222+HxWLB2bNncfToURw7dgw//PADatSo4YXPCFiyZAk+/PBDdOnSBbGxsbBarfj111/x9ddfw9/f3+ENdHfeeSeCgoIwZ84cXL582b5v51/+8heEh4fjmWeewRtvvIHbbrsNAwYMQFFREbZu3Yq0tDT06NHDvqXbE2PGjMGOHTuwZMkSNG7cGAMGDEBUVBTOnz+PLVu2YPTo0favs9GjR+PAgQNYsGABYmNjcffdd6NevXpIS0tDUlIStm/fjscee6zcN2QRVSm6vqebxPvPf/6jTZo0SWvdurUWHh6u+fr6alarVevQoYM2adIk7cCBA073yc3N1aZOnarFxsZq/v7+WnR0tDZu3DgtNTXVftaIq13rGIKaVv4hZpYsWWI/Xh2uOnNMmVmzZmnNmjWzH5tR9TA1GzZs0IYPH641aNBACwgI0Pz9/bWYmBht+PDhTocqut7hReDicCcVvU6aduV4eU899ZRWp04drVq1am6fheV6j52enq5NmTJFa9Sokebn56eFh4drf/rTn1yeocSdzvK4cziesnUpKirSbr/9dg2A9uWXXzo9VnJysmaxWDSLxeJwWKbjx49r9957rxYVFWU/a8w///lPh7OP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cGX4K+tRNWDAAPz000+YOnUqatWqhVatWqFLly5o1qyZp6lERCJxcCQij5Udtsbdy8uOAlb2/wkTJsBisTjd7uqtla6YTCaXl9tsthvqURUdHY05c+bg4MGDOHz4MPbu3YuNGzdiyJAhbh8fk4jISDg4EpFuatasCQAIDw9Hq1atlO8fHBwM4MoWzLI/A8ClS5cqJtANAQEB6Ny5Mzp37oySkhK8/fbbWLVqFe6//34e1oeIqhzu40hEumndujUCAwOxevVqlJSUOF2flZV1zfvXqlULAHDy5En7ZQUFBfj3v/9doZ0BAQHIy8tzujw7O9vhY19fX0RHR0PTNJSWllZoAxGRBNziSES6CQoKwtixYzFv3jw899xziIuLQ1hYGFJTU3Hw4EE0bdoUjz/+eLn3b9WqFapXr473338f9913H3x8fLB161b7Y1SUhg0bYvfu3Vi0aBFiY2MREBCADh064JVXXoHFYkHTpk1hsVhw9uxZbNiwAe3atavw/TOJiCTg4EhEuurSpQusVivWrFmDtWvXori4GBEREWjevDl69Ohxzfv6+vpi8uTJ+Pjjj7F8+XJYLBb069cPISEhWLBgQYU19u7dG8nJydi2bRu++eYbREVFoUOHDvjzn/+MHTt24JtvvkFBQQEiIiLQt29fDBo0qMKem4hIEp6rmoiIiIjcwn0ciYiIiMgtHByJiIiIyC0cHImIiIjILRwciYiIiMgtHByJiIiIyC0cHImIiIjILRwciYiIiMgtHByJiIiIyC0cHImIiIjILRwciYiIiMgtHByJiIiIyC0cHImIiIjILRwciYiIiMgt/x+mXaApRDJHvwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from job_shop_lib.visualization import plot_gantt_chart\n", "import matplotlib.pyplot as plt\n", "\n", "plt.style.use(\"ggplot\")\n", "\n", "_ = plot_gantt_chart(dispatcher.schedule)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "A solver is any `Callable` object that takes as input a `JobShopInstance` class and returns a `Schedule` with a complete solution of the instance.\n", "\n", "In this example, we are going to use the `CPSolver` class, contained inside `job_shop_lib.solvers` package, which uses [CP-SAT solver from Google OR-Tools](https://developers.google.com/optimization/cp/cp_solver)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[[S-Op(operation=O(m=0, d=1, j=0, p=0), start_time=0, machine_id=0),\n", " S-Op(operation=O(m=0, d=3, j=2, p=1), start_time=1, machine_id=0),\n", " S-Op(operation=O(m=0, d=1, j=1, p=2), start_time=10, machine_id=0)],\n", " [S-Op(operation=O(m=1, d=1, j=0, p=1), start_time=1, machine_id=1),\n", " S-Op(operation=O(m=1, d=5, j=1, p=0), start_time=2, machine_id=1),\n", " S-Op(operation=O(m=1, d=2, j=2, p=2), start_time=7, machine_id=1)],\n", " [S-Op(operation=O(m=2, d=1, j=2, p=0), start_time=0, machine_id=2),\n", " S-Op(operation=O(m=2, d=7, j=0, p=2), start_time=2, machine_id=2),\n", " S-Op(operation=O(m=2, d=1, j=1, p=1), start_time=9, machine_id=2)]]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from job_shop_lib.constraint_programming import ORToolsSolver\n", "\n", "solver = ORToolsSolver()\n", "schedule = solver(instance)\n", "schedule.schedule" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This class returns a `Schedule` object with a complete solution of the instance. It also set some metadata of the solution, such as the time it took to solve the instance and the status of the solution:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Is complete?: True\n", "Meta data: {'status': 'optimal', 'elapsed_time': 0.017614512998989085, 'makespan': 11, 'solved_by': 'ORToolsSolver'}\n", "Makespan: 11\n" ] } ], "source": [ "print(f\"Is complete?: {schedule.is_complete()}\")\n", "print(f\"Meta data: {schedule.metadata}\")\n", "print(f\"Makespan: {schedule.makespan()}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we can plot the gantt chart of the solution using the `plot_gantt_chart` method." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAo4AAAHMCAYAAABbdikaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABRqklEQVR4nO3deXRTdf7/8VdKku5t0gUQCqWUXWQHkSJlmUFAFEQUEVBEcAFmcBzGBdFS1FFcEEFAf+PCoiAMm8igLArDpoBAYaCMLG0HAaEtbbovafP5/eG3gZq2JCS5937C63GOR5rcJM+Gwn1z7829OiGEABERERHRdfipHUBEREREcuDgSERERERO4eBIRERERE7h4EhERERETuHgSERERERO4eBIRERERE7h4EhERERETuHgSERERERO4eBIRERERE7h4EjkAUuWLIFOp8OSJUvUTrlhp0+fxn333YeGDRtCp9PBZDKpnUQAdu7cCZ1Oh1mzZnntNXQ6Hfr27eu15yci38HBkep06tQpPPvss+jSpQsiIiJgMBgQERGB22+/HdOnT8ehQ4dU6Zo1axZ0Oh127txZ4/3jx4+HTqdDRkbGDb/Gtm3bMGbMGMTFxSEoKAiBgYFo0aIFxo0bh2+++eaGn9ebmjVrhmbNmrn8uMrKSgwfPhybN2/G0KFDkZSUhBdeeMHzgddRNYDX9d+NfH+kLb7wDy2im5Ve7QDSJiEEZs+ejdmzZ8Nms6FLly4YNWoUIiIiUFBQgGPHjmHBggV499138cEHH2DKlClqJ3tMQUEBHnnkEWzYsAEBAQHo378/RowYAYPBgPT0dGzevBmff/45/vrXv+Kdd95RO9cj0tPTkZqaikmTJuH//b//p3YOOnbsiOHDh9d4H7eEet7JkycRFBSkdgYRSYCDI9Vo9uzZmDVrFpo0aYKVK1ciISHBYZnMzEzMmzcPeXl5KhR6h81mwwMPPIAtW7agX79++Pzzz9GoUaNqy5SVleHDDz/EqVOnVKr0vIsXLwKAw/eqlk6dOnl11yxV16ZNG7UTiEgWguh3zp49K/R6vTAajeL48ePXXd5qtVb7+ueffxbPP/+86Nq1q4iKihJGo1E0bdpUTJo0Sfzyyy8Oj9+xY4cAIJKSksSRI0fEkCFDRHh4uAgMDBR9+vQRe/furbZ8bGysAFDjf0KIWu+LjY297vfy+eefCwCiRYsWorCwsM5lS0tL7b/+7LPPBADx2Wefie+//14kJiaKkJAQERoaKoYMGSJSU1MdHu/O+7R//34xZMgQYTab7a9b2/f96KOP1vl91Pa4pKQk+zIWi0W88MILolWrVsLf31+YTCYxcOBAsW3bNpc609PT62yp+j6u11xl7ty5AoAYMWKEw33btm0Tfn5+on379qK4uNh++/r168WYMWNEy5YtRVBQkAgKChJdunQR77//vqisrHR4nkcffVQAEGlpaWLBggWibdu2wt/fX8TGxorXX39d2Gw2IYQQq1evFt27dxdBQUEiOjpaTJkypdrrVgEgEhMTxYULF8TYsWNFdHS0CAgIEF26dBFffPGFw/LXvp+/d+XKFfHCCy+INm3aiICAABEWFib69+8vtmzZ4tT79/umayUlJQkAYseOHeKf//yn6N69uwgMDBRms1mMGjVKnD9/3uF5zp49KyZNmiTi4+NFQECAMJvNon379uLJJ58U2dnZQgghEhMTa/2Zq/r5uHDhgkhOTha9evUSDRo0EAaDQdxyyy1i9OjR4sSJEw6vm56ebv+5SU9PF6NGjRKRkZHC399fdO3aVXz99de1fu9ffvml6N+/vzCbzfbf14ceekgcPHjQYdkVK1aIvn37ivDwcOHv7y/atGkjXn311Wp/FxD5Om5xJAefffYZKioq8PDDD+PWW2+97vJ6ffUfo3Xr1uHDDz9Ev3790KtXLxiNRpw4cQIff/wxvv76a/z0009o3Lixw/P89NNPeOutt3DHHXdg4sSJOHfuHNauXYsBAwYgJSUFrVu3BgA888wz2LBhA/7973/j0UcfdTjmLSkpCRs2bMDRo0cxbdo0+65NZ3ZxVu2mnT59OoKDg+tc1t/f3+G2TZs24auvvsLgwYPx1FNPITU1FZs3b8bBgweRmpqKqKgot9+nH374AW+88QZ69+6NCRMmIDs7G61atUJSUhLmzZtnf4+qdOrUqc7vIykpCRkZGVi6dCkSExPtH5Ko+r/FYkFCQgJSU1PRvXt3PPPMM8jOzsbq1asxcOBALF68GE8++aRTnUajsc4WV/3lL3/B999/j3Xr1mHRokWYPHkyAODSpUsYO3YsAgICsHr1agQGBtof88ILL8DPzw+33347GjdujLy8PHz//feYNm0aDh48iOXLl9f4WtOnT8fOnTtxzz33YODAgdi4cSNeeukllJeXIyIiAi+88AKGDx+OO++8E9u2bcPChQtRWVmJxYsXOzxXbm4uevXqBZPJhMceewwWiwWrV6/GmDFjcOHCBfztb3+77vf+v//9D3379kVGRgbuvPNODBo0CEVFRdi0aRMGDRqEjz76CJMmTbrBd/aqRYsWYePGjbj33nuRmJiI/fv3Y9WqVTh69ChSUlLsfw5+/fVXdO/eHfn5+RgyZAjuv/9+lJaWIj09HcuXL8fUqVMRGRmJ8ePHw2Qy4auvvsKwYcOq/XxW/RndtWsX3nzzTfTr1w/3338/QkJCcPr0aaxZswYbN27E3r170bFjxxrfkx49eqB58+YYN24ccnJysGrVKgwbNgzbt29Hv3797MsKIfDYY49h6dKliIqKwogRIxAdHY3z589jx44daN26Nbp162ZffsKECfjss88QExOD+++/HyaTCT/++CNefvllfPfdd9i2bZvD34VEPkntyZW0p1+/fgKA+Pjjj2/o8efPn6/xX+BbtmwRfn5+4qmnnqp2e9UWFfzflrNrffjhhwKAePrpp6vdfu3WkJpUbSW63haua1mtVmE0GgUAcfr0aacfJ8TVLWX16tUT27dvr3bfCy+8IACIOXPmVLvdnffpww8/rLEjNjbWqS2rv1fXVq0nnnhCABBPPPGEfeuaEEKcOnVKhIWFCaPRWO19dqazNlXvY8eOHUVSUlKN/33zzTfVHpOdnS1iYmJEQECASElJEZWVlWLAgAECgPj0008dXuPMmTMOt1VWVopHHnlEABA//vhjtfuqfpZiY2OrbWXLzc0VkZGRIigoSERFRVXbqlxaWiratm0rjEajuHz5crXnq3pvHnjggWpbONPS0oTZbBYGg0GcPXvWfnttvzeJiYlCp9OJlStXVrs9NzdXdOzYUQQEBIhLly45fK81QR1bHENDQ8WxY8eq3Td69GgBQKxatcp+2/z58wUAMW/ePIfnLywsrLb19dot9DW5fPmyyM/Pd7g9JSVFBAcHi0GDBlW7vWqLIwAxa9asavd9++23AoAYPHhwtds/+ugjAUB0795dWCyWavdVVFSIixcvOvTed999DluRq96nmr5vIl/EwZEctG3bVgBwWEEL8dtf0L9fkb/33ntOP/dtt90m4uLiqt1WtWJMSEhwWL68vFzo9XrRtWvXard7Y3C8fPmyfeVTUlLi9OOEuLpiGTNmjMN9aWlpAoC4//77nX6+ut6nTp061fo4Tw+OZWVlIigoSISEhIgrV644PG7mzJkCgEhOTnapszZ17XKv+m/atGkOj9u9e7eoV6+eaN26tXjxxRdr/b2oy6FDhxy+FyGu/izV9A+pxx57TAAQL7/8ssN9s2bNEgDEzp07q91e9Q+MtLQ0h8dU/VxfO/zU9HuTkpIiAIiRI0fW+L1s2LBBABALFy6s83u+tqm2wfGll15yWP77778XAMRf//pX+21Vg+NHH3103de73uBYl3vuuUf4+/uL8vJy+21Vg2NsbKyoqKhweEzTpk1FZGRktdvat28vAIjDhw9f9zU7deok9Hq9yM3NdbivoqJCREZGiu7du7v8vRDJiNvVySUZGRlITk6udltsbGy1XaNCCHzxxRdYsmQJjh49itzcXFRWVtrvr2135bW7haoYDAY0aNAAubm5nvkGvKym76FJkyYA4PA93Oj71KNHDw8W1+3nn39GcXExEhISEBER4XB///798dprr+HIkSMO97nT+eijj7p0qpbevXsjOTkZM2fOxBtvvIGWLVviww8/rHHZK1eu4O2338bmzZuRlpaGoqKiavdfuHChxsfV9Htb9WGirl27OtxXdZjB+fPnHe5r2rQp4uLiHG7v27cvkpOTa3w/r/XDDz8AAPLy8mr8EFFWVhaA3z4t7S5nf6bvvfdezJgxA1OmTMGWLVtw1113ISEhAe3atYNOp3P5df/1r3/hww8/xE8//YTs7GxUVFRUuz87Oxu33HJLtds6deqEevXq1dhb9Z4BQFFREY4fP44GDRqgc+fOdXYUFxfj6NGjiIqKsh8K8nv+/v4eea+JZMDBkRw0bNgQJ0+etH/S9lp9+/aFEAIAUFFRAYPB4LDMs88+i3nz5uGWW27BXXfdhcaNG9uPMVuyZAn+97//1fi6tR2DqNfrqw1U3hIREQGj0Yjy8nJcuHAB8fHxLj9HTd9D1XFPv/8ebvR9atiwoctdN6rqE/O/X0FXqbrdYrE43KdkJwCMGDECr7zyCmw2GyZOnIiQkBCHZSwWC7p374709HT06NEDjzzyCCIiIqDX62GxWPD++++jrKysxucPDw93uK3q97au+6xWq8N9DRo0qPE1qt6z652p4MqVKwB+O9fotm3bal2usLCwzudxhrM/07GxsThw4ABmzZqFb7/9FuvWrQPw29A2ffp0/PnPf3b6Nd9//30888wzMJvN+OMf/4imTZsiKCgIOp3OfvxyTb9Pdf0dYrPZ7F9X/bzWdAzx7+Xm5kIIgaysLId/NBPdjDg4koOEhATs2LED3333HSZMmODSYzMzMzF//ny0b98e+/btQ2hoaLX7V65c6clUj9Lr9ejZsyd27dqF77777oYGR2e58z7dyNabG1U1EF26dKnG+3/99ddqy11Lyc7S0lKMHj0aAGA2mzF79mwMGzbM/oGqKh9//DHS09ORlJTksKXuhx9+wPvvv69I7+XLl2u8vep9run9vFbV/e+//75LA5m3tW3bFqtWrUJFRQWOHj2K7du3Y8GCBZg2bRqCg4Px+OOPX/c5KioqMGvWLDRs2BCHDx92+EfLtVsOb1TVgFnb1uVrVb3XnTt3xuHDh91+bSLZ8cox5GD8+PHQ6/VYs2aNy7tf0tLSYLPZMHDgQIdh6Pz580hLS/NIY9XuqNq2RF7v/to88cQTAIB33nkHxcXFdS5b25YpZ3jrfapXr55Ht862bt0aQUFBOHr0aI1bFXfs2AEA6NKli8de80Y8++yzOHr0KF588UV8+eWXKC4uxqhRoxx+j86cOQMAuP/++x2e49///rcirQBw7ty5Gq9qVHUlpOvtPu3ZsycAYPfu3Z5O8wi9Xo+uXbvi+eeft/8jaMOGDfb76/rzmZ2dDYvFgl69ejkMjYWFhR4Z3oKDg9G+fXtcvnz5uocFhISE4NZbb8WJEyeQk5Pj9msTyY6DIzmIj4/HzJkzUV5ejsGDB2Pfvn01LlfTIFF1apw9e/ZUWykUFhZi0qRJDscp3ajIyEgAv62Ab+T+2owePRp33XUXTp8+jWHDhtm3qF2rvLwcCxcuxF//+lcXq6/y1vsUGRmJrKwslJSU3HDbtYxGI8aMGYOCggK8/PLL1e47e/Ys5s+fD4PBgHHjxnnk9W7E2rVrsXjxYiQkJCA5ORkDBw7Ec889h6NHj+Ivf/lLtWWr3vffX6ryyJEjeOONNxQq/m1gev7556vtPk1PT8f8+fOh1+sxduzYOh/frVs33HnnnVi3bh0+/fTTGpf5z3/+g8zMTI921+XQoUM17mKv2rp67ZVp6vrzWb9+fQQFBeHQoUPVdrVbrVZMmzYN2dnZHumt2lL75JNPOnTbbLZqf/afffZZlJeXY8KECTX+vZebm8utkXTT4K5qqtErr7wCIQReffVVJCQkoGvXrujRowciIiJgsViQkZGB7du3AwD69Oljf1zDhg3x0EMP4csvv0SnTp0wcOBA5OXlYdu2bQgICECnTp2QkpLidl+/fv3g5+eHF198EcePH4fZbAYAzJw5EwAwYMAAvP3225g0aRLuv/9+hIaGwmQyYerUqXU+r5+fH/75z39i3Lhx+Oqrr9C8eXMMGDAAbdu2Rb169ZCRkYHvv/8eWVlZmD59+g33e+t9GjBgAA4ePIhBgwahT58+8Pf3R8eOHXHPPffccOubb76J3bt344MPPsDBgwfRr18/+3kcCwoK8MEHH9T4QQ93pKSk1HnlmKr7MjIyMHHiRJjNZqxYscK+Jeu1117Drl27sHjxYgwYMMC+hfGRRx7B22+/jWeeeQY7duxAy5Ytcfr0aWzatAkjRozAqlWrPPp91KZDhw7Yv38/unbtioEDB9rP42ixWPDWW285dZjEihUr0L9/fzz++OOYP38+br/9dphMJpw/fx7Hjh3D8ePH8cMPP6B+/foKfEfA8uXL8dFHH6F3796Ij4+H2WzG2bNn8fXXX8Pf37/aB+juuOMOBAUFYd68ebhy5Yr92M4//elPCA8Px5///Ge8+eabuO222zBs2DCUl5djx44dyMnJQb9+/exbut0xceJE7N69G8uXL0fLli0xbNgwREdH4+LFi/j+++8xYcIE+8/ZhAkTcOjQISxatAjx8fG466670LRpU+Tk5CA9PR27du3CY489VusHsoh8iqqf6SbN++9//yueeeYZ0bFjRxEeHi70er0wm82iW7du4plnnhGHDh1yeExRUZGYMWOGiI+PF/7+/iImJkZMnjxZZGdn268aca26ziEoRO2nmFm+fLn9fHW45soxVd59913Rpk0b+7kZXT1NzZYtW8To0aNFs2bNREBAgPD39xdxcXFi9OjRDqcqut7pRVDD6U48/T4J8dv58p566inRuHFjUa9ePaevwnK9587NzRXPPfecaNGihTAajSI8PFz84Q9/qPEKJc501saZ0/FUvS/l5eXi9ttvFwDE2rVrHZ4rIyNDmEwmYTKZqp2W6cSJE+Kee+4R0dHR9qvG/OMf/6h29ZFr1XVqp7pOC1Xbz0TVz8KFCxfEmDFjRHR0tPD39xedO3d2+cox+fn54vXXXxdd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2LhxI9LT05Gbm4vp06ejR48eamfVaf369Thw4AAuXLgAo9GIVq1aYezYsWjUqJHaabXaunUrtm7diqysLABATEwMRo4cic6dO6tc5rwNGzZgxYoVGDJkCMaPH692To1Wr16NNWvWVLutUaNGmDdvnjpBTsrJycHnn3+OlJQUlJWVoWHDhpg8eTLi4+PVTqvVlClT7D/P1xo4cCAmTpyoQlHdbDYbVq9ejd27d8NisSAiIgKJiYm4//77odPp1M6rVUlJCVatWoUDBw4gLy8PcXFxGD9+vKbWKddbjwghsHr1anz33XcoKipCmzZtMHHiRNxyyy2abd6/fz+2bduGtLQ0FBYW4q233kKzZs1U6yVHPjM47tu3D8uWLcOkSZPQsmVL/Otf/8Lrr7+OefPmITw8XO08B2VlZWjWrBn69++Pd955R+0cp6SmpuKuu+5CfHw8KisrsXLlSrz22muYO3cuAgIC1M6rUUREBB5++GHccsstEELg3//+N9566y289dZbaNKkidp513XmzBls27YNsbGxaqdcV5MmTfDyyy/bv/bz0/YOjcLCQrz88su49dZbMWPGDISFheHXX39FcHCw2ml1euONN2Cz2exfnzt3Dq+99hruuOMOFatqt2HDBmzbtg1TpkxBTEwM0tLSsGjRIgQFBWHIkCFq59Xqww8/xC+//IKpU6ciIiICu3btwquvvor33nsPERERaucBuP565KuvvsI333yDKVOmoH79+li1ahVef/11zJ07F0ajUYXi6zeXlZWhTZs2uOOOO/DRRx+pUEjX4zOD46ZNmzBgwAD069cPADBp0iQcPnwYO3bswPDhw9WNq0Hnzp2l2uoFAC+99FK1r6dMmYKJEyciLS0N7dq1U6mqbt26dav29ejRo7F161acPn1a84NjaWkpFixYgCeffBLr1q1TO+e6/Pz8YDKZ1M5w2ldffYXIyEhMnjzZflv9+vVVLHJOWFhYta83bNiABg0aaPbP4KlTp9CtWzd06dIFwG/v8Z49e3DmzBmVy2pXXl6O/fv347nnnrO/rw8++CAOHTqErVu34qGHHlK58Dd1rUeEENi8eTNGjBiB7t27AwCmTp2KSZMm4eDBg0hISFAy1e56674+ffoAADIzM5VKIhdpe5OAkyoqKpCWlobbbrvNfpufnx9uu+02nDp1SsUy31ZcXAwACAkJUbnEOTabDXv37kVZWRlatWqlds51ffzxx+jcuTM6dOigdopTLl26hCeffBJTp07F/PnzkZ2drXZSnX766Sc0b94cc+fOxcSJE/Hcc89h+/btame5pKKiArt370a/fv00u9u3VatWOH78OC5evAgAyMjIwM8//6zpfzhXVlbCZrM5nIzaaDTiv//9r0pVrsnMzITFYqn290dQUBBatGjB9SK5xSe2OObn58Nmszls7TCZTPa/rMizbDYblixZgtatW6Np06Zq59Tp3LlzeOmll2C1WhEQEIDp06cjJiZG7aw67d27F+np6XjjjTfUTnFKy5YtMXnyZDRq1Ai5ublYs2YNXnnlFbz77rsIDAxUO69GmZmZ2LZtG+6++27cd999OHv2LD777DPo9Xr07dtX7TynHDhwAEVFRZruHT58OEpKSvCXv/wFfn5+sNlseOihh3DnnXeqnVarwMBAtGrVCmvXrkXjxo1hMpmwZ88enDp1Cg0bNlQ7zykWiwUAHA7VCg8Pt99HdCN8YnAk5X3yySf45ZdfMHv2bLVTrqtRo0Z4++23UVxcjB9//BELFy5EcnKyZofH7OxsLFmyBDNnzlTtOCRXXbv1KDY21j5I/vDDD+jfv7+KZbWz2WyIj4/Hww8/DACIi4vDuXPnsG3bNk0PYtfasWMHOnXqpJlj7mryww8/YM+ePfjzn/+MJk2aICMjA0uWLIHZbNb0+zx16lQsXrwYTz31FPz8/BAXF4eEhASkp6ernUakKp8YHMPCwuDn5+fwryiLxSLVMVey+OSTT3D48GEkJycjMjJS7Zzr0uv19q0EzZs3x9mzZ7F582Y88cQTKpfVLC0tDXl5eXj++eftt9lsNpw8eRLffvstVqxYofkPngQHB6NRo0a4dOmS2im1MpvNDv94iImJwf79+1Uqck1WVhaOHTuG6dOnq51Sp88//xzDhg2zH1PXtGlTZGVlYcOGDZoeHBs2bIjk5GSUlpaipKQEZrMZ7733nhTHwQKwr/vy8vJgNpvtt+fl5fFTyuQWnxgc9Xo9mjdvjuPHj9s/1m+z2XD8+HEMGjRI5TrfIYTAp59+igMHDmDWrFnS/AX6ezabDVarVe2MWt12220OnzZcvHgxGjVqhGHDhml+aAR++2DPpUuXNL07snXr1g6Hsly8eBHR0dEqFblmx44dCA8Pt3/oRKvKysocfmb9/PwghFCpyDUBAQEICAhAYWEhjh49irFjx6qd5JT69evDZDLhP//5j31QLC4uxpkzZzBw4EB140hqPjE4AsDQoUOxcOFCNG/eHC1atMDmzZtRVlam2X/RVq1Yq2RmZiIjIwMhISGIiopSsax2n3zyCfbs2YPnnnsOgYGB9i28QUFBmt2lumLFCnTq1AlRUVEoLS3Fnj17kJqa6vAJcS0JDAx0OG7U398foaGhmj2edNmyZejWrRuioqKQm5uL1atXw8/PD71791Y7rVZ33303Xn75Zaxbtw69evXCmTNn8N1332l2S/S1bDYbdu7cicTERNSrV0/tnDp17doV69atQ1RUFGJiYpCRkYFNmzbZz4ChVSkpKQBg33K+fPlyNG7cWFPrlOutR4YMGYJ169bhlltuQf369fHll1/CbDbbP2WtxebCwkJkZ2cjJycHAOz/uDOZTNyDqBE6Ics/+5zw7bffYuPGjbBYLGjWrBkee+wxtGzZUu2sGp04cQLJyckOtycmJmLKlCkqFF3fgw8+WOPtkydP1tRfptdavHgxjh8/jtzcXAQFBSE2NhbDhg2T5pPKVWbNmoVmzZpp9gTg8+bNw8mTJ1FQUICwsDC0adMGDz30kOY/SHDo0CGsWLECly5dQv369XH33XfjD3/4g9pZ13X06FH7eWq1fAJ+wPFE2hEREUhISMDIkSOh12t328W+ffuwcuVKXLlyBSEhIbj99tsxevRoBAUFqZ1md731SNUJwLdv347i4mK0adMGjz/+uKo/M9dr3rlzJxYtWuRw/8iRI2tdB5GyfGpwJCIiIiLv0f7BUkRERESkCRwciYiIiMgpHByJiIiIyCkcHImIiIjIKRwciYiIiMgpHByJiIiIyCkcHImIiIjIKRwcichpCxcu1OwJ6j3lxIkTePDBB3HixAm1U4iINEe7p+0nIkU4ezWGpKQkL5do1549e5CXl4e7775b7RQiIlXxyjFEN7ldu3Y5fH3s2DFMnTq12u0dOnRASEgIhBAwGAxKJirKZrOhoqICer0efn6/7ZR588038csvv2DhwoUq1xERqYtbHIlucn369Kn29enTp3Hs2DGH228Wfn5+MBqNamcQEWkSB0cictrChQuRmppq3/KWmZmJqVOnYuzYsTAajdi0aRMsFgvatGmDp556CpGRkVi7di22b9+OgoICdOzYEZMnT0ZISEi15z1y5AjWr1+P9PR06HQ6tG3bFmPHjkWTJk3q7Fm9ejXWrFmD1atXV7t9586dWLRoET744APUr18fADBlyhQ0adIEw4cPx9KlS3Hu3DmYzWY88MADSExMtD/2xIkTSE5ORlJSEm699VbMmjULqampAK7u1o+Ojra/B9988w22bduGzMxMGAwGNGjQAEOHDkXv3r3deKeJiLSJgyMRuW3Pnj2oqKjAoEGDUFhYiI0bN+K9995D+/btkZqaimHDhuHSpUv49ttvsWzZMkyePNn+2F27dmHhwoXo2LEjxowZg7KyMmzduhWvvPIK5syZYx/8POHSpUt499130b9/fyQmJmLHjh1YtGgRmjdvXuuQOmLECBQXF+PKlSt49NFHAQABAQEAgO3bt+Ozzz5Dz549MWTIEJSXl+PcuXM4ffo0B0ci8kkcHInIbTk5OZg/fz6CgoIA/Hac4IYNG1BeXo4333wT9erVAwDk5+djz549mDRpEgwGA0pLS/HZZ5+hf//+ePLJJ+3Pl5iYiGeeeQbr16+vdru7Ll68iOTkZLRt2xYA0KtXLzz99NPYsWMHHnnkkRof06FDB0RERKCoqMhh9/3hw4fRpEkTPPvssx5rJCLSMp6Oh4jc1rNnT/vQCAAtW7YEANx55532obHq9oqKCuTk5AAAjh07hqKiIiQkJCA/P9/+n5+fH1q2bOnxU+LExMTYh0YACAsLQ6NGjZCZmXlDzxccHIwrV67gzJkznkokItI0bnEkIrdFRUVV+7pqiKzt9qKiIgDAr7/+CgCYPXt2jc8bGBjo1U7gt+GvqsdVw4YNw3/+8x/MmDEDDRs2RIcOHdC7d2+0adPG3VQiIk3i4EhEbqs6bY2zt1edBazq/1OnToXJZHJY7tqtlTXR6XQ13m6z2W6ox1UxMTGYN28eDh8+jJSUFOzfvx9bt27FyJEjnT4/JhGRTDg4EpFqGjRoAAAIDw9Hhw4dXH58cHAwgN+2YFb9GgCysrI8E+iEgIAA9OrVC7169UJFRQXeeecdrFu3DsOHD+dpfYjI5/AYRyJSTceOHREYGIj169ejoqLC4f78/Pw6H9+wYUMAwMmTJ+23lZaW4t///rdHOwMCAlBcXOxwe0FBQbWv9Xo9YmJiIIRAZWWlRxuIiLSAWxyJSDVBQUGYNGkSFixYgOeffx4JCQkICwtDdnY2Dh8+jNatW+Pxxx+v9fEdOnRAVFQUFi9ejHvvvRd+fn7YsWOH/Tk8pXnz5ti3bx+WLl2K+Ph4BAQEoFu3bnjttddgMpnQunVrmEwmnD9/Hlu2bEGXLl08fnwmEZEWcHAkIlX17t0bZrMZGzZswMaNG2G1WhEREYG2bduiX79+dT5Wr9dj+vTp+OSTT7Bq1SqYTCYMGTIEISEhWLRokccaBw4ciIyMDOzcuRP/+te/EB0djW7duuGPf/wjdu/ejX/9618oLS1FREQEBg8ejBEjRnjstYmItITXqiYiIiIip/AYRyIiIiJyCgdHIiIiInIKB0ciIiIicgoHRyIiIiJyCgdHIiIiInIKB0ciIiIicgoHRyIiIiJyCgdHIiIiInIKB0ciIiIicgoHRyIiIiJyCgdHIiIiInIKB0ciIiIicgoHRyIiIiJyyv8HTPbMoEmYe58AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "_ = plot_gantt_chart(schedule)" ] } ], "metadata": { "kernelspec": { "display_name": "job-shop-lib-gOF0HMZJ-py3.11", "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.11.8" } }, "nbformat": 4, "nbformat_minor": 2 }