メインコンテンツまでスキップ

はじめに

問題空間

ステートレスAPIは、VRPPDTWおよびCVRPTWの問題を解決する機能を提供します。

いつ使用すべきか

ステートレスAPIは、SWATによって開発された最適化エンジンへの直接アクセスを提供します。複雑性が高いと同時に、ユースケースに適用可能なビジネスルールを設定する上で柔軟性を提供します。

ステートレスアプローチでは、SWATバックエンドはコンシューマーから送信されたオブジェクトの状態を維持しません。これは、データ主権またはデータプライバシーに関するコンシューマーの懸念に対処する可能性がありますが、コンシューマーが消費側アプリケーションでオブジェクトとマスターデータの状態を維持するための追加の負担を生み出します。さらに、SWATバックエンドにデータが永続化されていないため、ステートレスAPIは、ドライバーアプリケーションやWebアプリケーションなどのSWATアプリケーションとの統合には使用できません。

ステートレスAPIでは、すべてのペイロードに、車両の位置、ドロップオフおよびピックアップポイント、最適化セッション、予約など、最適化の実行に必要なすべてのデータを含める必要があります。

一般的に、複雑さと、エンドカスタマーへのサポートを提供するというコンシューマーの追加の負担のため、消費側アプリケーションでステートレスAPIを使用することはお勧めしません。ステートレスAPIを使用する開発者は、VRP空間を十分に理解していることが期待されます。

入力と出力

ステートレスAPIリクエストには、計算に必要なすべてのデータが含まれている必要があります。出力には、ノードと車両の割り当て、割り当てられた予約のリスト、および制約または利用可能な容量を満たさないために割り当てることができない予約のリストが含まれます。

同期モードと非同期モード

ステートレスAPIは、同期と非同期の両方の動作モードを提供します。最適化の実行には、ノードと予約の量に応じて時間がかかる場合があります。同期モードでは、結果はリクエストへの応答ですぐに利用可能になりますが、非同期モードでは、結果はjob_idを使用したコールバックを介して利用可能になります。

サポートされているスケジューリングモード

ステートレスAPIは、CVRPTW問題を解決するために使用されるprebook_cvrptwモードと、VRPPDTW問題を解決するためのprebookモードの2つのモードをサポートしています。 CVRPTWモードは、ピックアップポイント/DC/倉庫が1つしかないシナリオにのみ適しています。このモードでは、すべてのピックアップノードが結合され、ノード数が大幅に削減され、結果が大幅に向上します。ピックアップノードが結合されているため、各車両は最大1回のトリップ(または1回のピックアップ)に制限されます。このモードは、1回のピックアップと1回のドロップオフの両方のケース(つまり、単一のDC/倉庫からの商品の配送、および複数のピックアップ場所から単一のDC/倉庫への商品の収集)をサポートします。

リクエストの例

単一車両のVRPPDTWモデルの例を以下に示します。各ピックアップノードには正の需要値(例ではunits: 10)があり、ドロップオフノードには負の需要値(例ではunits: -10)があることに注意してください。ドロップオフとピックアップポイントの各ペアは、ペアに固有の同じbooking_uidを持つことによって互いにリンクされています。

Run In Postman

JSONペイロードを参照
PDP問題(複数のピックアップと複数のドロップオフ)
{
"current_time": "2024-07-10T08:00:00+00:00",
"engine_settings": {
"calculation_parameters": {
"calculations_mode": "sync",
"scheduling_mode": "prebook"
},
"model_parameters": {
"mixed_fleet": false,
"optimize_quantity": "total_time",
},
"routing_engine": {
"batch_matrix_size": 250,
"continue_straight": true,
"curb": false,
"key": "<routing_key>",
"make_depot_zero": true,
"road_network": "van",
"routing_engine_name": "osrme",
"speed": null,
"time_factor": 1,
"url": "http://mapbox-osrm-proxy",
"use_speed_in_routing": false
},
"solver_parameters": {}
},
"nodes": [
{
"booking_uid": "b00c0000-2024-0421-0616-000000000001",
"close_time_ts": "2026-01-02T00:35:00+00:00",
"close_time_ts_dynamic": "2026-01-02T00:35:00+00:00",
"demand": {
"units": 10
},
"end_of_trip": null,
"geofence_ids": [],
"lat": 1.290662,
"lon": 103.942707,
"lifo_order_check": false,
"lifo_order_penalty": null,
"location_name": "ピックアップ場所1",
"matrix_timestamp": "2024-07-10T08:00:00+00:00",
"max_slack": null,
"node_type": "pickup",
"open_time_ts": "2026-01-01T00:30:00+00:00",
"service_time": 0.0,
"trip_cost": 0.0,
"uid": "f0de0000-2024-0731-88ad-05ddd46ce71d",
"vehicle_characteristics": {}
},
{
"booking_uid": "b00c0000-2024-0421-0616-000000000001",
"close_time_ts": "2026-01-03T09:00:00+00:00",
"close_time_ts_dynamic": "2026-01-03T09:00:00+00:00",
"demand": {
"units": -10
},
"end_of_trip": null,
"geofence_ids": [],
"lat": 1.280097,
"lon": 103.889129,
"lifo_order_check": false,
"lifo_order_penalty": null,
"location_name": "ドロップオフ場所1",
"matrix_timestamp": "2024-07-10T08:00:00+00:00",
"max_slack": null,
"node_type": "dropoff",
"open_time_ts": "2026-01-01T00:00:00+00:00",
"service_time": 360.0,
"trip_cost": 0.0,
"uid": "f0de0001-2024-0731-88ad-05ddd46ce72d",
"vehicle_characteristics": {}
},
{
"booking_uid": "b00c0000-2024-0421-0616-000000000002",
"close_time_ts": "2026-01-02T00:35:00+00:00",
"close_time_ts_dynamic": "2026-01-02T00:35:00+00:00",
"demand": {
"units": 10
},
"end_of_trip": null,
"geofence_ids": [],
"lat": 1.290862,
"lon": 103.952507,
"lifo_order_check": false,
"lifo_order_penalty": null,
"location_name": "ピックアップ場所2",
"matrix_timestamp": "2024-07-10T08:00:00+00:00",
"max_slack": null,
"node_type": "pickup",
"open_time_ts": "2026-01-01T00:30:00+00:00",
"service_time": 0.0,
"trip_cost": 0.0,
"uid": "f0de0000-2024-0731-88ad-05ddd46ce73d",
"vehicle_characteristics": {}
},
{
"booking_uid": "b00c0000-2024-0421-0616-000000000002",
"close_time_ts": "2026-01-03T09:00:00+00:00",
"close_time_ts_dynamic": "2026-01-03T09:00:00+00:00",
"demand": {
"units": -10
},
"end_of_trip": null,
"geofence_ids": [],
"lat": 1.290097,
"lon": 103.989129,
"lifo_order_check": false,
"lifo_order_penalty": null,
"location_name": "ドロップオフ場所2",
"matrix_timestamp": "2024-07-10T08:00:00+00:00",
"max_slack": null,
"node_type": "dropoff",
"open_time_ts": "2026-01-01T00:00:00+00:00",
"service_time": 360.0,
"trip_cost": 0.0,
"uid": "f0de0001-2024-0731-88ad-05ddd46ce74d",
"vehicle_characteristics": {}
}
],
"vehicles": [
{
"agent_id": "dc1e0000-2024-0731-b23d-5206f1c21d09",
"capacity": {
"units": 999
},
"characteristics": {},
"completed_nodes": [],
"end_time": "2026-01-05T14:59:59+00:00",
"lat": 1.292097,
"lon": 103.999129,
"routing_engine": {
"batch_matrix_size": 250,
"curb": false,
"key": "<routing_key>",
"make_depot_zero": true,
"road_network": "van",
"routing_engine_name": "osrme",
"speed": null,
"time_factor": 1,
"url": "http://mapbox-osrm-proxy",
"use_speed_in_routing": false
},
"service_number": "バン2 - インスタンス",
"start_time": "2026-01-01T00:00:00+00:00",
"vehicle_cost": 1000.0
}
]
}

同様の問題の例ですが、CVRPTW問題の場合は以下です。ピックアップノードが1つ(車両の位置と同じ)あり、車両はピックアップ場所から出発することに注意してください。この場合の需要は、ピックアップノードでは0であり、各ドロップオフポイントでは正の値です。この場合の各予約はドロップオフポイントに固有であり、車両は、車両のpartial_route配列でピックアップノードのuidを使用することにより、開始場所としてピックアップに添付されます。

JSONペイロードを参照
CVRPTWの例
{
"current_time": "2024-07-10T08:00:00+00:00",
"engine_settings": {
"calculation_parameters": {
"calculations_mode": "sync",
"scheduling_mode": "prebook_cvrptw"
},
"model_parameters": {
"mixed_fleet": false,
"optimize_quantity": "total_time",
"groups_order": {}
},
"routing_engine": {
"batch_matrix_size": 250,
"continue_straight": true,
"curb": false,
"key": "<routing_key>",
"make_depot_zero": true,
"road_network": "van",
"routing_engine_name": "osrme",
"speed": null,
"time_factor": 1,
"url": "http://mapbox-osrm-proxy",
"use_speed_in_routing": false
},
"solver_parameters": {}
},
"nodes": [
{
"booking_uid": "b00c0000-2024-0421-0616-000000000001",
"close_time_ts": "2026-01-03T09:00:00+00:00",
"close_time_ts_dynamic": "2026-01-03T09:00:00+00:00",
"demand": {
"units": 10
},
"end_of_trip": false,
"geofence_ids": [],
"lat": 1.280097,
"lon": 103.889129,
"lifo_order_check": false,
"lifo_order_penalty": null,
"location_name": "ドロップオフ場所1",
"matrix_timestamp": "2024-07-10T08:00:00+00:00",
"max_slack": null,
"node_type": "dropoff",
"open_time_ts": "2026-01-01T00:00:00+00:00",
"service_time": 360.0,
"trip_cost": 0.0,
"uid": "f0de0001-2024-0731-88ad-05ddd46ce72d",
"vehicle_characteristics": {}
},
{
"booking_uid": "b00c0000-2024-0421-0616-000000000002",
"close_time_ts": "2026-01-03T09:00:00+00:00",
"close_time_ts_dynamic": "2026-01-03T09:00:00+00:00",
"demand": {
"units": 10
},
"end_of_trip": false,
"geofence_ids": [],
"lat": 1.290097,
"lon": 103.989129,
"lifo_order_check": false,
"lifo_order_penalty": null,
"location_name": "ドロップオフ場所2",
"matrix_timestamp": "2024-07-10T08:00:00+00:00",
"max_slack": null,
"node_type": "dropoff",
"open_time_ts": "2026-01-01T00:00:00+00:00",
"service_time": 360.0,
"trip_cost": 0.0,
"uid": "f0de0001-2024-0731-88ad-05ddd46ce74d",
"vehicle_characteristics": {}
},
{
"close_time_ts": "2026-01-05T00:35:00+00:00",
"close_time_ts_dynamic": "2026-01-05T00:35:00+00:00",
"demand": {
"units": 0
},
"lat": 1.290662,
"lon": 103.943407,
"location_name": "オフィス",
"max_trip_duration": 0,
"node_type": "point",
"open_time_ts": "2026-01-01T00:00:00+00:00",
"end_of_trip": true,
"service_time": 0.0,
"trip_cost": 0,
"weight": 0.0,
"uid": "dc1e0000-2024-0731-b23d-5206f1c21d09"
}
],
"vehicles": [
{
"agent_id": "dc1e0000-2024-0731-aaaa-5206f1c21d09",
"capacity": {
"units": 999
},
"characteristics": {},
"partial_route": ["dc1e0000-2024-0731-b23d-5206f1c21d09"],
"completed_nodes": [],
"end_time": "2026-01-10T14:59:59+00:00",
"lat": 1.290662,
"lon": 103.943407,
"routing_engine": {
"batch_matrix_size": 250,
"curb": false,
"key": "<routing_key>",
"make_depot_zero": true,
"road_network": "van",
"routing_engine_name": "osrme",
"speed": null,
"time_factor": 1,
"url": "http://mapbox-osrm-proxy",
"use_speed_in_routing": false
},
"service_number": "バン2 - インスタンス",
"start_time": "2024-01-01T00:00:00+00:00",
"vehicle_cost": 1000.0
}
]
}