Skip to content

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.

Pick tasks are sorted by their location address components:

Sort order: Zone → Aisle → Rack → Shelf → Bin

Given these pick tasks:

ProductLocation
Widget AA-01-03-02-01
Widget BA-01-01-01-01
Widget CB-01-01-01-01
Widget DA-02-01-01-01

Sorted pick path:

1. Widget B → A-01-01-01-01
2. Widget A → A-01-03-02-01
3. Widget D → A-02-01-01-01
4. Widget C → B-01-01-01-01
  • 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

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)

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>();