मांग और सीमाएं लोड करें

यूरोपियन इकनॉमिक एरिया (ईईए) के डेवलपर

इस गाइड में loadDemands और loadLimits के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि ये दोनों एक-दूसरे से कैसे जुड़े हैं.

पिकअप और डिलीवरी के समय की विंडो से जुड़ी पाबंदियां में बताए गए तरीके के मुताबिक, OptimizeToursRequest मैसेज (REST, gRPC) में कई ऐसी प्रॉपर्टी होती हैं जो ऑप्टिमाइज़ की जा रही समस्या पर पाबंदियां तय करती हैं. कई OptimizeToursRequest प्रॉपर्टी, लोड की सीमाओं को दिखाती हैं.

वाहनों और शिपमेंट की कुछ ऐसी प्रॉपर्टी होती हैं जिन्हें रास्ते का प्लान बनाते समय ध्यान में रखना ज़रूरी होता है.

  • वाहन: loadLimits प्रॉपर्टी से पता चलता है कि वाहन ज़्यादा से ज़्यादा कितना लोड ले जा सकता है. Vehicle मैसेज (REST, gRPC) से जुड़े दस्तावेज़ देखें.
  • शिपमेंट: loadDemands प्रॉपर्टी से पता चलता है कि किसी शिपमेंट में कितना लोड है. Shipment मैसेज (REST, gRPC) से जुड़े दस्तावेज़ देखें.

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

इस दस्तावेज़ के बाकी हिस्से में, loadLimits और loadDemands के बारे में विस्तार से बताया गया है.

लोड की मांग और सीमाएं: टाइप

लोड की हर मांग और सीमा की शर्त को type के हिसाब से तय किया जाता है.

आपके पास लोड टाइप का अपना सेट देने का विकल्प होता है. जैसे, यहां दिए गए उदाहरण:

  • वज़न का डेटा
  • आवाज़
  • लीनियर मेज़रमेंट
  • परिवहन किए जा रहे सामान या उपकरण के नाम

इस गाइड में, weightKg को उदाहरण के तौर पर इस्तेमाल किया गया है.

Shipment.loadDemands और Vehicle.loadLimits, दोनों प्रोटोकॉल बफ़र map टाइप का इस्तेमाल करते हैं. इनमें string कुंजियां होती हैं, जो लोड के टाइप को दिखाती हैं.

Shipment.loadDemands वैल्यू, Load मैसेज (REST, gRPC) का इस्तेमाल करती हैं. Load मैसेज में एक amount प्रॉपर्टी होती है. इससे पता चलता है कि तय किए गए टाइप में शिपमेंट पूरा करने के लिए कितनी क्षमता की ज़रूरत है.

Vehicle.loadLimits वैल्यू, LoadLimit मैसेज (REST, gRPC) का इस्तेमाल करती हैं. LoadLimit मैसेज में कई प्रॉपर्टी होती हैं. इनमें से maxLoad, तय किए गए टाइप के हिसाब से वाहन की ज़्यादा से ज़्यादा लोड क्षमता को दिखाता है.

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

"loadDemands": {
  "weightKg": {
    "amount": 50
  }
}

शिपमेंट पूरा करने के लिए, weightKg टाइप में 50 लोड यूनिट की ज़रूरत होती है. loadLimits वाला वाहन:

"loadLimits": {
  "weightKg": {
    "maxLoad": 100
  }
}

ऐसा हो सकता है कि वाहन से सामान की शिपिंग पूरी की जा सके. ऐसा इसलिए, क्योंकि weightKg टाइप के वाहन की maxLoad, weightKg टाइप के सामान की loadDemands से ज़्यादा या इसके बराबर है. हालांकि, loadLimits वाले वाहन के लिए:

"loadLimits": {
  "equipmentRackStorage": {
    "maxLoad": 10
  }
}

weightKg की लोड लिमिट न होने की वजह से, इसमें अनलिमिटेड weightKg क्षमता होती है. इसलिए, वाहन पर शिपमेंट के वज़न का कोई असर नहीं पड़ता.

शिपमेंट और वाहनों के बीच लोड ट्रांसफ़र करना

शिपमेंट को वाहनों से पिक अप और डिलीवर किया जाता है. इसलिए, शिपमेंट का loadDemand, शिपमेंट और वाहन के बीच ट्रांसफ़र होता है. किसी वाहन के लिए, OptimizeToursResponse मैसेज (REST, gRPC)routes.transitions एंट्री में वाहन के लोड देखे जा सकते हैं. क्रम इस तरह है:

  1. शिपमेंट के लिए ज़रूरी लोड क्षमता को loadDemand के तौर पर तय किया जाता है.
  2. शिपमेंट को असाइन किया गया वाहन उसे पिक अप करता है. इसके बाद, वाहन का vehicleLoads, शिपमेंट के loadDemand के हिसाब से बढ़ जाता है. इस ट्रांसफ़र को जवाब के मैसेज में positive visits.loadDemands के तौर पर दिखाया जाता है.
  3. वाहन, शिपमेंट डिलीवर करता है. इसके बाद, वाहन के vehicleLoads में डिलीवर किए गए शिपमेंट के loadDemand के बराबर कमी आ जाती है. इस ट्रांसफ़र को जवाब के मैसेज में नेगेटिव visits.loadDemands के तौर पर दिखाया जाता है.

किसी वाहन का vehicleLoads, उसके रास्ते में किसी भी जगह पर तय किए गए loadLimits से ज़्यादा नहीं होना चाहिए.

लोड करने की मांगों और सीमाओं के साथ पूरा उदाहरण

लोड करने की मांगों और सीमाओं के साथ अनुरोध का उदाहरण देखें

{
  "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"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0,
        "loadDemands": {
          "weightKg": {
            "amount": 50
          }
        }
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 15.0,
        "loadDemands": {
          "weightKg": {
            "amount": 10
          }
        }
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0,
        "loadDemands": {
          "weightKg": {
            "amount": 80
          }
        }
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0,
        "loadLimits": {
          "weightKg": {
            "maxLoad": 100
          }
        }
      }
    ]
  }
}
    

अनुरोध के इस उदाहरण में, लोड से जुड़े कई पैरामीटर शामिल हैं:

  • shipments[0] में 50 weightKg लोड करने की मांग है.
  • shipments[1] को 10 weightKg की लोड डिमांड है.
  • shipments[2] में 80 weightKg लोड करने की मांग है.
  • vehicles[0] में 100 weightKg लोड करने की सीमा है.

लोड की मांगों और सीमाओं के साथ अनुरोध का जवाब देखना

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T16:00:00Z",
      "vehicleEndTime": "2023-01-13T16:43:27Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-13T16:00:00Z",
          "detour": "0s",
          "loadDemands": {
            "weightKg": {
              "amount": "50"
            }
          }
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2023-01-13T16:02:30Z",
          "detour": "150s",
          "loadDemands": {
            "weightKg": {
              "amount": "10"
            }
          }
        },
        {
          "startTime": "2023-01-13T16:08:55Z",
          "detour": "150s",
          "loadDemands": {
            "weightKg": {
              "amount": "-50"
            }
          }
        },
        {
          "shipmentIndex": 1,
          "startTime": "2023-01-13T16:16:37Z",
          "detour": "343s",
          "loadDemands": {
            "weightKg": {
              "amount": "-10"
            }
          }
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-13T16:27:07Z",
          "detour": "1627s",
          "loadDemands": {
            "weightKg": {
              "amount": "80"
            }
          }
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T16:36:26Z",
          "detour": "0s",
          "loadDemands": {
            "weightKg": {
              "amount": "-80"
            }
          }
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T16:00:00Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T16:02:30Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "50"
            }
          }
        },
        {
          "travelDuration": "235s",
          "travelDistanceMeters": 795,
          "waitDuration": "0s",
          "totalDuration": "235s",
          "startTime": "2023-01-13T16:05:00Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "60"
            }
          }
        },
        {
          "travelDuration": "212s",
          "travelDistanceMeters": 791,
          "waitDuration": "0s",
          "totalDuration": "212s",
          "startTime": "2023-01-13T16:13:05Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "10"
            }
          }
        },
        {
          "travelDuration": "380s",
          "travelDistanceMeters": 1190,
          "waitDuration": "0s",
          "totalDuration": "380s",
          "startTime": "2023-01-13T16:20:47Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        },
        {
          "travelDuration": "409s",
          "travelDistanceMeters": 1371,
          "waitDuration": "0s",
          "totalDuration": "409s",
          "startTime": "2023-01-13T16:29:37Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "80"
            }
          }
        },
        {
          "travelDuration": "171s",
          "travelDistanceMeters": 665,
          "waitDuration": "0s",
          "totalDuration": "171s",
          "startTime": "2023-01-13T16:40:36Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        }
      ],
      "metrics": {
        "performedShipmentCount": 3,
        "travelDuration": "1407s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "1200s",
        "totalDuration": "2607s",
        "travelDistanceMeters": 4812,
        "maxLoads": {
          "weightKg": {
            "amount": "80"
          }
        }
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 48.12,
        "model.vehicles.cost_per_hour": 28.966666666666665
      },
      "routeTotalCost": 77.086666666666659
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 3,
      "travelDuration": "1407s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "1200s",
      "totalDuration": "2607s",
      "travelDistanceMeters": 4812,
      "maxLoads": {
        "weightKg": {
          "amount": "80"
        }
      }
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-13T16:00:00Z",
    "latestVehicleEndTime": "2023-01-13T16:43:27Z",
    "totalCost": 77.086666666666659,
    "costs": {
      "model.vehicles.cost_per_hour": 28.966666666666665,
      "model.vehicles.cost_per_kilometer": 48.12
    }
  }
}
    

वज़न की सीमाएं जोड़ने से, visits के क्रम पर असर पड़ता है:

  1. shipment[0] को पिक अप कर लिया गया है
  2. shipment[1] को पिक अप कर लिया गया है
  3. shipment[0] डिलीवर कर दिया गया है
  4. shipment[1] डिलीवर कर दिया गया है
  5. shipment[2] को पिक अप कर लिया गया है
  6. shipment[2] डिलीवर कर दिया गया है

इस ऑर्डर से पता चलता है कि वाहन एक साथ तीन शिपमेंट नहीं कर सकता, क्योंकि उनका कुल loadDemands, वाहन के loadLimits से ज़्यादा है.

हर visits एंट्री में, Visit पूरा होने के बाद वाहन के लोड में हुए बदलाव की जानकारी शामिल होती है. पॉज़िटिव लोड वैल्यू से शिपमेंट लोड होने का पता चलता है. वहीं, नेगेटिव वैल्यू से शिपमेंट अनलोड होने का पता चलता है.

हर transitions एंट्री में, Transition के दौरान वाहन पर मौजूद कुल लोड की जानकारी शामिल होती है. उदाहरण के लिए, transitions[2] का लोड 60 है. यह shipment[0] और shipment[1] के कुल लोड को दिखाता है.weightKg

मेट्रिक ऑब्जेक्ट routes[0].metrics और metrics.aggregatedRouteMetrics में maxLoads प्रॉपर्टी शामिल होती है. टाइप weightKg की वैल्यू 80 है. इससे पता चलता है कि वाहन के रूट का वह हिस्सा जहां shipments[2] को डिलीवरी की जगह पर ले जाया गया.

सॉफ़्ट लोड की सीमा से जुड़ी शर्तें

पिकअप और डिलीवरी के समय की विंडो से जुड़ी पाबंदियों में बताई गई समय की विंडो की तरह ही, लोड की सीमा से जुड़ी पाबंदियों के भी हार्ड और सॉफ्ट वैरिएंट होते हैं. LoadLimit मैसेज की maxLoad प्रॉपर्टी, एक ज़रूरी शर्त के बारे में बताती है: वाहन को कभी भी तय किए गए maxLoad वैल्यू से ज़्यादा लोड नहीं ले जाना चाहिए. softMaxLoad और costPerUnitAboveSoftMax प्रॉपर्टी, एक सामान्य शर्त को दिखाती हैं. softMaxLoad से ज़्यादा हर यूनिट के लिए, costPerUnitAboveSoftMax लागत लगती है.

सॉफ़्ट लोड की सीमा से जुड़ी पाबंदियों का इस्तेमाल कई कामों के लिए किया जा सकता है. जैसे:

  • शिपमेंट को ज़रूरी संख्या से ज़्यादा वाहनों में बांटना जब ऐसा करना किफ़ायती हो
  • ड्राइवर की पसंद के मुताबिक, किसी रास्ते पर पिकअप और डिलीवरी किए जा सकने वाले आइटम की संख्या
  • वाहनों को उनकी क्षमता से कम लोड करना, ताकि वे कम घिसें और रखरखाव की लागत कम हो

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