Help us improve
Share bugs, ideas, or general feedback.
From NVIDIA
Solves vehicle routing problems (VRP, TSP, PDP) using the cuOpt Python API. Provides examples for cost matrices, constraints, time windows, capacities, and solution debugging.
npx claudepluginhub nvidia/skills --plugin nvidia-skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/nvidia-skills:cuopt-routing-api-pythonThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Confirm problem type (TSP, VRP, PDP) and data (locations, orders, fleet, constraints) before coding.
Provides guidelines for using NVIDIA cuOpt SDK: routing, LP/MILP/QP, installation, and server deployment. Activates when users need help calling cuOpt APIs or setting up the solver.
Automates Optimoroute operations via Composio's toolkit through Rube MCP. Discovers tool schemas, manages connections, and executes route optimization tasks.
Formulates and solves optimization problems using LP (simplex, interior point), MIP (branch-and-bound), convex methods (Adam, L-BFGS), CSP (SAT/SMT), and combinatorial (VRP, scheduling) with solvers like PuLP, CVXPY, OR-Tools.
Share bugs, ideas, or general feedback.
Confirm problem type (TSP, VRP, PDP) and data (locations, orders, fleet, constraints) before coding.
This skill is Python only. Routing has no C API in cuOpt.
import cudf
from cuopt import routing
cost_matrix = cudf.DataFrame([...], dtype="float32")
dm = routing.DataModel(n_locations=4, n_fleet=2, n_orders=3)
dm.add_cost_matrix(cost_matrix)
dm.set_order_locations(cudf.Series([1, 2, 3], dtype="int32"))
solution = routing.Solve(dm, routing.SolverSettings())
if solution.get_status() == 0:
solution.display_routes()
# Time windows
dm.add_transit_time_matrix(transit_time_matrix)
dm.set_order_time_windows(earliest_series, latest_series)
# Capacities
dm.add_capacity_dimension("weight", demand_series, capacity_series)
dm.set_order_service_times(service_times)
dm.set_vehicle_locations(start_locations, end_locations)
dm.set_vehicle_time_windows(earliest_start, latest_return)
# Pickup-delivery pairs
dm.set_pickup_delivery_pairs(pickup_indices, delivery_indices)
# Precedence
dm.add_order_precedence(node_id=2, preceding_nodes=np.array([0, 1]))
status = solution.get_status() # 0=SUCCESS, 1=FAIL, 2=TIMEOUT, 3=EMPTY
if status == 0:
route_df = solution.get_route()
total_cost = solution.get_total_objective()
else:
print(solution.get_error_message())
print(solution.get_infeasible_orders().to_list())
cost_matrix = cost_matrix.astype("float32")
order_locations = cudf.Series([...], dtype="int32")
demand = cudf.Series([...], dtype="int32")
ss = routing.SolverSettings()
ss.set_time_limit(30)
ss.set_verbose_mode(True)
ss.set_error_logging_mode(True)
| Problem | Fix |
|---|---|
| Empty solution | Widen time windows or check travel times |
| Infeasible orders | Increase fleet or capacity |
| Status != 0 with time windows | Add add_transit_time_matrix() |
| Wrong cost | Check cost_matrix is symmetric |
compute_waypoint_sequence alters route_df | It replaces the location column with waypoint ids in place — pass route_df.copy() if you still need cost-matrix indices (e.g. when iterating per truck) |
When status != 0: print(solution.get_error_message()) and print(solution.get_infeasible_orders().to_list()) to see which orders are infeasible.
Data types: Use explicit dtypes (float32, int32) for matrices and series to avoid silent errors.
assets/ — vrp_basic, pdp_basic. See assets/README.md.For contribution or build-from-source, see the developer skill.