Custom Instances¶
JobShopLab provides flexible ways to define custom scheduling problem instances. This tutorial covers how to create and use your own problem specifications.
Instance Types¶
JobShopLab supports three ways to define problem instances:
Spec Files: Academic JSSP problem definitions found in literature
DSL Files: YAML files using the JobShopLab Domain Specific Language
DSL Strings: Inline DSL definitions (useful in Jupyter notebooks)
Using Academic Instances¶
To use standard academic instances from literature:
# In your config.yaml
compiler:
repo: "SpecRepository"
spec_repository:
dir: "data/jssp_instances/ft06" # Path to instance file
Or via dependency injection:
from jobshoplab.compiler.repos import SpecRepository
from jobshoplab.compiler import Compiler
repo = SpecRepository(dir=Path("data/jssp_instances/ft06"), loglevel="warning", config=config)
compiler = Compiler(config=config, loglevel="warning", repo=repo)
env = JobShopLabEnv(config=config, compiler=compiler)
Creating DSL Instances¶
For real-world problems with more complex constraints, use DSL files:
Basic DSL Structure¶
title: InstanceConfig
instance_config:
description: "My custom instance"
instance:
description: "3x3 problem"
specification: |
(m0,t)|(m1,t)|(m2,t)
j0|(0,3) (1,6) (2,4)
j1|(1,8) (0,5) (2,3)
j2|(2,5) (0,4) (1,7)
init_state:
# Optional initial state configuration
The DSL file must contain: - An instance_config section defining the problem - An optional init_state section for custom initialization
Loading DSL Files¶
Configure the environment to use your DSL file:
# In your config.yaml
compiler:
repo: "DslRepository"
dsl_repository:
dir: "path/to/your/instance.yaml"
Or via dependency injection:
from jobshoplab.compiler.repos import DslRepository
repo = DslRepository(dir=Path("path/to/your/instance.yaml"), loglevel="warning", config=config)
compiler = Compiler(config=config, loglevel="warning", repo=repo)
env = JobShopLabEnv(config=config, compiler=compiler)
Adding Transport Resources¶
To model material handling:
instance_config:
# Standard job and machine definitions
transport:
type: "agv"
amount: 2
logistics:
specification: |
m-0|m-1|m-2|in-buf|out-buf
m-0|0 10 15 5 5
m-1|10 0 12 8 8
m-2|15 12 0 10 10
in-buf|5 8 10 0 0
out-buf|5 8 10 0 0
init_state:
transport:
- location: "m-0"
- location: "m-1"
This defines: - 2 AGVs for material transport - Travel times between all locations - Initial positions of the transport units
Using DSL Strings¶
For quick experiments, define instances inline:
dsl_str = """
title: InstanceConfig
instance_config:
description: "Inline instance"
instance:
description: "2x2 problem"
specification: |
(m0,t)|(m1,t)
j0|(0,3) (1,2)
j1|(1,2) (0,4)
"""
from jobshoplab.compiler.repos import DslStrRepository
repo = DslStrRepository(dsl_str=dsl_str, loglevel="warning", config=config)
compiler = Compiler(config=config, loglevel="warning", repo=repo)
env = JobShopLabEnv(config=config, compiler=compiler)
Advanced Instance Features¶
JobShopLab supports advanced features including:
Setup times: Sequence-dependent changeover times
Stochastic processing: Distribution-based processing durations
Machine breakdowns: Scheduled or random downtime events
Alternative process plans: Multiple operation sequences for jobs