Plan & Optimize Delivery Routes

Hop provides extensible, high performance vehicle routing models so you can optimize your delivery routes. Importantly, Hop is JSON in / JSON out, simple to deploy to any cloud environment, easy to integrate with your stack, and scales with your growth.

Hop’s route planning component is a solver for the classic vehicle routing problem, or VRP. This model generates optimized route plans for a fleet of vehicles delivering items to various customer locations. Adding constraints like capacity or pickup and delivery time windows is as simple as importing additional Hop components. Of course, because Hop is source available, there’s no black box and you aren’t limited to components we provide off the shelf. You can customize and create your model components or extend Hop’s route solver to address your unique business considerations.

CustomExtensions

Extending the Route Solver

Hop’s vehicle route solver can be customized in any number of ways. In the base model, time required at each stop and carrying capacity are configurable, but Hop comes with an array of extensions out of the box. Time windows, pickup/delivery precedence, and different cost functions can all be incorporated through simple imports.

If you have a unique business constraint or rule, our components are flexible and can easily incorporate customized components. Anything you can represent in computer code can be part of your model.

Route Mapping Providers

The Hop vehicle routing solver produces JSON output that can be formatted to work with any geo provider or mapping solution. Visualize your routes however and wherever you want -- whether that’s OSRM, geojson.io, Google Maps, MapBox, OpenStreetMap, or even something you’ve developed internally.

GeoProviders

Input & Output Data

With Hop, you structure your routing decisions as code and version them along with the rest of your codebase. You define an input data format for Hop’s vehicle routing solver via simple structs and generate output based on what you want to pass to your other production systems. JSON in, JSON out.

When you’re developing locally, for example, you may want to include a human-readable customer name, but once you move to production, you may only need an ID number and lat/lon for mapping each vehicle’s route.

{
  "vehicles": [
    {
      "vehicle_id": "van-001",
      "start": [33.122746, -96.659222],
      "end":   [33.122746, -96.659222],
      "capacity": 105
    },
    {
      "vehicle_id": "van-151",
      "start": [33.122746, -96.659222],
      "end":   [33.005741, -96.860740],
      "capacity": 90
    },
    // ...
  ],
  "requests": [
    {
      "locations": [
        {
          "location_id": "customer-408,
          "position": [ 33.004745, -96.827094 ],
          "quantity": -7,
          "cost": 10
        }
      ]
    },
    {
      "locations": [
        {
          "location_id": "customer-215",
          "position": [ 33.005741, -96.860740 ],
          "quantity": -30,
          "cost": 10
        }
      ]
     },
    // ...
  ]
}

{
  "state": {
    "vehicles": [
      {
        "vehicle_id: "van-001",
        "route_by_id": [
          "van-001-start",
          "customer-408",
          "customer-760",
          "customer-805",
          "customer-818",
          "customer-310",
          "customer-323"
          "van-001-end",
        ],
        "value": 136665
      },
      {
        "vehicle_id": "van-151",
        "route_by_id": [
          "van-151-start",
          "customer-785",
          "customer-512",
          "customer-701",
          "customer-787",
          "customer-737",
          "customer-206",
          "customer-215"
          "van-151-end",
        ],
        "value": 121104
      },
      // ...
    ]
  },
  "statistics": {
    "search": {
      "deferred": 7020,
      "explored": 511,
      "solutions": 12
    },
    "time": {
      "elapsed": "8.396443566s",
    },
    value": 688657
  }
}