{
  "resources": [
    {
      "name": "van-1",
      "shifts": [
        {
          "from": "2024-03-15T07:00:00Z",
          "to": "2024-03-15T16:00:00Z",
          "start": {
            "name": "Central Warehouse",
            "latitude": 51.5074,
            "longitude": -0.1278
          },
          "end": {
            "name": "Central Warehouse",
            "latitude": 51.5074,
            "longitude": -0.1278
          }
        }
      ],
      "capacity": [1000],
      "category": "CAR",
      "tags": ["standard-delivery"]
    },
    {
      "name": "van-2",
      "shifts": [
        {
          "from": "2024-03-15T07:00:00Z",
          "to": "2024-03-15T16:00:00Z",
          "start": {
            "name": "Central Warehouse",
            "latitude": 51.5074,
            "longitude": -0.1278
          },
          "end": {
            "name": "Central Warehouse",
            "latitude": 51.5074,
            "longitude": -0.1278
          }
        }
      ],
      "capacity": [800],
      "category": "CAR",
      "tags": ["standard-delivery", "express"]
    }
  ],
  "jobs": [
    {"name": "delivery-1", "location": {"latitude": 51.5155, "longitude": -0.1419}, "duration": 300, "load": [85], "priority": 100},
    {"name": "delivery-2", "location": {"latitude": 51.5080, "longitude": -0.1281}, "duration": 300, "load": [120], "priority": 50},
    {"name": "delivery-3", "location": {"latitude": 51.5033, "longitude": -0.1196}, "duration": 300, "load": [95], "priority": 80},
    {"name": "delivery-4", "location": {"latitude": 51.5136, "longitude": -0.1176}, "duration": 300, "load": [110], "priority": 60},
    {"name": "delivery-5", "location": {"latitude": 51.5185, "longitude": -0.1111}, "duration": 300, "load": [75], "priority": 90},
    {"name": "delivery-6", "location": {"latitude": 51.4994, "longitude": -0.1248}, "duration": 300, "load": [130], "priority": 70},
    {"name": "delivery-7", "location": {"latitude": 51.5041, "longitude": -0.1404}, "duration": 300, "load": [88], "priority": 100},
    {"name": "delivery-8", "location": {"latitude": 51.5098, "longitude": -0.1180}, "duration": 300, "load": [92], "priority": 40},
    {"name": "delivery-9", "location": {"latitude": 51.5129, "longitude": -0.1311}, "duration": 300, "load": [105], "priority": 85},
    {"name": "delivery-10", "location": {"latitude": 51.5017, "longitude": -0.1245}, "duration": 300, "load": [115], "priority": 95},
    {"name": "delivery-11", "location": {"latitude": 51.5144, "longitude": -0.1374}, "duration": 300, "load": [78], "priority": 55},
    {"name": "delivery-12", "location": {"latitude": 51.5089, "longitude": -0.1335}, "duration": 300, "load": [125], "priority": 75},
    {"name": "delivery-13", "location": {"latitude": 51.5062, "longitude": -0.1216}, "duration": 300, "load": [82], "priority": 65},
    {"name": "delivery-14", "location": {"latitude": 51.5171, "longitude": -0.1158}, "duration": 300, "load": [98], "priority": 90},
    {"name": "delivery-15", "location": {"latitude": 51.5023, "longitude": -0.1365}, "duration": 300, "load": [87], "priority": 45}
  ],
  "options": {
    "routingEngine": "OSM",
    "minimizeResources": false,
    "partialPlanning": false
  }
}
{
  "solution": {
    "routes": [
      {
        "resource": "van-1",
        "jobs": [
          {"job": "delivery-7", "arrival": "2024-03-15T07:15:00Z"},
          {"job": "delivery-15", "arrival": "2024-03-15T07:25:00Z"},
          {"job": "delivery-6", "arrival": "2024-03-15T07:38:00Z"},
          {"job": "delivery-10", "arrival": "2024-03-15T07:49:00Z"},
          {"job": "delivery-3", "arrival": "2024-03-15T08:02:00Z"},
          {"job": "delivery-13", "arrival": "2024-03-15T08:13:00Z"},
          {"job": "delivery-2", "arrival": "2024-03-15T08:24:00Z"},
          {"job": "delivery-12", "arrival": "2024-03-15T08:36:00Z"}
        ],
        "summary": {
          "totalLoad": 988,
          "totalJobs": 8,
          "totalTravelTime": 4680,
          "totalDistance": 23400,
          "capacityUtilization": 0.988
        }
      },
      {
        "resource": "van-2",
        "jobs": [
          {"job": "delivery-5", "arrival": "2024-03-15T07:12:00Z"},
          {"job": "delivery-14", "arrival": "2024-03-15T07:22:00Z"},
          {"job": "delivery-4", "arrival": "2024-03-15T07:32:00Z"},
          {"job": "delivery-8", "arrival": "2024-03-15T07:42:00Z"},
          {"job": "delivery-9", "arrival": "2024-03-15T07:54:00Z"},
          {"job": "delivery-1", "arrival": "2024-03-15T08:05:00Z"},
          {"job": "delivery-11", "arrival": "2024-03-15T08:15:00Z"}
        ],
        "summary": {
          "totalLoad": 783,
          "totalJobs": 7,
          "totalTravelTime": 4140,
          "totalDistance": 20700,
          "capacityUtilization": 0.979
        }
      }
    ],
    "unassigned": [],
    "metrics": {
      "totalJobs": 15,
      "assignedJobs": 15,
      "totalDistance": 44100,
      "averageCapacityUtilization": 0.983
    }
  }
}

Multi-Stop Delivery

This example demonstrates a typical parcel delivery scenario where multiple vehicles need to efficiently deliver packages to 15 customers while respecting vehicle capacity limits.

Business Scenario

A regional delivery company operates from a central warehouse and needs to:

  • Deliver 15 packages across the city
  • Use 2 delivery vans with different capacities
  • Minimize total travel distance
  • Ensure no vehicle is overloaded
  • Complete all deliveries within working hours

Complete Request

{
  "resources": [
    {
      "name": "van-1",
      "shifts": [
        {
          "from": "2024-03-15T07:00:00Z",
          "to": "2024-03-15T16:00:00Z",
          "start": {
            "name": "Central Warehouse",
            "latitude": 51.5074,
            "longitude": -0.1278
          },
          "end": {
            "name": "Central Warehouse",
            "latitude": 51.5074,
            "longitude": -0.1278
          }
        }
      ],
      "capacity": [1000],
      "category": "CAR",
      "tags": ["standard-delivery"]
    },
    {
      "name": "van-2",
      "shifts": [
        {
          "from": "2024-03-15T07:00:00Z",
          "to": "2024-03-15T16:00:00Z",
          "start": {
            "name": "Central Warehouse",
            "latitude": 51.5074,
            "longitude": -0.1278
          },
          "end": {
            "name": "Central Warehouse",
            "latitude": 51.5074,
            "longitude": -0.1278
          }
        }
      ],
      "capacity": [800],
      "category": "CAR",
      "tags": ["standard-delivery", "express"]
    }
  ],
  "jobs": [
    {"name": "delivery-1", "location": {"latitude": 51.5155, "longitude": -0.1419}, "duration": 300, "load": [85], "priority": 100},
    {"name": "delivery-2", "location": {"latitude": 51.5080, "longitude": -0.1281}, "duration": 300, "load": [120], "priority": 50},
    {"name": "delivery-3", "location": {"latitude": 51.5033, "longitude": -0.1196}, "duration": 300, "load": [95], "priority": 80},
    {"name": "delivery-4", "location": {"latitude": 51.5136, "longitude": -0.1176}, "duration": 300, "load": [110], "priority": 60},
    {"name": "delivery-5", "location": {"latitude": 51.5185, "longitude": -0.1111}, "duration": 300, "load": [75], "priority": 90},
    {"name": "delivery-6", "location": {"latitude": 51.4994, "longitude": -0.1248}, "duration": 300, "load": [130], "priority": 70},
    {"name": "delivery-7", "location": {"latitude": 51.5041, "longitude": -0.1404}, "duration": 300, "load": [88], "priority": 100},
    {"name": "delivery-8", "location": {"latitude": 51.5098, "longitude": -0.1180}, "duration": 300, "load": [92], "priority": 40},
    {"name": "delivery-9", "location": {"latitude": 51.5129, "longitude": -0.1311}, "duration": 300, "load": [105], "priority": 85},
    {"name": "delivery-10", "location": {"latitude": 51.5017, "longitude": -0.1245}, "duration": 300, "load": [115], "priority": 95},
    {"name": "delivery-11", "location": {"latitude": 51.5144, "longitude": -0.1374}, "duration": 300, "load": [78], "priority": 55},
    {"name": "delivery-12", "location": {"latitude": 51.5089, "longitude": -0.1335}, "duration": 300, "load": [125], "priority": 75},
    {"name": "delivery-13", "location": {"latitude": 51.5062, "longitude": -0.1216}, "duration": 300, "load": [82], "priority": 65},
    {"name": "delivery-14", "location": {"latitude": 51.5171, "longitude": -0.1158}, "duration": 300, "load": [98], "priority": 90},
    {"name": "delivery-15", "location": {"latitude": 51.5023, "longitude": -0.1365}, "duration": 300, "load": [87], "priority": 45}
  ],
  "options": {
    "routingEngine": "OSM",
    "minimizeResources": false,
    "partialPlanning": false
  }
}

Key Configuration Choices

Fleet Configuration

{
  "name": "van-1",
  "capacity": [1000],
  "category": "CAR",
  "tags": ["standard-delivery"]
}
  • Larger capacity for bulk deliveries
  • Standard delivery capability

Delivery Priorities

Each delivery has a priority value (0-100):

  • 100: Critical deliveries (must be prioritized)
  • 50-99: Important deliveries
  • 0-49: Standard deliveries

Total load of all packages: 1,490 units Combined vehicle capacity: 1,800 units This ensures all deliveries can be completed.

Optimization Strategy

"options": {
  "minimizeResources": false,
  "partialPlanning": false
}
  • minimizeResources: false - Use both vehicles to balance workload
  • partialPlanning: false - All deliveries must be assigned

Expected Response

{
  "solution": {
    "routes": [
      {
        "resource": "van-1",
        "jobs": [
          {"job": "delivery-7", "arrival": "2024-03-15T07:15:00Z"},
          {"job": "delivery-15", "arrival": "2024-03-15T07:25:00Z"},
          {"job": "delivery-6", "arrival": "2024-03-15T07:38:00Z"},
          {"job": "delivery-10", "arrival": "2024-03-15T07:49:00Z"},
          {"job": "delivery-3", "arrival": "2024-03-15T08:02:00Z"},
          {"job": "delivery-13", "arrival": "2024-03-15T08:13:00Z"},
          {"job": "delivery-2", "arrival": "2024-03-15T08:24:00Z"},
          {"job": "delivery-12", "arrival": "2024-03-15T08:36:00Z"}
        ],
        "summary": {
          "totalLoad": 988,
          "totalJobs": 8,
          "totalTravelTime": 4680,
          "totalDistance": 23400,
          "capacityUtilization": 0.988
        }
      },
      {
        "resource": "van-2",
        "jobs": [
          {"job": "delivery-5", "arrival": "2024-03-15T07:12:00Z"},
          {"job": "delivery-14", "arrival": "2024-03-15T07:22:00Z"},
          {"job": "delivery-4", "arrival": "2024-03-15T07:32:00Z"},
          {"job": "delivery-8", "arrival": "2024-03-15T07:42:00Z"},
          {"job": "delivery-9", "arrival": "2024-03-15T07:54:00Z"},
          {"job": "delivery-1", "arrival": "2024-03-15T08:05:00Z"},
          {"job": "delivery-11", "arrival": "2024-03-15T08:15:00Z"}
        ],
        "summary": {
          "totalLoad": 783,
          "totalJobs": 7,
          "totalTravelTime": 4140,
          "totalDistance": 20700,
          "capacityUtilization": 0.979
        }
      }
    ],
    "unassigned": [],
    "metrics": {
      "totalJobs": 15,
      "assignedJobs": 15,
      "totalDistance": 44100,
      "averageCapacityUtilization": 0.983
    }
  }
}

Route Visualization

Central Warehouse (★)
       |
   +---+---+
   |       |
 Van 1   Van 2
   |       |
   ↓       ↓
Route 1: ★ → 7 → 15 → 6 → 10 → 3 → 13 → 2 → 12 → ★
         (988/1000 units - 98.8% capacity)

Route 2: ★ → 5 → 14 → 4 → 8 → 9 → 1 → 11 → ★
         (783/800 units - 97.9% capacity)

Optimized delivery routes for both vehicles

Understanding the Results

Load Distribution

Both vehicles are nearly full but not overloaded:

  • Van 1: 988/1000 (98.8%)
  • Van 2: 783/800 (97.9%)

This excellent utilization minimizes the number of vehicles needed.

Priority Handling

High-priority deliveries (priority ≥ 90) are distributed across both routes to ensure timely service:

  • Van 1: deliveries 7 (100), 10 (95)
  • Van 2: deliveries 5 (90), 14 (90), 1 (100)

Time Efficiency

All deliveries are completed well within the 9-hour shift:

  • Van 1: Returns by 9:00 AM (2 hours total)
  • Van 2: Returns by 8:45 AM (1.75 hours total)

The early completion leaves room for:

  • Unexpected delays
  • Additional same-day deliveries
  • Driver breaks
  • Return trip traffic

Optimization Variations

Minimize Vehicle Usage

To use fewer vehicles when possible:

{
  "options": {
    "minimizeResources": true
  }
}

This might result in:

  • One heavily loaded vehicle
  • Longer routes
  • Less flexibility for additions

Allow Partial Delivery

For scenarios where not all packages fit:

{
  "options": {
    "partialPlanning": true
  }
}

The solver will:

  1. Prioritize high-priority deliveries
  2. Maximize assigned deliveries
  3. Report unassigned packages

Try It Yourself

curl -X POST 'https://api.solvice.io/v2/vrp/solve' \
  -H 'Authorization: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d @multi-stop-delivery.json

Best Practices

Next Steps