{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# RL Graph Environment: Learning from one instance" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from job_shop_lib.reinforcement_learning import (\n", " # MakespanReward,\n", " SingleJobShopGraphEnv,\n", " ObservationSpaceKey,\n", " IdleTimeReward,\n", " ObservationDict,\n", ")\n", "from job_shop_lib.dispatching.feature_observers import (\n", " FeatureObserverConfig,\n", " FeatureObserverType,\n", " FeatureType,\n", ")\n", "from job_shop_lib.graphs import build_disjunctive_graph\n", "from job_shop_lib.benchmarking import load_benchmark_instance" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "instance = load_benchmark_instance(\"ft06\")\n", "job_shop_graph = build_disjunctive_graph(instance)\n", "feature_observer_configs = [\n", " FeatureObserverConfig(\n", " FeatureObserverType.IS_READY,\n", " kwargs={\"feature_types\": [FeatureType.JOBS]},\n", " )\n", "]\n", "\n", "env = SingleJobShopGraphEnv(\n", " job_shop_graph=job_shop_graph,\n", " feature_observer_configs=feature_observer_configs,\n", " reward_function_type=IdleTimeReward,\n", " render_mode=\"human\", # Try \"save_video\"\n", " render_config={\n", " \"video_config\": {\"fps\": 4}\n", " }\n", ")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Dict('edge_list': MultiDiscrete([[38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38]\n", " [38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38\n", " 38 38 38 38 38 38]]), 'jobs': Box(-inf, inf, (6, 1), float32), 'removed_nodes': MultiBinary(38))" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "env.observation_space" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "38" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(job_shop_graph.nodes)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "random.seed(42)\n", "\n", "\n", "def random_action(observation: ObservationDict) -> tuple[int, int]:\n", " ready_operations = []\n", " for operation_id, is_ready in enumerate(\n", " observation[ObservationSpaceKey.JOBS.value].ravel()\n", " ):\n", " if is_ready == 1.0:\n", " ready_operations.append(operation_id)\n", "\n", " operation_id = random.choice(ready_operations)\n", " machine_id = -1 # We can use -1 if each operation can only be scheduled\n", " # in one machine.\n", " return (operation_id, machine_id)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1.],\n", " [1.],\n", " [1.],\n", " [1.],\n", " [1.],\n", " [1.]], dtype=float32)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "env.get_observation()[ObservationSpaceKey.JOBS]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(5, -1)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "random_action(env.get_observation())" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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OXIkRo4ciezsbHTv3h3Tpk2zDBSv9z1+//33cHNzw5o1a6xeYl+0aFGFHEFBQfDx8Sn1D7Ori4iIQHZ2tuUIImPMftPjkAFjleiVV16Bh4cHRo0ahfPnz9t8/tqjIVeOmlx7e2Xfienp6Vnq1VeuzD9Y1iuz/OMf/0BqaiqeeuopFBUV2Xx+7dq1WLVqVblspX3PSim899575bofT0/PUl+yLE/33nsviouL8cEHH1jdPm/ePJhMJvTv379S939tN9r+Dz/8MGJiYqwGi0eOHMGGDRswZMgQy209e/ZEcHAwvvrqK8vL0kDJpfmuHK2tqlJTU63+7eXlhcjISKuXzK/3PTo6OsJkMqG4uNhy24kTJ0q9glBZunIZxp9++qnUAfaV/Wvo0KHYtm0b1qxZY7NMenp6qfs1Y0zPeESR2X0NGzbE119/jUcffRSNGze2XJlFKYXExER8/fXXcHBwsJxz5+Pjg+7du2P27NkoLCxErVq1sHbtWiQmJlbK0a5dO/z666945513EBYWhvr166NTp06Wo1Gvvvoq/vKXv8DZ2RkDBw687gTWjzzyCPbv348ZM2Zgz549VldmWb16NdavX1/uN080adIEERER+Otf/4ozZ87Ax8cH33//fblfMm3Xrh2+/fZbvPTSS+jQoQO8vLwwcODAct3HwIEDcdddd+HVV1/FiRMn0KpVK6xduxY//vgjXnjhBas3UxhRREQE/Pz88NFHH8Hb2xuenp7o1KkT6tevj2effRYLFy7EgAED8Ne//hXOzs545513EBISgpdfftlyH66urpgzZw6efPJJdO/eHcOHD0dSUhLee+893HnnnXjwwQcNNV9dVFQUevbsiXbt2sHf3x+7du3Cd999hwkTJliWubKPPf/88+jbty8cHR3xl7/8BQMGDMA777yDfv364bHHHkNKSgrmz5+PyMjICl/W8s0338TatWvRo0cPjBkzBk2bNsXZs2exbNky/P777/Dz88OkSZOwcuVK3HfffZbpfnJycrB//3589913OHHihGWqKMaY5sm82Zox4zt27JgaN26cioyMVG5ubsrd3V01adJEjR07VsXFxVkte/r0afXAAw8oPz8/5evrq4YMGaKSk5MVADV16lTLclemx7lw4YLV15c23ckff/yhunfvrtzd3S0Tbl/pjTfeULVq1VIODg5lnipn/fr1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O3asYY5rS0tLUz4+PurTTz+1/GKaMmWK1TItWrRQkydPNmydzs7OqnPnzla3Pffcc+qOO+6wui07O1vFx8erbdu2qVGjRql69eqp8+fPG+a40rXPSRIDxRs9L+bm5ipfX1/19ttvG77eb775RtWuXVt98803at++ferf//638vf3twzaq+u58tixY6p79+4KgHJ0dFQdOnRQw4YNU02aNLFarioHijczzJkzRzVq1EitXLlS7d27V/3rX/9SXl5ehp0aUtGB4rV99tlnysnJSeXl5RniYuXLLgeK+fn5ytHR0eaI2hNPPKHuv//+arWcOHFCOTg4qBUrVlTreq99AM6bN8/yy/jKBwDl4OCg6tata/j6x48fr2rXrq2OHz9+3WWqeqB4PcOxY8cUAHXgwAGr2++55x71zDPPVInlyv1f70hZdna2AqBWr15tyLqWL19uefK/+ud9ZR8oKipSSimVmZmpOnfurO655x7LUT+jKqtBqZIjmlf2g5CQEDV79mxDLdfWvn17NXnyZHX8+HEFQH3xxRdWnx86dKh67LHHDFtfeHi4Gj16tNVtH374oQoLC7vh10VGRtoc7apspT0nXflD5drHYnh4uHrnnXcMXf/1DFf373//Wzk7O6uUlBTD1127dm31wQcfWN32xhtvqMaNGyulqv+5Mjs72zIwGjp0qLr33nutPl+VA8UbGXJzc5Wzs7PNOYyjR49Wffv2NWS91/6eSkhIKPV77d69u3r++eevez8HDhxQANQff/xhiIuVL7s8R9HFxQXt2rXD+vXrLbeZzWasX7/e6hyx6mjRokUIDg7GgAEDqnW91zZ8+HDs27cPcXFxlo+wsDBMmjQJa9asMWw9SilMmDABy5cvx4YNG1C/fn3D7tsow5VzAa99V6ujo6Ph77a9OrPZjPz8/FI/d2Xqi5o1axqyrnvuuQf79++3+nm3b98ew4YNQ1xcHBwdHZGZmYk+ffrAxcUFK1eutDlXqToMVwoMDISfnx82bNiAlJQU3H///YZari47OxsJCQmoWbMm6tWrh7CwMJvpk44ePYq6desats6uXbtWaB032mcqWmnPSe3atYOzs7PVc+aRI0eQlJRUJc+ZN3te/Oyzz3D//fcjKCjI8HXn5ube8LFfXc+VV/L09ETNmjWRlpaGNWvWYNCgQYavoyKGwsJCFBYWVuvzZP36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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.display import clear_output\n", "\n", "done = False\n", "obs, _ = env.reset()\n", "while not done:\n", " action = random_action(obs)\n", " obs, reward, done, *_ = env.step(action)\n", " if env.render_mode == \"human\":\n", " env.render()\n", " clear_output(wait=True)\n", "\n", "if env.render_mode == \"save_video\" or env.render_mode == \"save_gif\":\n", " env.render()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "19 zeros out of 36\n" ] } ], "source": [ "import numpy as np\n", "\n", "rewards = np.array(env.reward_function.rewards)\n", "print(f\"{len(list(filter(lambda x: x != 0, rewards)))} zeros out of {len(rewards)}\")" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-9.11111111111111" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rewards.mean()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-328" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rewards.sum()" ] } ], "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 }