cuOpt Routing — API Python
Confirmez le type de problème (TSP, VRP, PDP) et les données (localisations, commandes, flotte, contraintes) avant de coder.
Cette skill est Python uniquement. Routing n'a pas d'API C dans cuOpt.
Exemple VRP minimal
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()
Ajouter des contraintes
# Fenêtres de temps
dm.add_transit_time_matrix(transit_time_matrix)
dm.set_order_time_windows(earliest_series, latest_series)
# Capacités
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)
# Paires enlèvement-livraison
dm.set_pickup_delivery_pairs(pickup_indices, delivery_indices)
# Précédence
dm.add_order_precedence(node_id=2, preceding_nodes=np.array([0, 1]))
Vérifier la solution
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())
Types de données (utiliser des dtypes explicites)
cost_matrix = cost_matrix.astype("float32")
order_locations = cudf.Series([...], dtype="int32")
demand = cudf.Series([...], dtype="int32")
Paramètres du solveur
ss = routing.SolverSettings()
ss.set_time_limit(30)
ss.set_verbose_mode(True)
ss.set_error_logging_mode(True)
Problèmes courants
| Problème | Solution |
|---|---|
| Solution vide | Élargissez les fenêtres de temps ou vérifiez les temps de trajet |
| Commandes infaisables | Augmentez la flotte ou la capacité |
| Status != 0 avec fenêtres de temps | Ajoutez add_transit_time_matrix() |
| Coût incorrect | Vérifiez que cost_matrix est symétrique |
<!-- skill-evolution:start — WaypointMatrix.compute_waypoint_sequence mutates route_df -->
| compute_waypoint_sequence modifie route_df | Elle remplace la colonne location par des ids de waypoint sur place — passez route_df.copy() si vous avez encore besoin des indices de cost-matrix (p. ex. lors d'une itération par camion) |
<!-- skill-evolution:end -->
Débogage
Quand status != 0 : print(solution.get_error_message()) et print(solution.get_infeasible_orders().to_list()) pour voir quelles commandes sont infaisables.
Types de données : Utilisez des dtypes explicites (float32, int32) pour les matrices et séries afin d'éviter les erreurs silencieuses.
Exemples
- examples.md — VRP, PDP, multi-dépôt
- server_examples.md — Client REST (curl, Python)
- Modèles de référence :
assets/de cette skill — vrp_basic, pdp_basic. Voir assets/README.md.
Escalade
Pour contribution ou compilation depuis les sources, consultez la skill développeur.