{ "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", " FeatureObserverType,\n", " FeatureType,\n", ")\n", "from job_shop_lib.dispatching import DispatcherObserverConfig\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", " DispatcherObserverConfig(\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_config=DispatcherObserverConfig(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_index': MultiDiscrete([[39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39]\n", " [39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39\n", " 39 39 39 39 39 39]], 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 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -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 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1]]), '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", " # on 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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", "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": null, "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.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 }