تعرض واجهة برمجة التطبيقات Route Optimization API مسارات المركبات في الطلب المقابل. يتم إسناد الشحنات إلى المركبات، أو قد يتم تخطّيها استنادًا إلى سمات الطلب.
تحتوي رسالة OptimizeToursResponse (REST وgRPC) على سمتَين أساسيتَين من المستوى الأعلى:
routes[]هي مسارات كل مركبة مع الشحنات المخصّصة لها. يحتوي كلRouteعلى مقاييس تعكس خصائص هذا المسار الفردي.metricsهي مقاييس مجمّعة للردّ بالكامل، على مستوى كل المركبات وخطط المسارات. تحتوي المقاييس على مستوى القمة على السمات نفسها التي تحتوي عليها ومقاييس كل مسار، مع تجميع القيم على مستوى كل المسارات.
قد لا تتم تعبئة بعض السمات في بعض الأحيان استنادًا إلى نتائج التحسين:
skippedShipments[]يعرض الشحنات التي لا يتم نقلها بواسطة أي مركبة. يمكن تخطّي شحنة إذا تعذّر تنفيذها ضمن قيود محدّدة أو إذا تجاوزت تكلفة تنفيذها تكلفة العقوبة. على سبيل المثال، إذا كان وقت تسليم أو استلام الشحنة محدودًا جدًا، قد لا يكون من الممكن أو ذا تكلفة معقولة أن تُجري المركبة التسليم أو الاستلام خلال الفترة الزمنية المطلوبة.timeWindow- يحدِّد
validationErrors[]الأخطاء التي تجعل الطلب غير صالح أو مستحيل حلّه عند ضبطsolvingModeللطلب علىVALIDATE_ONLY. في الوضع العاديDEFAULT_SOLVE، ستظهر أخطاء التحقّق في رسالة خطأ بدلاً من نص الاستجابة. يُرجى العِلم أنّهVALIDATE_ONLYيمكن أن يُبلغ وضع حلّ المشاكل عن أخطاء متعدّدة في آنٍ واحد، ما هو مفيد لتصحيح أخطاء الطلبات بسرعة.
سمات المسار
كل إدخال routes[] هو رسالة ShipmentRoute (REST أو gRPC). يمثّل كل
ShipmentRoute تعيين مسار لمركبة معيّنة من
الطلب. تشمل السمات المهمة في ShipmentRoute ذات الصلة بالVehicle المقابلة لها ما يلي:
vehicleIndexهو الفهرس الذي يبدأ من الصفر للعنصرVehicleفي رسالة الطلب المقابلة. تحذف ردود REST هذه السمة عندما تكون القيمة صفرًا.vehicleStartTimeهو الوقت الذي يجب أن تبدأ فيه المركبة مسارها.vehicleEndTimeهو الوقت المتوقّع لإنهاء المركبة مسارها.
في الردّ، سيظهر الرمز routes على النحو التالي:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
...
],
"transitions": [
...
],
"metrics": {
...
},
...
}
],
...
}
يحتوي كل ShipmentRoute على قائمة مرتبة بالvisits التي ستكملها المركبة. يمثّل كل Visit (REST وgRPC) VisitRequest
(REST وgRPC) من الطلب المقابل. تشمل Visit
السمات المهمة ما يلي:
shipmentIndexهو الفهرس المُستند إلى الصفر للشحنة التي تنتمي إليها هذه الزيارة في الطلب المقابل.- تكون القيمة
isPickupصحيحة عندما تكون الزيارة عملية استلام وخاطئة عندما تكون عملية تسليم. تحذف ردود REST هذه السمة عندما تكون القيمة خطأ. visitRequestIndexهو الفهرس الذي يبدأ من الصفر للعنصرVisitRequestمنShipment.pickupsأوShipment.deliveriesفي الطلب المقابل الذي يمثّلهVisit. تحذف ردود REST هذه السمة عندما تكون قيمة صفر.startTimeهو الوقت المتوقّع لبدء الزيارة.- تُحدِّد
loadDemandsنوع التحميل حسب كمية التحميل المطلوبة لإكمالVisit. تكون كميات الحمولة سالبة لزيارات التسليم، ما يشير إلى الحمولة التي تتم إزالتها من المركبة.
في ما يلي مثال على Visit:
{
"routes": [
{
...
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
...
],
},
...
],
...
}
يتضمّن كل ShipmentRoute قائمة مرتبة من transitions تمثّل
التنقّل بين visits لمركبة معيّنة. تشمل خصائص رسائل Transition
المهمة (REST وgRPC) ما يلي:
startTimeهو الوقت الذي ستبدأ فيه المركبة في تنفيذ عملية الانتقال.travelDurationهي المدة التي يجب أن تقطعها المركبة لإكمال عملية النقل.travelDistanceMetersهي المسافة التي يجب أن تقطعها المركبة بالمتر لإكمال عملية النقل.- يشير
trafficInfoUnavailableإلى ما إذا كانت بيانات عدد الزيارات متاحة لحالة الانتقال. - يمثّل
waitDurationوقت التوقف الذي تقضيه المركبة في الانتظار قبل أن تتمكّن من بدءVisitالتالي. قد يرجع ذلك إلىstart_timeVisitالتالي. totalDurationهي إجمالي مدة النقل، بما في ذلك أوقات التنقّل والانتظار والاستراحة والتأخير.vehicleLoadsتُحدِّد نوع الحمولة حسب كمية الحمولة التي تحملها المركبة أثناء هذا النقل.
في ما يلي مثال على Transition:
{
"routes": [
{
...
"transitions": [
...
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
...
],
...
}
],
...
}
لمزيد من المعلومات عن العلاقة بين vists وtransitions، يُرجى الاطّلاع على
تحسين طلبات التوقف في نقاط الاستلام والتسليم والمستندات المرجعية ShipmentRoute (REST وgRPC). لمزيد من المعلومات عن سمتَي
routePolyline وrouteToken في رسالة Transition، اطّلِع على
الخطوط المتعددة المنحنية للانتقال ورموز المسار.
سمات المقاييس
تلخّص رسالة Metrics (REST وgRPC) الحلّ بأكمله.
تشمل بعض خصائص Metrics المهمة ما يلي:
totalCostهي التكلفة الإجمالية المتكبّدة في إكمال المسارات. اطّلِع على مزيد من المعلومات عن التكاليف في مَعلمات نموذج التكلفة.usedVehicleCountهو إجمالي عدد المركبات المستخدَمة في الحلّ. قد تتضمّن المركبات مسارات فارغة عندما يحدّد المحسِّن أنّ استخدامها غير ضروري.skippedMandatoryShipmentCountهو عدد الشحنات التي تم تخطّيها والتي هي "إلزامية". لا تحدِّد الشحنة الإلزامية قيمةpenaltyCostالتي يتمّ تحمّلها في حال تخطّي الشحنة. سيظل بإمكانك تخطّي الشحنات الإلزامية إذا لم يكن أداؤها ممكنًا بموجب قيود محدّدة. اطّلِع على مزيد من المعلومات عن التكاليف في مَعلمات نموذج التكلفة.
يتم تسجيل المقاييس الإضافية كرسائل AggregatedMetrics (REST
gRPC). يتم استخدام نوع الرسالة AggregatedMetrics للسمة
Metrics.aggregatedRouteMetrics وللسمة ShipmentRoute.metrics
Metrics.aggregatedRouteMetrics التي تحتوي على مقاييس مجمّعة من جميع
ShipmentRoute في OptimizeToursResponse. تحتوي كلّ سمة ShipmentRoute.metrics
على مقاييس لهذا ShipmentRoute المحدّد.
تشمل خصائص AggregatedMetrics المهمة ما يلي:
performedShipmentCountهو عدد الشحنات التي تُجريها المركبات على طول مساراتها بالكامل.travelDurationهو إجمالي الوقت الذي تقضيه المركبات في النقل أثناء إكمال مساراتها.waitDurationهو إجمالي الوقت الذي تقضيه المركبات في الانتظار أثناء إكمال مساراتها.-
delayDurationهو إجمالي وقت التأخير للمركبات. يكون هذا عادةً صفرًا ما لم يتم استخدامTransitionAttributesفي الطلب. breakDurationهو إجمالي الوقت الذي تقضيه المركبات في فترات الراحة أثناء إكمال مساراتها.visitDurationهو إجمالي الوقت الذي تقضيه المركبات في إجراء الزيارات أثناء إكمال مساراتها. وهذا هو مجموع كل قيمVisitRequest.durationلعناصرVisitRequestالتي تتوافق مع عناصرVisitالمخصّصة للمركبة السارية.totalDurationهي إجمالي المدة المطلوبة لإكمال خطوط سير المركبات.travelDistanceMetersهي إجمالي المسافة التي قطعتها المركبات أثناء إكمال مساراتها.maxLoadsتربط أنواع الحمولة بالحد الأقصى للحمولة التي تنقلها المركبات في أيّ نقطة على مساراتها.
في ما يلي مثال على رسالة Metrics:
{
"routes": [
...
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}
مثال كامل
مثال كامل على ردّ الطلب من إنشاء طلب يشبه ما يلي:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
{
"startTime": "2024-02-13T00:19:31Z",
"detour": "0s"
}
],
"transitions": [
{
"travelDuration": "0s",
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1151s",
"travelDistanceMeters": 9599,
"waitDuration": "0s",
"totalDuration": "1151s",
"startTime": "2024-02-13T00:19:31Z"
}
],
"metrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"routeCosts": {
"model.vehicles.cost_per_kilometer": 18.603
},
"routeTotalCost": 18.603
}
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}