Skip to content

Core Concepts & Architecture

Simulatte models two complementary domains — production planning (job-shop) and intralogistics (warehouse and AGV) — both built on a shared SimPy Environment that drives the simulation clock and event queue. The two domains can run independently or side by side within the same simulation; their orchestrators (ShopFloor and FleetCoordinator) coordinate all domain-specific behaviour while delegating timing to the common environment.

Production planning

The Router is the stochastic arrival process: it creates ProductionJobs — each carrying its server routing, processing times, and absolute due date — and feeds them into the PreShopPool (in a pull system) or directly to the ShopFloor (in a push system). A release policy (LumsCor, SLAR, Draco, or ConWIP) monitors the pool and admits jobs to the ShopFloor, the central orchestrator that tracks WIP, fires lifecycle hooks, and maintains EMA performance metrics. The ShopFloor then routes each job through its sequence of Servers. Each Server is a SimPy priority resource that re-orders its queue before every dispatch — calling sort_queue to re-evaluate the job's priority policy — and that priority policy is the dispatching rule (SPT, EDD, ATC, Focus, and others). Runner repeats the whole simulation across multiple seeds; SimLogger records events throughout.

graph TD
    Env["Environment<br/>clock + events"]
    Router["Router<br/>stochastic arrivals"]
    Job["ProductionJob<br/>routing · processing times · due date"]
    PSP["PreShopPool"]
    RP["Release Policy<br/>LumsCor / SLAR / Draco / ConWIP"]
    SF["ShopFloor<br/>orchestrator · WIP"]
    S["Server<br/>priority queue"]
    DR["Dispatching Rule<br/>SPT / EDD / ATC / Focus"]
    Runner["Runner<br/>multi-seed runs"]
    Log["SimLogger"]

    Router -->|creates| Job
    Router -->|pull system| PSP
    Router -->|push system| SF
    RP -->|releases jobs from| PSP
    PSP -->|released to| SF
    SF -->|routes job through| S
    S -->|queue ordered by| DR
    S -->|completes step| SF
    Env -.drives.-> Router
    Env -.drives.-> SF
    Env -.drives.-> S
    SF -.records.-> Log
    Runner -.runs many.-> SF

Intralogistics

A TransferOrder is queued in the FleetCoordinator, the central orchestrator for all AGV missions. The coordinator assigns an AGV via pluggable dispatch and repositioning policies, plans its path across the LayoutGraph (a directed graph of nodes and arcs), and enforces node-capacity constraints via a TrafficManager. The AGV picks inventory from a source Warehouse, transits to the destination, puts it down, and then either recharges at a ChargingStation or parks at a ParkingArea. All order and time-series metrics are collected throughout.

graph TD
    Env2["Environment"]
    LG["LayoutGraph<br/>Nodes + Arcs"]
    WH["Warehouse<br/>inventory + bays"]
    TO["TransferOrder"]
    FC["FleetCoordinator<br/>orchestrator"]
    DP["Dispatch / Repositioning /<br/>Replenishment / Load-recovery policies"]
    TM["TrafficManager"]
    AGV["AGV<br/>AGVType + SpeedProfile + Battery"]
    CH["ChargingStation"]
    PK["ParkingArea"]
    M["Order + time-series metrics"]

    TO -->|queued in| FC
    FC -->|assigns via| DP
    FC -->|paths on| LG
    LG -->|guarded by| TM
    FC -->|commands| AGV
    AGV -->|picks/puts at| WH
    AGV -->|charges at| CH
    AGV -->|parks at| PK
    Env2 -.drives.-> FC
    Env2 -.drives.-> AGV
    FC -.records.-> M

How the two domains connect

Both orchestrators — ShopFloor for production and FleetCoordinator for intralogistics — run as SimPy processes on the same Environment clock, so their events interleave naturally without any special coupling. You can combine them in a single simulation by passing the shared env instance to both. For the full API surface see the API Reference; for worked walkthroughs see the Production Planning & Control guide and the Intralogistics guide.