पिकअप और डिलीवरी में लगने वाले समय की सीमाएं

OptimizeToursRequest इन पर पाबंदियां लागू करता है:

  • शिपमेंट, जो शिपमेंट के काम करने के तरीके पर असर डालते हैं
  • वाहन, जिनसे वाहन के रास्तों का हिसाब लगाने के तरीके पर असर पड़ता है
  • इसका असर दुनिया भर में वाहनों और शिपमेंट, दोनों पर पड़ रहा है.

इस गाइड में शिपिंग से जुड़ी एक ज़रूरी समस्या पर फ़ोकस किया गया है: टाइम विंडो.

टाइम विंडो एक तरह की पाबंदी होती है. शिपमेंट गतिविधियों के लिए, समय के हिसाब से सीमाएं तय करने के लिए, OptimizeToursRequest मैसेज (REST, gRPC) में टाइम विंडो की जानकारी दी जाती है. इस तरह की पाबंदी से, शिपमेंट के लिए वाहन के असाइनमेंट के साथ-साथ, शिपमेंट कब और कैसे किया जा सकता है, इस पर भी असर पड़ता है. इन पाबंदियों के साथ, ऑप्टिमाइज़र उन वाहनों को प्राथमिकता देता है जो शिपमेंट के समय की पाबंदी को सबसे अच्छी तरह पूरा कर सकते हैं.

शिपमेंट से जुड़ी पाबंदियां: टाइम विंडो

Shipment.VisitRequest मैसेज में, पिकअप या डिलीवरी के समय की जानकारी इस तरह दी जा सकती है:

  • मैसेज में timeWindows प्रॉपर्टी का इस्तेमाल करें (REST, gRPC)
  • TimeWindow मैसेज (REST, gRPC) में, शुरू और खत्म होने का समय बताएं.

समयसीमा की पाबंदियों के साथ अनुरोध का उदाहरण

यहां दिए गए उदाहरण में तीन अलग-अलग शिपमेंट के बारे में बताया गया है. हर शिपमेंट की डिलीवरी अलग-अलग है. इसे आसानी से समझने के लिए, इस उदाहरण में सिर्फ़ deliveries के लिए टाइम विंडो सेट की गई हैं. हालांकि, पिकअप के लिए भी टाइम विंडो लागू की जा सकती हैं. एक से ज़्यादा टाइम विंडो तय की जा सकती हैं. हालांकि, इस उदाहरण में हर डिलीवरी VisitRequest के लिए सिर्फ़ एक का इस्तेमाल किया गया है.

समयसीमा के साथ अनुरोध का उदाहरण देखें

{
  "populatePolylines": false,
  "populateTransitionPolylines": false,
  "model": {
    "globalStartTime": "2023-01-13T16:00:00Z",
    "globalEndTime": "2023-01-14T16:00:00Z",
    "shipments": [
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789456,
              "longitude": -122.390192
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T18:00:00Z",
                "endTime": "2023-01-13T19:00:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T18:00:00Z",
                "endTime": "2023-01-13T18:30:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 20.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:30:00Z",
                "endTime": "2023-01-13T18:00:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0
      }
    ]
  }
}
    

टाइम विंडो कंस्ट्रेंट के साथ रिस्पॉन्स का उदाहरण

उदाहरण के तौर पर दिए गए रिस्पॉन्स में, गाड़ी के शुरू और खत्म होने का समय 17:35:50 और 18:17:24 है. इन समय से पता चलता है कि ऑप्टिमाइज़र, अनुरोध में बताए गए वाहन को चलाने के लिए ज़रूरी समय को कम कर रहा है. यह समय, समयसीमा की सभी शर्तों को पूरा करते हुए costPerHour के तौर पर तय किया गया है. स्टार्ट टाइम के तौर पर 17:35:50 का इस्तेमाल करने से, वाहन को विज़िट की जगह पर तब तक इंतज़ार नहीं करना पड़ेगा, जब तक कि विज़िट की टाइम विंडो शुरू नहीं हो जाती. यह जवाब में शून्य waitDuration वैल्यू के तौर पर दिखता है.

समयसीमा के साथ, उदाहरण के तौर पर दिए गए अनुरोध का जवाब देखना

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T17:35:50Z",
      "vehicleEndTime": "2023-01-13T18:17:24Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-13T17:35:50Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2023-01-13T17:38:20Z",
          "detour": "150s"
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-13T17:40:50Z",
          "detour": "300s"
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T17:50:09Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 1,
          "startTime": "2023-01-13T18:00:00Z",
          "detour": "796s"
        },
        {
          "startTime": "2023-01-13T18:07:35Z",
          "detour": "1520s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:35:50Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:38:20Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:40:50Z"
        },
        {
          "travelDuration": "409s",
          "travelDistanceMeters": 1371,
          "waitDuration": "0s",
          "totalDuration": "409s",
          "startTime": "2023-01-13T17:43:20Z"
        },
        {
          "travelDuration": "341s",
          "travelDistanceMeters": 1312,
          "waitDuration": "0s",
          "totalDuration": "341s",
          "startTime": "2023-01-13T17:54:19Z"
        },
        {
          "travelDuration": "205s",
          "travelDistanceMeters": 636,
          "waitDuration": "0s",
          "totalDuration": "205s",
          "startTime": "2023-01-13T18:04:10Z"
        },
        {
          "travelDuration": "339s",
          "travelDistanceMeters": 1276,
          "waitDuration": "0s",
          "totalDuration": "339s",
          "startTime": "2023-01-13T18:11:45Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 3,
        "travelDuration": "1294s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "1200s",
        "totalDuration": "2494s",
        "travelDistanceMeters": 4595
      },
      "routeCosts": {
        "model.vehicles.cost_per_hour": 27.711111111111112,
        "model.vehicles.cost_per_kilometer": 45.95
      },
      "routeTotalCost": 73.661111111111111
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 3,
      "travelDuration": "1294s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "1200s",
      "totalDuration": "2494s",
      "travelDistanceMeters": 4595
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-13T17:35:50Z",
    "latestVehicleEndTime": "2023-01-13T18:17:24Z",
    "totalCost": 73.661111111111111,
    "costs": {
      "model.vehicles.cost_per_hour": 27.711111111111112,
      "model.vehicles.cost_per_kilometer": 45.95
    }
  }
}
    

वाहन की visits को समयसीमा के हिसाब से क्रम में लगाया गया है, ताकि सबसे कम समयसीमा वाले शिपमेंट पहले डिलीवर किए जा सकें.

  1. shipments[2] को 17:50 बजे डिलीवर किया गया
  2. shipments[1] को 18:00 बजे डिलीवर किया गया
  3. shipments[0] को 18:07 बजे डिलीवर किया गया

उदाहरण के अनुरोध में टाइम विंडो की हार्ड कंस्ट्रेंट के बारे में बताया गया है, जिसमें डिलीवरी को उन विंडो में पूरा करना ज़रूरी है. अगर शिपमेंट के किसी भी समयावधि में VisitRequests को पूरा करना संभव नहीं है या यह लागत-असरदार नहीं है, तो ऑप्टिमाइज़र उस शिपमेंट को छोड़ देता है. अगर शिपमेंट में penaltyCost है, तो ऑप्टिमाइज़र इसे रिस्पॉन्स में बताई गई लागतों में जोड़ता हैmetrics. अगर ऐसा नहीं किया जाता है, तो OptimizeToursResponse मैसेज (REST, gRPC) की skippedMandatoryShipmentCount प्रॉपर्टी बढ़ जाती है.

अगर shipment[1] की विंडो को कई घंटे बाद (18:00 से 21:00 पर) शिफ़्ट करके, टाइम विंडो बदली जाती हैं, तो नतीजे अलग-अलग होंगे. इन नतीजों के बारे में यहां दिए गए उदाहरणों में बताया गया है.

समयसीमा के ऐसे अनुरोध का उदाहरण देखें जिसे पूरा नहीं किया जा सकता

{
  "populatePolylines": false,
  "populateTransitionPolylines": false,
  "model": {
    "globalStartTime": "2023-01-13T16:00:00Z",
    "globalEndTime": "2023-01-14T16:00:00Z",
    "shipments": [
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789456,
              "longitude": -122.390192
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T18:00:00Z",
                "endTime": "2023-01-13T19:00:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T21:00:00Z",
                "endTime": "2023-01-13T21:30:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 20.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:30:00Z",
                "endTime": "2023-01-13T18:00:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0
      }
    ]
  }
}
    

समयसीमा के साथ, दूसरे उदाहरण के अनुरोध का जवाब देखें, जहां शिपमेंट को छोड़ा गया है

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T17:37:49Z",
      "vehicleEndTime": "2023-01-13T18:09:49Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-13T17:37:49Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-13T17:40:19Z",
          "detour": "150s"
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T17:49:38Z",
          "detour": "0s"
        },
        {
          "startTime": "2023-01-13T18:00:00Z",
          "detour": "946s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:37:49Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:40:19Z"
        },
        {
          "travelDuration": "409s",
          "travelDistanceMeters": 1371,
          "waitDuration": "0s",
          "totalDuration": "409s",
          "startTime": "2023-01-13T17:42:49Z"
        },
        {
          "travelDuration": "372s",
          "travelDistanceMeters": 1348,
          "waitDuration": "0s",
          "totalDuration": "372s",
          "startTime": "2023-01-13T17:53:48Z"
        },
        {
          "travelDuration": "339s",
          "travelDistanceMeters": 1276,
          "waitDuration": "0s",
          "totalDuration": "339s",
          "startTime": "2023-01-13T18:04:10Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 2,
        "travelDuration": "1120s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "800s",
        "totalDuration": "1920s",
        "travelDistanceMeters": 3995
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 39.95,
        "model.vehicles.cost_per_hour": 21.333333333333332
      },
      "routeTotalCost": 61.283333333333331
    }
  ],
  "skippedShipments": [
    {
      "index": 1
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 2,
      "travelDuration": "1120s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "800s",
      "totalDuration": "1920s",
      "travelDistanceMeters": 3995
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-13T17:37:49Z",
    "latestVehicleEndTime": "2023-01-13T18:09:49Z",
    "totalCost": 81.283333333333331,
    "costs": {
      "model.shipments.penalty_cost": 20,
      "model.vehicles.cost_per_hour": 21.333333333333332,
      "model.vehicles.cost_per_kilometer": 39.95
    }
  }
}
    

इस उदाहरण में, शिपमेंट की डिलीवरी के लिए तय की गई समयसीमा खत्म होने के बाद, shipment[1] को छोड़ दिया गया है. ऐसा इसलिए हुआ, क्योंकि तय की गई समयसीमा के अंदर शिपमेंट की डिलीवरी पूरी करने के लिए, वाहन को चलाने में लगने वाला अतिरिक्त समय, शिपमेंट के लिए तय की गई जुर्माना की रकम से ज़्यादा हो गया था. shipment[1] के लिए जुर्माना metrics.costs में दिखता है और उसका इंडेक्स skippedShipments में दिखता है.

सॉफ़्ट टाइम विंडो कंस्ट्रेंट

लागत मॉडल के पैरामीटर में, समयसीमाओं को सॉफ्ट पाबंदियों के तौर पर लागू करने के बारे में बताया गया है. सॉफ्ट कंस्ट्रेंट और हार्ड कंस्ट्रेंट में ये अंतर होते हैं:

  • कठिन शर्तें: इसका उल्लंघन नहीं किया जा सकता और ऑप्टिमाइज़र, कंस्ट्रेंट का उल्लंघन करने वाला समाधान नहीं देता, चाहे शिपिंग को स्किप करना ही क्यों न हो.
  • सॉफ़्ट कंस्ट्रेंट: इनका उल्लंघन हो सकता है. इसका मतलब है कि ऑप्टिमाइज़र ऐसा समाधान दे सकता है जो सॉफ़्ट कंस्ट्रेंट का उल्लंघन करता हो. हालांकि, ऑप्टिमाइज़र किसी भी उल्लंघन पर लागत भी लागू करता है. इस लागत को समयसीमा में एक अतिरिक्त प्रॉपर्टी के तौर पर दिया जाता है. आम तौर पर, यह लागत उस समयसीमा से पहले या बाद के हर घंटे के लिए, हर घंटे की लागत के तौर पर दी जाती है जिसमें गतिविधि होती है.

startTime या endTime के बजाय softStartTime या softEndTime का इस्तेमाल करके और costPerHourBeforeSoftStartTime या costPerHourAfterSoftEndTime को सेट करके, टाइम विंडो को छोटा किया जा सकता है.

जब पिकअप या डिलीवरी किसी तय समयसीमा के अंदर होनी चाहिए, लेकिन उस समयसीमा के अंदर पिकअप या डिलीवरी करना ज़रूरी नहीं है, तो समयसीमा की सॉफ्ट पाबंदियों का इस्तेमाल करें. कारोबार के लक्ष्यों को बताने के लिए, समयसीमा की सख्त और नरम पाबंदियों का एक साथ इस्तेमाल किया जा सकता है. उदाहरण के लिए:

  • मुश्किल समय की विंडो: इससे ग्राहक के कारोबार के खुले होने के समय के बारे में पता चलता है, जैसे कि सुबह 9 बजे से शाम 5 बजे तक.
  • सॉफ़्ट टाइम विंडो: इससे डिलीवरी या पिकअप की उस समयसीमा का पता चलता है जो ग्राहक को भेजी गई सूचना से मेल खाता है. जैसे, सुबह 9 बजे से दोपहर 1 बजे तक.

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

हार्ड और सॉफ़्ट टाइम विंडो के साथ उदाहरण के तौर पर एक अनुरोध देखें

{
  "populatePolylines": false,
  "populateTransitionPolylines": false,
  "model": {
    "globalStartTime": "2023-01-13T16:00:00Z",
    "globalEndTime": "2023-01-14T16:00:00Z",
    "shipments": [
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789456,
              "longitude": -122.390192
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T18:00:00Z",
                "softEndTime": "2023-01-13T19:00:00Z",
                "costPerHourAfterSoftEndTime": 2.0
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s",
            "timeWindows": [
              {
                "softStartTime": "2023-01-13T21:00:00Z",
                "endTime": "2023-01-13T21:30:00Z",
                "costPerHourBeforeSoftStartTime": 2.0
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 20.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:30:00Z",
                "softEndTime": "2023-01-13T18:00:00Z",
                "costPerHourAfterSoftEndTime": 2.0
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0
      }
    ]
  }
}
    

हार्ड और स्मूद टाइम विंडो के साथ, उदाहरण के तौर पर दिए गए अनुरोध का जवाब देखना

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T17:48:35Z",
      "vehicleEndTime": "2023-01-13T18:24:28Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-13T17:48:35Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2023-01-13T17:51:05Z",
          "detour": "150s"
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-13T17:53:35Z",
          "detour": "300s"
        },
        {
          "startTime": "2023-01-13T18:00:00Z",
          "detour": "300s"
        },
        {
          "shipmentIndex": 1,
          "startTime": "2023-01-13T18:07:42Z",
          "detour": "493s"
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T18:17:27Z",
          "detour": "873s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:48:35Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:51:05Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:53:35Z"
        },
        {
          "travelDuration": "235s",
          "travelDistanceMeters": 795,
          "waitDuration": "0s",
          "totalDuration": "235s",
          "startTime": "2023-01-13T17:56:05Z"
        },
        {
          "travelDuration": "212s",
          "travelDistanceMeters": 791,
          "waitDuration": "0s",
          "totalDuration": "212s",
          "startTime": "2023-01-13T18:04:10Z"
        },
        {
          "travelDuration": "335s",
          "travelDistanceMeters": 1204,
          "waitDuration": "0s",
          "totalDuration": "335s",
          "startTime": "2023-01-13T18:11:52Z"
        },
        {
          "travelDuration": "171s",
          "travelDistanceMeters": 665,
          "waitDuration": "0s",
          "totalDuration": "171s",
          "startTime": "2023-01-13T18:21:37Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 3,
        "travelDuration": "953s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "1200s",
        "totalDuration": "2153s",
        "travelDistanceMeters": 3455
      },
      "routeCosts": {
        "model.shipments.deliveries.time_windows.cost_per_hour_after_soft_end_time": 0.58166666666666667,
        "model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time": 5.7433333333333332,
        "model.vehicles.cost_per_hour": 23.922222222222221,
        "model.vehicles.cost_per_kilometer": 34.55
      },
      "routeTotalCost": 64.797222222222217
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 3,
      "travelDuration": "953s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "1200s",
      "totalDuration": "2153s",
      "travelDistanceMeters": 3455
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-13T17:48:35Z",
    "latestVehicleEndTime": "2023-01-13T18:24:28Z",
    "totalCost": 64.797222222222217,
    "costs": {
      "model.vehicles.cost_per_kilometer": 34.55,
      "model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time": 5.7433333333333332,
      "model.shipments.deliveries.time_windows.cost_per_hour_after_soft_end_time": 0.58166666666666667,
      "model.vehicles.cost_per_hour": 23.922222222222221
    }
  }
}
    

सिर्फ़ समयसीमा की सख्त शर्तों वाले उदाहरण को पूरी तरह से छोड़ दिया गया हैshipment[1]. डिलीवरी के लिए चुने गए समय की विंडो को कम करने पर, वह समयसीमा शुरू होने के पहले डिलीवर हो जाती है. इसी तरह, अन्य शिपमेंट के खत्म होने के समय में रियायत देने से, shipment[2] को समयसीमा खत्म होने के बाद डिलीवर किया जा सकता है.

साथ ही, शिपिंग के लिए खरीदार से लिए जाने वाले शुल्क और शिप किए गए प्रॉडक्ट की संख्या, दोनों में बदलाव हुआ है:

  • totalCost: 81.283 से घटकर 64.797 हो गया
  • पूरे हो चुके शिपमेंट की कुल संख्या: 2 से बढ़कर 3 हो गई

ऑप्टिमाइज़र को कम खर्च वाला समाधान मिला है, क्योंकि पिछले उदाहरण की तुलना में समयसीमा की पाबंदियों को कम किया गया था.

आखिर में, metrics.costs प्रॉपर्टी में एक नई कुंजी भी शामिल की गई है. इससे, प्रॉडक्ट की समस्या और डिलीवरी विंडो में हुई देरी के आधार पर, असल लागत का पता चलता है. यानी:

  • 2.0 में से costPerHourBeforeSoftStartTime और
  • डिलीवरी के असल समय और समयसीमा के शुरू होने के बीच का समय: 2.83583 घंटे

नतीजा:

model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time: 5.6716666666666669.

इन मेट्रिक की मदद से, लागत का विश्लेषण करके, सख्त और नरम पाबंदियों के बीच के फ़ायदे और नुकसान का पता लगाया जा सकता है. इनका इस्तेमाल, अपने कारोबार के नियमों के हिसाब से पाबंदियों को बेहतर बनाने के लिए किया जा सकता है. इस मामले में, कुल लागत 20.0 shipment[1].penalty_cost से कम है. ऑप्टिमाइज़र ने यह पता लगाया है कि शिपमेंट को जल्दी डिलीवर करना, शिपमेंट को छोड़ने के मुकाबले ज़्यादा किफ़ायती है.