जवाब को समझने का तरीका

रूट ऑप्टिमाइज़ेशन एपीआई, वाहनों के लिए उनसे जुड़े अनुरोध के मुताबिक रास्तों की जानकारी दिखाता है. शिपमेंट, वाहनों के लिए असाइन किए जाते हैं या अनुरोध की प्रॉपर्टी के आधार पर इसे छोड़ा भी जा सकता है.

किसी OptimizeToursResponse मैसेज (REST, gRPC) में दो मुख्य टॉप-लेवल प्रॉपर्टी होती हैं:

  • हर वाहन के लिए, routes[] रास्ते हैं. इनके लिए शिपिंग की जगह तय की गई है. हर Route में ऐसी मेट्रिक होती हैं जिनमें उस रास्ते की प्रॉपर्टी की जानकारी होती है.
  • metrics सभी वाहनों और रूट प्लान में मिलने वाले पूरे रिस्पॉन्स के लिए एग्रीगेट की गई मेट्रिक हैं. टॉप-लेवल मेट्रिक में वही प्रॉपर्टी होती हैं जो हर रूट की मेट्रिक में होती हैं. साथ ही, सभी रूट की वैल्यू एग्रीगेट की जाती हैं.

ऑप्टिमाइज़ेशन के नतीजों के आधार पर, हो सकता है कि कुछ प्रॉपर्टी हमेशा अपने-आप न भरे जाएं:

  1. skippedShipments[] ऐसे शिपमेंट की सूची बनाता है जिन्हें किसी भी वाहन का इस्तेमाल करके नहीं किया जाता. अगर किसी शिपमेंट को तय की गई सीमाओं में पूरा नहीं किया जा सकता या शिपमेंट का शुल्क, पेनल्टी की लागत से ज़्यादा होता है, तो उसे स्किप किया जा सकता है. उदाहरण के लिए, अगर किसी शिपमेंट के पिक अप या डिलीवरी की कीमत काफ़ी कम है timeWindow तो हो सकता है कि यह मुमकिन न हो या किसी वाहन के लिए, ज़रूरी समय अवधि के दौरान यात्रा करना कम कीमत में हो.
  2. validationErrors[] से पता चलता है कि जब अनुरोध के solvingMode को VALIDATE_ONLY पर सेट किया गया है, तो अनुरोध अमान्य हो जाता है या उसे हल नहीं किया जा सकता. सामान्य DEFAULT_SOLVE मोड में, पुष्टि से जुड़ी गड़बड़ियां जवाब के मुख्य हिस्से के बजाय गड़बड़ी के मैसेज में दिखेंगी. ध्यान दें कि VALIDATE_ONLY समाधान मोड, एक साथ कई गड़बड़ियों की रिपोर्ट कर सकता है. इससे अनुरोधों को तेज़ी से डीबग करने में मदद मिलती है.

रास्ते की जानकारी

हर routes[] एंट्री एक ShipmentRoute मैसेज (REST, gRPC) होती है. हर ShipmentRoute, अनुरोध के हिसाब से किसी वाहन के लिए तय किया गया रास्ता दिखाता है. इससे जुड़ी Vehicle से जुड़ी अहम ShipmentRoute प्रॉपर्टी में ये शामिल हैं:

  • 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, Visit से जुड़े अनुरोध में Shipment.pickups या Shipment.deliveries के VisitRequest का शून्य-आधारित इंडेक्स है. वैल्यू शून्य होने पर, REST रिस्पॉन्स में इस प्रॉपर्टी को छोड़ दिया जाता है.
  • startTime वह समय है जब विज़िट शुरू होने की उम्मीद है.
  • Visit को पूरा करने के लिए मांगी गई रकम लोड करने के लिए, loadDemands मैप लोड टाइप डिलीवरी की कुल रकम, डिलीवरी की संख्या से कम होती है. इससे पता चलता है कि वाहन से लोड होने वाला लोड हटा दिया गया है.

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 को चालू करने से पहले कितनी देर इंतज़ार करता है. ऐसा नीचे दिए गए Visit के start_time की वजह से हो सकता है.
  • ट्रांज़िशन का कुल समय totalDuration है. इसमें यात्रा, इंतज़ार, ब्रेक, और देरी का समय शामिल है.
  • इस ट्रांज़िशन के दौरान, वाहन में होने वाली जानकारी लोड करने के लिए, vehicleLoads मैप लोड टाइप.

Transition का एक उदाहरण ऐसा दिखता है:

{
  "routes": [
    {
      ...
      "transitions": [
        ...
        {
          "travelDuration": "1171s",
          "travelDistanceMeters": 9004,
          "waitDuration": "0s",
          "totalDuration": "1171s",
          "startTime": "2024-02-13T00:00:00Z"
        },
        ...
      ],
      ...
    }
  ],
  ...
}

vists और transitions के बीच संबंध के बारे में पिकअप और डिलीवरी स्टॉप ऑर्डर ऑप्टिमाइज़ेशन के साथ-साथ ShipmentRoute के रेफ़रंस दस्तावेज़ (REST, gRPC) में बताया गया है.

मेट्रिक की प्रॉपर्टी

Metrics मैसेज (REST, gRPC) में पूरे समाधान की खास जानकारी होती है. कुछ अहम Metrics प्रॉपर्टी में ये शामिल हैं:

  • रास्तों को पूरा करने में लगने वाला कुल खर्च totalCost है. लागत मॉडल के पैरामीटर में लागत के बारे में ज़्यादा पढ़ें.
  • समाधान में इस्तेमाल किए गए वाहनों की कुल संख्या usedVehicleCount है. अगर ऑप्टिमाइज़र को लगता है कि वाहनों का इस्तेमाल ज़रूरी नहीं है, तो उनके रास्ते खाली हो सकते हैं.
  • skippedMandatoryShipmentCount, स्किप किए गए उन शिपमेंट की संख्या है जो "ज़रूरी" हैं. ज़रूरी शिपमेंट में, उस penaltyCost के बारे में नहीं बताया जाता है जो शिपमेंट को स्किप करने पर लागू होता है. अगर तय की गई शर्तों के तहत काम करना मुमकिन नहीं है, तो ज़रूरी शिपमेंट को अब भी छोड़ा जा सकता है. लागत मॉडल के पैरामीटर में लागत के बारे में ज़्यादा पढ़ें.

अन्य मेट्रिक को AggregatedMetrics मैसेज (REST, gRPC) के तौर पर रिपोर्ट किया जाता है. AggregatedMetrics मैसेज टाइप का इस्तेमाल Metrics.aggregatedRouteMetrics प्रॉपर्टी के लिए और ShipmentRoute.metrics प्रॉपर्टी Metrics.aggregatedRouteMetrics के लिए किया जाता है. इसमें OptimizeToursResponse में मौजूद सभी ShipmentRoute की मेट्रिक शामिल होती हैं. हर ShipmentRoute.metrics प्रॉपर्टी में, उस ShipmentRoute की मेट्रिक शामिल होती हैं.

AggregatedMetrics की अहम प्रॉपर्टी में ये शामिल हैं:

  • performedShipmentCount वाहनों से किए गए शिपमेंट की संख्या है, जो उनके पूरे रास्ते पर हुई है.
  • travelDuration का मतलब है कि रास्तों को पूरा करने में, वाहनों से लगने वाला कुल समय.
  • waitDuration वह कुल समय है जो वाहन अपने रूट पूरा करने के दौरान इंतज़ार करते हैं.
  • वाहनों से होने वाली देरी के लिए delayDuration का समय दिया गया है. आम तौर पर, अगर अनुरोध में TransitionAttributes का इस्तेमाल नहीं किया जाता है, तो यह शून्य होता है.
  • breakDuration का मतलब है कि रास्तों को पूरा करते समय, ब्रेक के दौरान वाहनों से कितना समय बिताया गया.
  • visitDuration वह कुल समय है जो वाहन अपने रूट पूरे करने के दौरान, वेबसाइट पर आने-जाने में बिताते हैं. यह लागू होने वाले वाहन को असाइन किए गए Visit से जुड़े VisitRequest के लिए सभी VisitRequest.duration वैल्यू का योग है.
  • 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
    }
  }
}