تفسير الرد

مطوّرو المنطقة الاقتصادية الأوروبية (EEA)

تعرض Route Optimization API مسارات للمركبات في الطلب المقابل. يتم تخصيص الشحنات للمركبات، أو قد يتم تخطّيها استنادًا إلى خصائص الطلب.

تحتوي رسالة OptimizeToursResponse (REST وgRPC) على سمتَين رئيسيتَين على المستوى الأعلى:

  • routes[] هي مسارات كل مركبة مع الشحنات المخصّصة لها. يحتوي كل Route على مقاييس تعكس خصائص هذا المسار الفردي.
  • metrics هي مقاييس مجمّعة للاستجابة بأكملها، على مستوى جميع المركبات وخطط المسارات. تحتوي المقاييس على المستوى الأعلى على الخصائص نفسها التي تحتوي عليها المقاييس لكل مسار، مع تجميع القيم على مستوى جميع المسارات.

قد لا تتم تعبئة بعض الخصائص دائمًا استنادًا إلى نتائج التحسين:

  1. skippedShipments[] تسرد الشحنات التي لا تنفّذها أي مركبة. يمكن تخطّي شحنة إذا تعذّر تنفيذها ضمن القيود المحدّدة أو إذا تجاوزت تكلفة تنفيذ الشحنة تكلفة العقوبة. على سبيل المثال، إذا كان وقت استلام شحنة أو تسليمها timeWindow ضيقًا جدًا، قد لا يكون من الممكن أو من الفعال من حيث التكلفة أن تنفّذ مركبة الزيارة خلال النطاق الزمني المطلوب.
  2. 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
    }
  }
}