{ "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", " # in one machine.\n", " return (operation_id, machine_id)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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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": 7, "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": 8, "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": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "env.reset()" ] }, { "cell_type": "code", "execution_count": 9, "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": 10, "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": 10, "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.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 }