تعرض 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_timeلـVisitالتالية.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المقابلة لـVisits المخصّصة لمركبة قابلة للتطبيق.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
}
}
}