Demo

🚛 Stower Physics‑Aware Optimization

High‑Performance VRP Routing + 3D Container Loading.

Load + Route optimization for furniture delivery

See your routes optimized in 60 seconds

Ship more furniture per truck, reduce damage, and get a 3D load plan you can trust.

Trucks 12 → 10
Utilization 67% → 84%
Damage risk reduced with strap + tilt rules
Why this matters
Current state (manual loading)
  • Dispatchers guess at load plans
  • Drivers repack at stops
  • Damage rates: 8–12%
  • Truck utilization: 60–70%
With Stower
  • Physics-validated 3D load plans
  • Stop-sequence aware unloadability
  • Damage rates: 2–4%
  • Truck utilization: 80–90%
Outcome-first: fewer trucks, fewer claims, faster dispatch.
30-second walkthrough
Replace the embed URL
Show: upload → optimize → 3D load plan → utilization improvement.
Calculating Optimized Fleet Plan...
Drag to Rotate • Scroll to Zoom • Right-click to Pan
Stop #TypeAddressArrival (ETA)Delay
SeqItem IDActionRisk scoreRisk labelMitigationsNotes
Results will appear here...
What‑If Scenarios

Scenarios are not automatic unless you call the scenario endpoint. This page can auto-generate a starter set from your current payload.

Choose scenarios to compare (pick up to 5)
These are templates. Select any combination and the app will run only the chosen scenarios (up to 5) against the baseline.
Tip: If you select nothing, the app will run the default starter set.
Endpoint: logistics_controller_demo.php (PHP forwards to /optimize_scenarios server-side).
Scenario Results
0
Scenario Status Trucks Miles On‑time % Unassigned Load feas % Axle % Damage risk
Run scenarios to see results here.
Raw scenario response (debug)
{}
🧪 Test Data Builder
Build realistic Trucks → Jobs → Stops → Items payloads without hand-writing JSON. Click Build Payload → JSON to update the Integration Payload box, then run optimization as usual.
Tip: paste your request JSON in Integration payload (JSON) on the left, then click Load from Integration payload.

Additional packing/routing policies
Travel matrix advanced (optional)
Travel matrix limits & cache (optional)
Driver break rules (seconds)
Packing metaheuristic (GA) (optional)
Feasibility prover (optional)
Routing LNS refinement (optional)
Objectives (VRP tradeoffs)
Routing vs Loading emphasis (selection)
Furniture handling policies
Efficiency tips: Use seed for repeatability, set realistic stop service_time_sec, and keep item dims/weight accurate. For chairs/tables, turn on nesting fields (items editor) to boost utilization.

Add one or more trucks. Dims are inches. Duration is seconds.
Truck ID Type Start Start location Crew Dims (L/W/H) Limits (mi / stops / dur) Max weight Max vol Equipment Dock mode Loading sides Trailer profile

Each job can contain one or more stops; each stop contains items.

The Integration Payload box (left panel) is what gets sent to logistics_controller_demo.php.
Validation output
No validation run yet.

Advanced overrides (for deep testing): Paste JSON objects here to apply extra parameters that aren’t exposed in the UI yet. These are deep‑merged into the payload right before sending. Invalid JSON will block Build/Run.
For best optimization quality, make sure your test data includes:
  • Accurate item dims + weight (avoid rounding everything to “nice” numbers).
  • Stop time windows (earliest/latest) and service_time_sec for realistic feasibility.
  • Furniture flags: fragile, stackable, is_top_flat, allowed_orientations, and nesting fields when relevant.
  • Truck equipment + crew size (liftgate/dolly/helper) to prevent unrealistic assignments.
Help — Furniture Industry Payload Guide
3‑minute prospect walkthrough
  1. Open Test Data Builder → choose Metro Furniture Deliveries preset → Load preset.
  2. Click Build Payload → JSON (writes payload into Integration Payload), then click Run Optimization.
  3. In Optimization Results, show KPIs, Exceptions, and the Explain panel (one‑click “Apply & Run” fixes).
Recent updates:
  • Explainability is no longer limited to “Top 5”. This UI reads explain.items (fallback explain.top5) and displays everything returned.
  • What‑If scenarios are available via POST /optimize_scenarios.
  • Scenarios are generated by the caller. This page can auto-generate a starter set and show scenario-by-scenario deltas.
Routing (VRP) + 3D Loading/Packing — what to send for best results.
Payload Routing Packing
Quick Start
  1. Send { "config", "trucks", "jobs" }.
  2. Always include item dims + weight (inches/lbs).
  3. Use seed for repeatable rollout tests.
  4. Use lifo_mode="hard" if unload order must match stops.
  5. Use nesting fields for chairs/tables to improve utilization.
High-impact knobs
  • travel_matrix.provider: haversine (fast) vs google_routes (road-aware)
  • policies.objective.weights: miles vs trucks-used tradeoff
  • quality_weights: bias selection toward better routes vs better loads
  • enable_voxel_nesting + voxel_pitch_in: more accurate nesting (slower)

  • Trucks Used / Stops Planned / Miles: “Are we using the right fleet for today’s workload?”
  • On‑Time: percent of planned stops expected within windows (from engine KPIs when available).
  • Safety Score + Utilization: “Can we load it safely and efficiently?”
  • Exceptions: anything that could not be planned (with reasons).
  • Explain: top recommendations, plus optional one‑click JSON changes to fix common issues (tight windows, missing equipment, etc.).
Demo tip: show an exception, click Apply & Run on the recommended fix, and point out how KPIs update immediately.

The request is:

{
  "config": { ... },
  "trucks": [ ... ],
  "jobs": [ ... ]
}
Tip: Treat this as a complete “day plan” model (OptimizeRequest).

Required
  • depot_address (string)
  • depot_lat, depot_lng (float)
Authentication (browser vs server)
This Data Builder is designed to call the PHP controller, which injects authentication via headers server-side. No API key is required (or stored) in the browser payload.
Determinism
  • seed (int, optional) — set this for repeatable runs.
Travel matrix (accuracy vs speed)
  • travel_matrix.provider: "haversine" or "google_routes"
  • travel_matrix.traffic: traffic-aware durations (Google)
  • travel_matrix.departure_time (ISO8601, optional)
  • travel_matrix.routing_preference (optional)
  • travel_matrix.fallback_to_haversine: fill gaps if provider fails
  • travel_matrix.timeout_sec (float)
  • travel_matrix.max_elements_per_request (int)
  • travel_matrix.cache_ttl_sec (int)
  • travel_matrix.cache_max_entries (int)
  • travel_matrix.osrm_base_url, travel_matrix.osrm_profile (OSRM)

Furniture realism modes
  • lifo_mode: "soft" or "hard" — many furniture routes want hard.
  • time_window_mode: "hard" or "soft" (default hard)
  • enforce_geometry: keep true unless routing-only
Objectives (VRP)
FieldMeaning
policies.objective.weights.total_milesscales miles / arc costs
policies.objective.weights.trucks_usedpushes toward fewer trucks
policies.objective.truck_fixed_cost_miles“1 truck ≈ X miles” tradeoff knob
If you pay per route/truck, increase trucks_used weight and set a realistic truck_fixed_cost_miles (e.g., 60–120).
Routing vs Loading emphasis
  • quality_weights: tilt solution selection toward better routing vs better loading (default routing 0.6 / loading 0.4).

Break rules (Hours-of-Service)
  • break_rules.mandatory_break_duration (sec)
  • break_rules.drive_time_before_break (sec)
Use break rules when your routes must respect driver rest requirements.
Solver controls & metaheuristics
  • solver_max_seconds, local_search_iters: runtime vs quality
  • metaheuristic.enable_ga: enable genetic search
  • metaheuristic.population_size, generations, elite_fraction, mutation_rate
  • vrp_lns (and policies.vrp_lns): LNS tuning knobs (advanced)
Feasibility prover (why it failed)
  • feasibility_prover_enabled: attempt a proof when planning fails
  • feasibility_prover_max_seconds, feasibility_prover_max_items
  • feasibility_prover_extract_core + feasibility_prover_core_seconds: extract a minimal “unsat core”
  • feasibility_prover_include_witness: include assignment/witness details when possible
Turn this on when you need actionable explanations for unplanned stops/items (tight windows, missing equipment, impossible packing constraints).

  • Identity: truck_id, truck_type
  • Start: start_location, start_time
  • Crew: crew_size (1=driver, 2=driver+helper)
  • Interior dims (in): dims.l, dims.w, dims.h
  • Route limits: max_miles, max_duration, max_stops
  • Capacity: max_cargo_weight, max_cargo_volume (if used)
  • Capabilities: has_liftgate, has_dolly, has_pallet_jack
  • Dock/service: dock_height_mode and loading_sides
Furniture tip: set liftgate/dolly correctly for residential deliveries and consider crew_size=2 for heavy/oversized routes.

Job
  • job_id (int)
  • priority (int) — higher wins when tradeoffs exist
  • exclusive_truck_ids (optional) — force assignment
Stop
  • stop_id, type ("pickup" or "delivery")
  • address, lat, lng
  • Time windows: earliest, latest (ISO8601)
  • service_time_sec — affects routing feasibility/on-time
  • Equipment requirements: requires_liftgate, requires_dolly, etc.
  • dock_height and loading_side constraints

Core fields (always include)
  • item_id (string)
  • weight (lbs)
  • dims in inches: { "l", "w", "h" }
  • item_class (e.g., upholstery, wood, glass, mattress)
Handling & stacking
  • stackable (bool)
  • is_top_flat (bool) — false for rounded/tufted pieces
  • fragile (bool)
  • max_stack_weight and max_tier
Placement, orientation, tilt
  • position_constraint: none | bottom | rear | top
  • allowed_orientations: upright / rotated
  • tilt_modes: e.g. upright / side (for rugs/mattresses if allowed)
Assemblies (sectionals / multi-piece sets)
  • assembly_id (optional) — keeps related pieces grouped
Nesting / nestable (chairs, tables, frames)
  • is_nestable: the item nests with others (chairs/stools)
  • can_accept_underload: item creates a cavity (tables/bed frames)
  • can_nest_with: list of allowed classes/SKU prefixes that can go inside/under
  • stack_group_id (+ members) for “virtual stacks”
Example: set can_accept_underload=true on tables and is_nestable=true on chairs, then whitelist chair classes in can_nest_with.
Advanced constraints (optional but powerful)
  • constraints.bottom_layer, constraints.top_layer: force items to the bottom/top layer
  • constraints.front_load, constraints.rear_load: bias placement toward the front/rear
  • constraints.z_band: keep items in a vertical band (bottom/mid/top)
  • mesh_url + mesh_format: optional 3D mesh reference (for higher-fidelity packing/visualization)
  • Hazmat separation: hazmat.incompatible_with + hazmat.requires_separation_in
These are exposed in the Builder’s Advanced item column. Anything else can still be applied via the Item JSON patch.

Load score (0–100) penalizes
  • low utilization (under ~85%)
  • unplaced items (big penalty)
  • center-of-gravity bias
  • physics alerts
Routing score (0–100) penalizes
  • miles relative to truck.max_miles
  • lateness (total delay)
Use quality_weights to bias selection toward “better loads” vs “better routes”.

A) Payload completeness (biggest driver)
  • Accurate item dimensions + weight (missing/rounded dims destroy packing quality).
  • Use item_class, fragile, is_top_flat, stackable, max_stack_weight realistically.
  • Use stop time windows + service_time_sec if on-time delivery matters.
B) Furniture-specific features you should actually use
  • Nesting: can_accept_underload (tables/frames), is_nestable (chairs), and can_nest_with.
  • LIFO: set lifo_mode="hard" when unload order must match stops (may reduce utilization but improves realism).
  • Orientation/tilt: allow "side" for mattresses/rugs if permitted; glass usually cannot.
C) Speed vs quality levers
  • Use haversine early; switch to google_routes for production ETAs/traffic.
  • Enable GA only when chasing higher utilization and you can afford more compute.
  • If voxel nesting is enabled, don’t start with very small voxel_pitch_in (accuracy ↑, cost ↑).
D) Repeatability during rollout
  • Set a fixed seed so ops can compare before/after on identical inputs.

This example includes seed, nesting fields, and objective weights.

{
  "config": {
"depot_address": "DC - Nashville",
    "depot_lat": 36.1627,
    "depot_lng": -86.7816,
    "timezone": "America/New_York",
    "seed": 12345,
    "travel_matrix": {
      "provider": "google_routes",
      "traffic": true,
      "routing_preference": "TRAFFIC_AWARE",
      "fallback_to_haversine": true,
      "timeout_sec": 15.0
    },
    "lifo_mode": "hard",
    "time_window_mode": "hard",
    "enforce_geometry": true,
    "policies": {
      "fragile_separation": true,
      "aisle_priority": true,
      "strap_priority": true,
      "enable_voxel_nesting": true,
      "voxel_pitch_in": 2.0,
      "objective": {
        "weights": { "total_miles": 1.0, "trucks_used": 0.6 },
        "truck_fixed_cost_miles": 80.0
      }
    },
    "metaheuristic": {
      "enable_ga": false,
      "population_size": 18,
      "generations": 10,
      "elite_fraction": 0.25,
      "mutation_rate": 0.25
    },
    "quality_weights": { "routing": 0.5, "loading": 0.5 }
  },
  "trucks": [
    {
      "truck_id": "T-101",
      "truck_type": "dry-van-53",
      "start_location": "DC - Nashville",
      "start_time": "08:00",
      "crew_size": 2,
      "dims": { "l": 636.0, "w": 100.0, "h": 110.0 },
      "max_miles": 450.0,
      "max_duration": 39600,
      "max_stops": 20,
      "max_cargo_weight": 34000.0,
      "has_liftgate": true,
      "has_dolly": true,
      "dock_height_mode": "either",
      "loading_sides": ["rear"]
    }
  ],
  "jobs": [
    {
      "job_id": 9001,
      "priority": 3,
      "stops": [
        {
          "stop_id": "S1",
          "type": "delivery",
          "address": "123 Main St, Franklin, TN",
          "lat": 35.9251,
          "lng": -86.8689,
          "earliest": "2025-12-20T10:00:00-05:00",
          "latest": "2025-12-20T12:00:00-05:00",
          "service_time_sec": 1800,
          "requires_liftgate": true,
          "dock_height": "ground",
          "loading_side": "rear",
          "items": [
            {
              "item_id": "TABLE-72IN-001",
              "weight": 180,
              "dims": { "l": 72, "w": 42, "h": 30 },
              "item_class": "wood",
              "fragile": false,
              "stackable": false,
              "can_accept_underload": true,
              "can_nest_with": ["chairs", "stools", "boxed"],
              "allowed_orientations": ["upright"],
              "tilt_modes": ["upright"]
            },
            {
              "item_id": "CHAIR-SET-001-A",
              "weight": 28,
              "dims": { "l": 22, "w": 22, "h": 40 },
              "item_class": "chairs",
              "fragile": false,
              "is_nestable": true,
              "stack_group_id": "CHAIRS-SET-001",
              "allowed_orientations": ["upright", "rotated"]
            }
          ]
        }
      ]
    }
  ]
}