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

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

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 प्रॉपर्टी में ये शामिल हैं:

  • संबंधित अनुरोध मैसेज में मौजूद Vehicle का vehicleIndex इंडेक्स, शून्य पर आधारित है. वैल्यू शून्य होने पर, 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, Shipment.pickups या Shipment.deliveries से जुड़े उस अनुरोध के VisitRequest का शून्य-आधारित इंडेक्स है जिसे Visit दिखाता है. वैल्यू शून्य होने पर, 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
    }
  }
}