{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# RL Graph Environment: Learning from many instances" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from job_shop_lib.reinforcement_learning import (\n", " MultiJobShopGraphEnv,\n", " ObservationSpaceKey,\n", " ObservationDict,\n", ")\n", "from job_shop_lib.dispatching import DispatcherObserverConfig\n", "from job_shop_lib.dispatching.feature_observers import (\n", " FeatureObserverType,\n", " FeatureType,\n", ")\n", "from job_shop_lib.graphs import build_agent_task_graph\n", "from job_shop_lib.generation import GeneralInstanceGenerator" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "generator = GeneralInstanceGenerator(\n", " num_jobs=(3, 6), num_machines=(3, 5), allow_less_jobs_than_machines=False\n", ")\n", "feature_observer_configs = [\n", " DispatcherObserverConfig(\n", " FeatureObserverType.IS_READY,\n", " kwargs={\"feature_types\": [FeatureType.JOBS]},\n", " )\n", "]\n", "\n", "env = MultiJobShopGraphEnv(\n", " instance_generator=generator,\n", " feature_observer_configs=feature_observer_configs,\n", " graph_initializer=build_agent_task_graph,\n", " render_mode=\"human\", # Try \"save_video\"\n", " render_config={\"video_config\": {\"fps\": 4}},\n", ")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "random.seed(100)\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", " # on one machine.\n", " return (operation_id, machine_id)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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hRDKEniABg0aAABOnTpVrt97VHxFRUXo0aMH7ty5gzfeeAMNGjSAk5MTrl+/jjFjxpTI+f5vwtRU9lOpf/31FwYMGIBOnTphyZIlqFGjBmxtbbFq1Sr88MMPRnHs378fe/bswa+//ort27fjp59+QteuXfHHH39Ao9GgYcOGOH/+PLZt24bt27djw4YNWLJkCWbPno333nuvUvMoK8Vt/d1335n8A/hgQVCWJ6X1ej18fX3x/fffm3z/weLIVJsmJCSgW7duaNCgAT7//HPUqlULWq0Wv/32GxYuXFhq7+yDcfTo0QMzZsww+X69evUeuQ9zUZbj5uvri5iYGOzYsQO///47fv/9d6xatQrPPfcc1qxZ89DfTU9PR+fOneHq6oq5c+ciNDQU9vb2iI6OxhtvvFHieJnrM6y8bV0acXFxWL58Ob744gvcuHHD8HpeXh50Oh0uXboEV1dXeHp6lis+oGy5Tp06Ff3798emTZuwY8cOvPPOO5g/fz52796N5s2bP3T/H374Id555x2MGzcO8+bNg6enJ9RqNaZOnVppfz+K9/uvf/3LZC87UPILIGO9cFH4EPr27Yt///vfOHLkCFq1avXI7dPS0rBr1y689957mD17tuH14h6UilLarb7y3AKsV68e6tevj82bN2PRokWlPshRXk6dOoULFy5gzZo1eO655wyvl/e2VXlyKY3atWvjzz//RFZWllFvYfHtrtq1a1dov8WD4E+fPl2uD8cNGzbA3t4eO3bsMHooY9WqVSW2VavV6NatG7p164bPP/8cH374Id566y3s2bMH3bt3BwA4OTnhqaeewlNPPYWCggIMGTIEH3zwAWbNmmVy6pKKxv0gtWvXRnx8fInXH3yt2Ofr62uIWSmhoaH4888/0b59+woX8Vu3bkV+fj62bNli1LNi6nZkaedhaGgosrOzH5lX8fRV2dnZRtfY+fPnKxS7ErRaLfr374/+/ftDr9fj5ZdfxrJly/DOO+8gLCys1Fz37t2L1NRU/PLLL+jUqZPh9cTExArHEhoaisOHD0On05X6sIg52hq492CUXq/H5MmTSwwlAe71Jk+ZMqVck+WXl9DQUEybNg3Tpk1DXFwcmjVrhs8++wz//e9/AZR+nq1fvx6PP/44Vq5cafR6enq64WHC8sYB3PsMKO3crVOnDoB70/CY67plqi+W0WVj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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.display import clear_output\n", "\n", "n_episodes = 3\n", "instances = []\n", "total_rewards = []\n", "for _ in range(n_episodes):\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", " if env.render_mode == \"save_video\" or env.render_mode == \"save_gif\":\n", " env.render()\n", "\n", " instances.append(env.dispatcher.instance)\n", " total_rewards.append(sum(env.reward_function.rewards))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Instance: JobShopInstance(name=classic_generated_instance_2, num_jobs=4, num_machines=5)\n", "Total reward: -495\n", "\n", "Instance: JobShopInstance(name=classic_generated_instance_3, num_jobs=6, num_machines=5)\n", "Total reward: -666\n", "\n", "Instance: JobShopInstance(name=classic_generated_instance_4, num_jobs=4, num_machines=4)\n", "Total reward: -312\n", "\n" ] } ], "source": [ "for instance, total_reward in zip(instances, total_rewards):\n", " print(f\"Instance: {instance}\")\n", " print(f\"Total reward: {total_reward}\")\n", " print()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "({'removed_nodes': array([False, False, False, False, False, False, False, False, False,\n", " False, False, False, False, False, False, False, False, False,\n", " False, False, True, True, True, True, True, True, True,\n", " True, True, True, True, True, True, True, True]),\n", " 'edge_index': array([[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3,\n", " 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6,\n", " 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9,\n", " 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12,\n", " 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15,\n", " 15, 15, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17,\n", " 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, -1, -1,\n", " -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n", " -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n", " -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n", " -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n", " -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n", " -1, -1, -1, -1, -1, -1, -1, -1],\n", " [16, 1, 2, 3, 4, 17, 0, 2, 3, 4, 18, 0, 1, 3, 4, 19,\n", " 0, 1, 2, 4, 15, 0, 1, 2, 3, 15, 6, 7, 8, 9, 19, 5,\n", " 7, 8, 9, 16, 5, 6, 8, 9, 17, 5, 6, 7, 9, 18, 5, 6,\n", " 7, 8, 15, 11, 12, 13, 14, 16, 10, 12, 13, 14, 19, 10, 11, 13,\n", " 14, 17, 10, 11, 12, 14, 18, 10, 11, 12, 13, 4, 5, 10, 16, 17,\n", " 18, 19, 0, 7, 11, 15, 17, 18, 19, 1, 8, 13, 15, 16, 18, 19,\n", " 2, 9, 14, 15, 16, 17, 19, 3, 6, 12, 15, 16, 17, 18, -1, -1,\n", " -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n", " -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n", " -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n", " -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n", " -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n", " -1, -1, -1, -1, -1, -1, -1, -1]], dtype=int32),\n", " 'jobs': array([[ 1.],\n", " [ 1.],\n", " [ 1.],\n", " [-1.],\n", " [-1.],\n", " [-1.]], dtype=float32)},\n", " {})" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "env.reset()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "removed_nodes (35,)\n", "edge_index (2, 200)\n", "jobs (6, 1)\n" ] } ], "source": [ "for key, array in obs.items():\n", " print(key, array.shape)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Dict('edge_index': MultiDiscrete([[36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36]\n", " [36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", " 36 36 36 36 36 36 36 36]], start=[[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1]\n", " [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1]]), 'jobs': Box(-inf, inf, (6, 1), float32), 'removed_nodes': MultiBinary(35))" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "env.observation_space" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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 }