{ "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": "iVBORw0KGgoAAAANSUhEUgAAAokAAAHMCAYAAAC5qjJjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABZX0lEQVR4nO3dd3hUZf738c+EmfQykxBACCWELtJBJUjdRUAUKQoIKiJYgBXWZVERDWFtqCCCoD5roSgIq4CIKEVgaVKkSllBkywCQgjJpPc5zx/8MsswJ4GbGeZ8IZ/XdXlJpr5zE5Jvzpw5x6RpmgYiIiIiokv4GR1ARERERPJwSCQiIiIiNxwSiYiIiMgNh0QiIiIicsMhkYiIiIjccEgkIiIiIjccEomIiIjIDYdEIiIiInLDIZGIiIiI3HBIJPKC+fPnw2QyYf78+UanXLMTJ06gf//+qFGjBkwmE6xWq9FJBGDz5s0wmUyYOnXqdXsOk8mErl27XrfHJ6IbE4dEqtDx48fx7LPPok2bNoiMjITFYkFkZCRuv/12TJw4EXv37jWka+rUqTCZTNi8ebPu9SNGjIDJZEJKSso1P8f69esxbNgwxMbGIjg4GEFBQWjQoAEefvhhfPfdd9f8uNdTvXr1UK9ePeX7lZaW4v7778eaNWvQt29fJCQk4Pnnn/d+4BWUDdsV/Xctnx/JcjP8UkVUGZiNDiCZNE3DtGnTMG3aNDgcDrRp0waDBw9GZGQksrOzcejQIcyZMwczZszAe++9h7Fjxxqd7DXZ2dl45JFHsHLlSgQGBqJ79+4YMGAALBYLkpOTsWbNGnz22Wf429/+hrffftvoXK9ITk7G0aNHMXr0aPy///f/jM5By5Ytcf/99+texy2c3nfs2DEEBwcbnUFEwnBIJF3Tpk3D1KlTUbt2bSxZsgTx8fFut0lNTcWsWbOQmZlpQOH14XA48MADD2Dt2rXo1q0bPvvsM9SsWdPlNoWFhfjggw9w/Phxgyq978yZMwDg9rkapVWrVtf15VVy1aRJE6MTiEgijegyv/32m2Y2mzV/f3/t8OHDV7x9cXGxy8e//PKL9txzz2lt27bVqlatqvn7+2t16tTRRo8erf3+++9u99+0aZMGQEtISND279+v9enTR4uIiNCCgoK0zp07a9u3b3e5fd26dTUAuv9pmlbudXXr1r3i5/LZZ59pALQGDRpoOTk5Fd62oKDA+edPP/1UA6B9+umn2saNG7UuXbpooaGhWlhYmNanTx/t6NGjbvf3ZJ127dql9enTR7PZbM7nLe/zfvTRRyv8PMq7X0JCgvM2drtde/7557VGjRppAQEBmtVq1Xr27KmtX79eqTM5ObnClrLP40rNZWbOnKkB0AYMGOB23fr16zU/Pz+tefPmWl5envPyFStWaMOGDdMaNmyoBQcHa8HBwVqbNm20d999VystLXV7nEcffVQDoCUlJWlz5szRmjZtqgUEBGh169bVXn31Vc3hcGiapmnLli3T2rdvrwUHB2vR0dHa2LFjXZ63DACtS5cu2unTp7Xhw4dr0dHRWmBgoNamTRvt888/d7v9pet5uQsXLmjPP/+81qRJEy0wMFALDw/Xunfvrq1du/aq1u/ypkslJCRoALRNmzZp//rXv7T27dtrQUFBms1m0wYPHqydOnXK7XF+++03bfTo0VpcXJwWGBio2Ww2rXnz5tqTTz6ppaWlaZqmaV26dCn3a67s6+P06dNaYmKi1rFjR6169eqaxWLRbrnlFm3o0KHakSNH3J43OTnZ+XWTnJysDR48WIuKitICAgK0tm3bat988025n/sXX3yhde/eXbPZbM6/1yFDhmh79uxxu+3ixYu1rl27ahEREVpAQIDWpEkT7R//+IfL9wKimwm3JJKbTz/9FCUlJXjooYdw6623XvH2ZrPrl9Hy5cvxwQcfoFu3bujYsSP8/f1x5MgRfPTRR/jmm2/w008/oVatWm6P89NPP+HNN9/EnXfeiVGjRuHkyZP46quv0KNHDxw4cACNGzcGAEyYMAErV67Ev//9bzz66KNu+6glJCRg5cqVOHjwIMaPH+98efJqXqYse6l14sSJCAkJqfC2AQEBbpetXr0aX3/9NXr37o2nnnoKR48exZo1a7Bnzx4cPXoUVatW9XidfvzxR7z++uvo1KkTRo4cibS0NDRq1AgJCQmYNWuWc43KtGrVqsLPIyEhASkpKViwYAG6dOnifAND2f/tdjvi4+Nx9OhRtG/fHhMmTEBaWhqWLVuGnj174v3338eTTz55VZ3+/v4Vtqj661//io0bN2L58uWYN28exowZAwA4e/Yshg8fjsDAQCxbtgxBQUHO+zz//PPw8/PD7bffjlq1aiEzMxMbN27E+PHjsWfPHixatEj3uSZOnIjNmzfj3nvvRc+ePbFq1Sq8+OKLKCoqQmRkJJ5//nncf//9uOuuu7B+/XrMnTsXpaWleP/9990eKyMjAx07doTVasVjjz0Gu92OZcuWYdiwYTh9+jT+/ve/X/Fz/+9//4uuXbsiJSUFd911F3r16oXc3FysXr0avXr1wocffojRo0df48r+z7x587Bq1Srcd9996NKlC3bt2oWlS5fi4MGDOHDggPPfwR9//IH27dsjKysLffr0wcCBA1FQUIDk5GQsWrQI48aNQ1RUFEaMGAGr1Yqvv/4a/fr1c/n6LPs3umXLFrzxxhvo1q0bBg4ciNDQUJw4cQJffvklVq1ahe3bt6Nly5a6a9KhQwfUr18fDz/8MNLT07F06VL069cPGzZsQLdu3Zy31TQNjz32GBYsWICqVatiwIABiI6OxqlTp7Bp0yY0btwY7dq1c95+5MiR+PTTTxETE4OBAwfCarVi586deOmll/DDDz9g/fr1bt8LiW54Rk+pJE+3bt00ANpHH310Tfc/deqU7m/Wa9eu1fz8/LSnnnrK5fKyLSX4vy1il/rggw80ANrTTz/tcvmlWzn0lG39udKWq0sVFxdr/v7+GgDtxIkTV30/TfvfFrAqVapoGzZscLnu+eef1wBo06dPd7nck3X64IMPdDvq1q17VVtML1fR1qonnnhCA6A98cQTzq1mmqZpx48f18LDwzV/f3+Xdb6azvKUrWPLli21hIQE3f++++47l/ukpaVpMTExWmBgoHbgwAGttLRU69GjhwZA++STT9ye49dff3W7rLS0VHvkkUc0ANrOnTtdriv7Wqpbt67L1rOMjAwtKipKCw4O1qpWreqytbigoEBr2rSp5u/vr507d87l8crW5oEHHnDZcpmUlKTZbDbNYrFov/32m/Py8v5uunTpoplMJm3JkiUul2dkZGgtW7bUAgMDtbNnz7p9rnpQwZbEsLAw7dChQy7XDR06VAOgLV261HnZ7NmzNQDarFmz3B4/JyfHZavqpVve9Zw7d07Lyspyu/zAgQNaSEiI1qtXL5fLy7YkAtCmTp3qct3333+vAdB69+7tcvmHH36oAdDat2+v2e12l+tKSkq0M2fOuPX279/fbetw2Trpfd5ENzoOieSmadOmGgC3H8aadvGb8eU/tN95552rfuzbbrtNi42Ndbms7IdgfHy8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Bchtk9pFREQyjB8/HgcOHMDTTz9d4f6E0nFI9JGwsDCkp6cbneFGahcgt01qFxERybBgwQKjE7yCLzcTERERkRsOiT6SnZ1tdIIuqV2A3DapXURERN7EIdFHLBaL0Qm6pHYBctukdhEREXkTh0QfCQwMNDpBl9QuQG6b1C4iIiJv4pDoI5qmGZ2gS2oXILdNahcREZE3cUj0Ealn6JDaBchtk9pFRETkTaIOgbNixQrs3r0bp0+fhr+/Pxo1aoThw4ejZs2aRqd5zGq1ijznr9QuQG6b1C4iIrpxbd++Hf3798eJEycQERFhdA4AYUPi0aNHcffddyMuLg6lpaVYsmQJXnnlFcycOfOG3w/Mz0/mRlupXYDcNqldRESVTVRpvM+e60KV7cr3+ctf/oLMzEwsXLjwOhRdfGXrzTffxObNm3H69GlERUWhd+/eeP755xEeHu7x44saEl988UWXj8eOHYtRo0YhKSkJzZo1M6jKO6Seyk1qFyC3TWoXERFVLmfPnsXZs2cxdepUNGrUCKdOncLf//53nD17Fp988onHjy96k0heXh4AIDQ01OASz0kdLKR2AXLbpHYREZFchYWFmDx5Mpo1a4batWujb9++2L9/v9vtdu/ejS5duqB27dro3bs3jh07Vu5jNm3aFJ9++inuvvtuxMbG4q677sLkyZOxbt06lJSUeNwsdkh0OByYP38+GjdujDp16ujepri4GHl5ec7/8vPzfVx59byx2fd6kNoFyG2T2kVERHJNmzYNq1evxpw5c7BhwwbExsZi8ODBbm+GTExMRGJiItauXYuoqCg8/PDDKC4uvurnycrKQlhYGMxmz18sFvVy86U+/vhj/P7775g2bVq5t1mxYgW+/PJL58exsbGYPn26L/KIiIiIrkpubi7mz5+P2bNno0ePHgCAmTNnom3btvj8888xbtw4520nTpyIrl27AgDmzJmDVq1aYc2aNejXr98Vn+fChQuYOXMmHn74Ya90ixwSP/74Y+zbtw+JiYmIiooq93b9+/dH3759nR+bTCZf5F2TnJwcoxN0Se0C5LZJ7SIiIplSUlJQXFyMDh06OC+zWCxo3bo1Tpw44XLbdu3aOf9ss9kQFxeH48ePX/E5srOzMWzYMDRq1Ah///vfvdItakjUNA2ffPIJdu/ejalTp6JatWoV3t5isdwwp0gzm80o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DolEZJjq1asDACIiItCiRQvl+4eEhAC4uGWy7M8AcP78ee8EXoXAwEB07NgRHTt2RElJCd5++20sX74c999/Pw+lQ0Q3NO6TSESGadmyJYKCgrBixQqUlJS4XZ+VlVXh/WvUqAEAOHbsmPOygoIC/Pvf//ZqZ2BgIPLy8twuz87OdvnYbDYjJiYGmqahtLTUqw1ERL7GLYlEZJjg4GCMHj0ac+bMwXPPPYf4+HiEh4cjLS0N+/btQ+PGjfH444+Xe/8WLVqgatWqeP/993HffffBz88PmzZtcj6Gt9SvXx87duzAggULEBcXh8DAQLRr1w6vvPIKrFYrGjduDKvVilOnTmHt2rVo06aN1/enJCLyNQ6JRGSoTp06wWazYeXKlVi1ahWKi4sRGRmJpk2bolu3bhXe12w2Y+LEifj444+xdOlSWK1W9OnTB6GhoZg3b57XGnv27ImUlBRs3rwZ3377LaKjo9GuXTv8+c9/xtatW/Htt9+ioKAAkZGR6N27NwYMGOC15yYiMgrP3UxEREREbrhPIhERERG54ZBIRERERG44JBIRERGRGw6JREREROSGQyIRERERueGQSERERERuOCQSERERkRsOiURERETkhkMiEREREbnhkEhEREREbjgkEhEREZEbDolERERE5IZDIhERERG5+f83hlB5GbeE9AAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from job_shop_lib.visualization.gantt 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.027423290999649907, '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": "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C/X666+Xucy//vUvHTlyxNTuimzatKnM3eQlW01PvaJLRX8/69Spo+joaG3atKnU7vKioiKNHz9ex44dM6W3ZAvsnXfeGdDt8/lK/d2/7777VFhYqNtuu63Mf/fS09PZyohqid3NKNOjjz4qwzD02GOPqUePHurcubO6deumxMREZWRkaN++fVqxYoUkqVevXv7H1atXT9ddd53ef/99dejQQQMGDNCJEye0fPlyRUZGqkOHDtqyZUuV+/r27auQkBA99NBD2r59u7xeryRp0qRJkqT+/fvrmWee0ZgxY3TNNdcoLi5OCQkJGjduXIXPGxISor///e+66aab9NFHH6lp06bq37+/WrdurRo1amjfvn368ssvdfToUU2YMOGM+8/W+9S/f39t3LhRAwcOVK9evRQREaH27dvrD3/4wxm3PvXUU1qzZo1efPFFbdy4UX379vWfJzErK0svvvhimR/CqIotW7ZUeMWVkvv27dun0aNHy+v16t133/VvoXr88ce1evVqvfTSS+rfv79/y+HNN9+sZ555Rvfee69Wrlyp5s2ba8+ePVqyZImGDRum+fPnm/p9lKddu3Zav369OnfurAEDBvjPk5iRkaGnn366Uoc6vPvuu+rXr59uv/12zZw5UxdffLESEhJ04MABbdu2Tdu3b9fXX3+tOnXqWPAdSfPmzdMrr7yinj17qlmzZvJ6vfrxxx/1ySefKCIiotSH2y699FJFR0drxowZOn78uP9YzD/96U+Kj4/Xn//8Zz311FO66KKLNHToUBUWFmrlypVKS0tT3759/Vuwq2L06NFas2aN5s2bp+bNm2vo0KFKSkrSzz//rC+//FK33Xab/+fstttu06ZNmzRnzhw1a9ZMl19+uc4//3ylpaVp7969Wr16tW699dZyPywFuJatn62G4/373/827r33XqN9+/ZGfHy8ERoaani9XqNLly7Gvffea2zatCngMTk5OcbEiRONZs2aGREREUZycrJxzz33GMeOHfNfbeFUFZ2jzzDKP63LvHnz/OeD0ylXXCnx3HPPGa1atfKf+zDYU8N8/vnnxvXXX280btzYiIyMNCIiIowmTZoY119/fcDpgU53Sg+VcYoRs98nw/j1fHR33XWX0aBBA6NGjRqVvnrJ6Z47PT3duP/++40LLrjACA8PN+Lj443f/e53ZV7ZozKd5anM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pEqpU6eOEhIS9K9//cs/FObm5uqHH37QgAED7I2Da1SLIVGShgwZotmzZ6tp06a64IILtHTpUhUUFDj2N9WSlWiJI0eOaN++fYqNjVXt2rVtLCvfa6+9prVr1+r+++9XVFSUf8ttdHS0Y3eLvvvuu+rQoYNq166t/Px8rV27Vjt37gz4pLaTREVFBRznGRERobi4OMce//nWW2+pS5cuql27ttLT07VgwQKFhISoZ8+edqeV64orrtAjjzyihQsXqnv37vrhhx/0xRdfOHYL86l8Pp9WrVql3r17q0aNGnbnVKhz585auHChateureTkZO3bt09Llizxn4nCqbZs2SJJ/i3i8+bNU4MGDRy1TjndemTw4MFauHChzjvvPNWpU0fvv/++vF6v/9POTmzOzs7WsWPHlJaWJkn+X+QSEhLYM2gDj+GWX+cq4bPPPtPHH3+sjIwMNW7cWLfeequaN29ud1aZduzYoZSUlIDbe/furbFjx9pQdHp//OMfy7z9nnvucdQ/nKd66aWXtH37dqWnpys6OlqNGjXS0KFDXfOJ4RJTpkxR48aNHXsy7RkzZmjXrl3KyspSzZo11apVK1133XWOP8h/06ZNevfdd3Xo0CHVqVNHV1xxhX73u9/ZnXVaW7du9Z8H1skns5cCT0qdmJioHj16aPjw4QoNde52iq+++krvvfeejh8/rtjYWF188cW6/vrrFR0dbXea3+nWIyUn016xYoVyc3PVqlUr3X777bb+zJyuedWqVZozZ07A/cOHDy93HYSzp1oNiQAAADCH8w9uAgAAgOUYEgEAABCAIREAAAABGBIBAAAQgCERAAAAARgSAQAAEIAhEQAAAAEYEgFU2uzZsx17snez7NixQ3/84x+1Y8cOu1MAwFbOPd09AEtU9ioGkydPPsslzrV27VqdOHFCV1xxhd0pAGAZrrgCnONWr14d8PW2bds0bty4Ure3a9dOsbGxMgxDYWFhViZayufzqbi4WKGhoQoJ+XVny1NPPaWffvpJs2fPtrkOAKzDlkTgHNerV69SX+/Zs0fbtm0LuP1cERISovDwcLszAMB2DIkAKm327NnauXOnf4vakSNHNG7cON14440KDw/XkiVLlJGRoVatWumuu+5SrVq19OGHH2rFihXKyspS+/btdc899yg2NrbU83733XdatGiR9u7dK4/Ho9atW+vGG29Uw4YNK+xZsGCBPvjgAy1YsKDU7atWrdKcOXP04osvqk6dOpKksWPHqmHDhrrqqqv05ptvav/+/fJ6vbr22mvVu3dv/2N37NihlJQUTZ48WRdeeKGmTJminTt3SvrvrvmkpCT/e/Dpp59q+fLlOnLkiMLCwlS3bl0NGTJEPXv2rMI7DQD2Y0gEUGVr165VcXGxBg4cqOzsbH388cd6/vnn1bZtW+3cuVNDhw7VoUOH9Nlnn+mtt97SPffc43/s6tWrNXv2bLVv314jR45UQUGBli1bpkcffVTTpk3zD3lmOHTokJ577jn169dPvXv31sqVKzVnzhw1bdq03IF02LBhys3N1fHjx3XLLbdIkiIjIyVJK1as0BtvvKFLLrlEgwcPVmFhofbv3689e/YwJAJwPYZEAFWWlpammTNnKjo6WtKvx/UtXrxYhYWFeuqpp1SjRg1JUmZmptauXasxY8YoLCxM+fn5euONN9SvXz/deeed/ufr3bu37r33Xi1atKjU7VX1888/KyUlRa1bt5Ykde/eXXfffbdWrlypm2++uczHtGvXTomJicrJyQnYBb9582Y1bNhQ9913n2mNAOAUnAIHQJVdcskl/gFRkpo3by5Juuyyy/wDYsntxcXFSktLkyRt27ZNOTk56tGjhzIzM/3/CwkJUfPmzU0/DU1ycrJ/QJSkmjVrqn79+jpy5MgZPV9MTIyOHz+uH374waxEAHAMtiQCqLLatWuX+rpkYCzv9pycHEnSL7/8IkmaOnVqmc8bFRV1VjulXwe9kp5gDR06VP/61780ceJE1atXT+3atVPPnj3VqlWrqqYCgO0YEgFUWcmpYip7e8mZt0r+f9y4cUpISAhY7tStkGXxeDxl3u7z+c6oJ1jJycmaMWOGNm/erC1btmj9+vVatmyZhg8fXunzTwKAUzEkArBN3bp1JUnx8fFq165d0I+PiYmR9OuWyZL/lqSjR4+aE1gJkZGR6t69u7p3767i4mI9++yzWrhwoa666ipOpQPA1TgmEYBt2rdvr6ioKC1atEjFxcUB92dmZlb4+Hr16kmSdu3a5b8tPz9f//znP03tjIyMVG5ubsDtWVlZpb4ODQ1VcnKyDMPQyZMnTW0AAKuxJRGAbaKjozVmzBjNmjVLDzzwgHr06KGaNWvq2LFj2rx5s1q2bKnbb7+93Me3a9dOtWvX1ksvvaQrr7xSISEhWrlypf85zNK0aVN99dVXevPNN9WsWTNFRkaqS5cuevzxx5WQkKCWLVsqISFBBw4c0Oeff65OnTqZfjwlAFiNIRGArXr27Cmv16vFixfr448/VlFRkRITE9W6dWv17du3wseGhoZqwoQJeu211zR//nwlJCRo8ODBio2N1Zw5c0xrHDBggPbt26dVq1bpH//4h5KSktSlSxf9/ve/15o1a/SPf/xD+fn5SkxM1KBBgzRs2DDTXhsA7MK1mwEAABCAYxIBAAAQgCERAAAAARgSAQAAEIAhEQAAAAEYEgEAABCAIREAAAABGBIBAAAQgCERAAAAARgSAQAAEIAhEQAAAAEYEgEAABCAIREAAAABGBIBAAAQ4P8D6xV88Fa5lzUAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "_ = plot_gantt_chart(schedule)" ] } ], "metadata": { "kernelspec": { "display_name": "job-shop-lib-gOF0HMZJ-py3.12", "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.12.3" } }, "nbformat": 4, "nbformat_minor": 2 }