It's Here! NVIDIA cuOpt 22.06 - Download Now!

We are proud to announce the June 2022 (22.06) release of NVIDIA cuOpt and hope you will enjoy using it as much as we have enjoyed building it!

New Features

  1. Multi Depot Routing - Set different set of start and return locations for each vehicle or default to depot (0) for a start and return locations for all vehicles.
    cuopt.DataModelView.set_vehicle_locations

     # Set half the vehicles to start at the depot and return to node 5
     # Set the other half to start at node 5 and return to the depot
     v_start = cudf.Series(
         [0] * (n_vehicles // 2) +
         [5] *  (n_vehicles - n_vehicles // 2))
     v_return = cudf.Series(
         [5] * (n_vehicles // 2) +
         [0] *  (n_vehicles - n_vehicles // 2))
     my_data_model.set_vehicle_locations(v_start, v_return)
    
  2. Set Maximum distance per route to support Upper Bound on route length. This allows compliance with certain laws to ensure maximum distance allowed per route/vehicle.
    cuopt.Solver.set_max_distance_per_route

    # Set max_distance_per_route > 0.0 to add an upper bound 
     max_distance_per_route=0.0
     if max_distance_per_route > 0.0:
          my_solver.set_max_distance_per_route(max_distance_per_route)
    
  3. Provide an option to exclude the cost of the first trip for certain vehicles in the fleet - cuopt.DataModelView.skip_first_trips

     # Skip the first trip for half of the vehicles 
     vehicle_skip_first_trips = cudf.Series(
         [True] * (n_vehicles // 2) +
         [False] * (n_vehicles - n_vehicles // 2))
     my_data_model.skip_first_trips(vehicle_skip_first_trips)
    
  4. Waypoint Graphs- get the cost matrix and waypoint level routes from a waypoint graph which is highly useful in intralogistics use cases.

    waypoint_graph.compute_cost_matrix(target_locations)
    waypoint_graph.compute_waypoint_sequence(unique_target_locs, route)
    
  5. Precedence constraints to interleave sequence of tasks or pick-up and deliveries - cuopt.DataModelView.add_precedence

     # The service begin time of node 4 will be later 
     # than the service end time of nodes 1, 2, and 3 
       my_data_model.add_precedence(4, cudf.Series([1,2,3]))
    
  6. Enable dropping of orders in case of an infeasible solution for successful solve - the previous version of Solver fails if there is no feasible solution

    cuopt.DataModelView.drop_infeasible_orders in 
    cuopt.DataModelView.DataModelView and the default_capacity parameter in  
    cuopt.DataModelView.add_capacity_dimension  
    
  7. Enhanced API to let a list of Vehicle Break Windows - In the previous version, the API to add_break_dimension() provides an output combining jobs/orders and break windows together as routes. This is now enhanced to separate orders serviced from break windows.

    add_break_dimension(break_earliest, break_latest, break_duration)
    
  8. Enhance output display of routes to demarcate breaks, pick-up and delivery inform tion. 1) Update the display in the solution DataFrame ‘type’ column. 2) Update route display with ‘B’ for break points, ‘D’ for Delivery, ‘Dpt’ for Depot and ‘P’ for Pick-up.

     	 route  arrival_stamp  truck_id  location      type
     0         0     567.000000         8         0     Depot
     1      1327     567.000000         8         8    Pickup
     2       344     710.181824         8         4  Delivery
     3      1301    4246.000000         8        37    Pickup
     4       318    4391.454590         8         8  Delivery
     ...     ...            ...       ...       ...       ...
     2001    585   58984.183594         3         4  Delivery
     2002   1572   59147.367188         3        51    Pickup
     2003    589   59310.550781         3         4  Delivery
     2004   1967   61200.000000         3         1     Break
     2005      0   61666.816406         3         0     Depot
    
     [2006 rows x 5 columns]
     
     Vehicle-3 starts at: 5500.0, completes at: 61666.82, travel time: 56166.82,  Route : 
     0(Dpt)->1968(B)->1237(P)->254(D)->1245(P)->262(D)->1232(P)->249(D)->1773(P)->790(D)->1771(P)->788(D)->1762(P)->779(D)->1763(P)->780(D)->1759(P)->776(D)->1967(B)->1590(P)->607(D)->1589(P)->606(D)->1578(P)->595(D)->1583(P)->600(D)->1579(P)->596(D)->1568(P)->585(D)->1572(P)->589(D)->1967(B)->0(Dpt)
    
  9. Deprecated API for Euclidean matrices. Users requiring a euclidean distance matrix from a point list will need to generate it themselves - an example is provided in the cost matrix creation notebook. Alternate option below:

    import cuopt.utils
    coords = cudf.DataFrame()
    coords['x'], coords['y'] = node_list['xcoord'], node_list['ycoord']
    utils.build_matrix(coords)
    
  10. Expanded Example Notebooks. Find these in the cuOpt container and run them via ‘docker run --rm --network=host --gpus=all nvcr.io/ea-reopt-member-zone/ea-cuopt:22.06 jupyter-notebook`

    Cost Matrix creation - demonstrates how to build a cost matrix for various problem types.
    Cvrp_daily_deliveries - demonstrates a simple delivery use case with minimum vehicle constraint.
    Cvrptw_service_team_routing - demonstrates service team routing using technicians with availability and skillset.
    Cvrpstw_priority_routing - demonstrates routing of mixed priority orders.
    Cpdptw_intra-factory_transport - demonstrates routing modeled as a pickup and delivery problem with AMRs.
    Cvrptw_benchmark_gehring_homberger - demonstrates a benchmark run using a large academic problem instance
    

Bug Fixes

  • Fix a bug in waypoint_matrix functions to enable runtime checks
  • Fix to allow call to compute_waypoint_sequence without prior set_order_locations call
  • Fix a bug in determining smallest route in each climber
  • Fix demand and candidate overflow
  • Fix demand fill and update user guess with recent features

Download
cuOpt, provides a Jupyter Notebook and is a good place get started directly with the library.
cuOpt Server, provides a RESTful microservice example.

Please post on the forum or email us at cuopt@nvidia.com.

best,

NVIDIA cuOpt Team