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

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] की विंडो को कुछ घंटों बाद (21:00 से 18: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 कम हो गया
  • पूरे हो चुके कुल शिपमेंट: दो से तीन से बढ़े

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

आखिर में, 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 से कम है. ऑप्टिमाइज़र को पता चला है कि शिपमेंट को स्किप करने के बजाय, उसे जल्दी डिलीवर करना ज़्यादा किफ़ायती है.