Path Optimization
Pick path optimization reduces walking time by ordering pick tasks in a logical sequence through the warehouse. ScanPick currently uses an alphanumeric sort algorithm (v1), with coordinate-based optimization planned for a future release.
v1 — Alphanumeric Sort (Current)
Section titled “v1 — Alphanumeric Sort (Current)”Pick tasks are sorted by their location address components:
Sort order: Zone → Aisle → Rack → Shelf → BinExample
Section titled “Example”Given these pick tasks:
| Product | Location |
|---|---|
| Widget A | A-01-03-02-01 |
| Widget B | A-01-01-01-01 |
| Widget C | B-01-01-01-01 |
| Widget D | A-02-01-01-01 |
Sorted pick path:
1. Widget B → A-01-01-01-012. Widget A → A-01-03-02-013. Widget D → A-02-01-01-014. Widget C → B-01-01-01-01Limitations
Section titled “Limitations”- Assumes aisles are numbered sequentially along a logical path
- Does not account for: aisle width, one-way aisles, obstacles
- Does not optimize for replenishment or multi-worker congestion
- No per-worker starting position
v2 — Coordinate-Based (Planned)
Section titled “v2 — Coordinate-Based (Planned)”Future path optimization will use physical coordinates for each location:
Interface IPathOptimizer{ Task<List<PickTask>> OptimizePath( List<PickTask> tasks, WarehouseLayout layout, string? startingLocation)}Planned features:
- Physical X/Y coordinates per location
- Traveling Salesperson Problem solver for optimal routes
- Multi-worker congestion avoidance
- Walking distance estimates per wave
- Zone-based batching (pick one zone fully before moving to the next)
Configuration
Section titled “Configuration”Path optimization is behind the IPathOptimizer interface. In v1, the
implementation is the alphanumeric sort. When v2 arrives, swapping the
implementation requires only changing the DI registration:
// Current (v1)services.AddSingleton<IPathOptimizer, AlphanumericPathOptimizer>();
// Future (v2)// services.AddSingleton<IPathOptimizer, CoordinatePathOptimizer>();