ट्रांज़िशन एट्रिब्यूट की मदद से, कारोबारी नियमों को मॉडल करना

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

शुरू करने से पहले

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

ट्रांज़िशन, रास्ते का वह सेगमेंट होता है जो एक जगह को दूसरी जगह से जोड़ता है.

जगह का मतलब, वाहन के रास्ते में मौजूद इनमें से कोई भी पॉइंट हो सकता है:

  • रास्ते का शुरुआती पॉइंट.
  • वह स्टॉप जहां से पिकअप या डिलीवरी की जाती है.
  • रास्ते का आखिरी पॉइंट.

मॉडल के लिए सभी ट्रांज़िशन एट्रिब्यूट तय करने के लिए, उन्हें सूची में जोड़ें ShipmentModel.transition_attributes. सूची का हर एलिमेंट, ट्रांज़िशन एट्रिब्यूट का एक सेट तय करता है. इसे ट्रांज़िशन के शुरुआती और आखिरी पॉइंट पर मौजूद टैग का इस्तेमाल करके, रास्तों में मौजूद ट्रांज़िशन से मैच किया जाता है. ट्रांज़िशन एट्रिब्यूट के बारे में ज़्यादा जानने के लिए, रेफ़रंस दस्तावेज़ देखें TransitionAttributes.

असल दुनिया के परिदृश्यों का मॉडल बनाना

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

पार्किंग के लिए समय रिज़र्व करना

इस परिदृश्य में, ड्राइवर को जगह A पर जाने से पहले, वाहन पार्क करना होगा. जगह B आस-पास ही है. इसलिए, ड्राइवर दोनों जगहों पर जाने के लिए, एक ही पार्किंग स्पॉट का इस्तेमाल कर सकता है. अगर ड्राइवर, A पर जाने के तुरंत बाद B पर जाता है, तो उसका समय बचता है. ऐसा इसलिए, क्योंकि उसे पार्किंग स्पॉट से निकलने और वाहन को फिर से पार्क करने की ज़रूरत नहीं होती. Route Optimization API में, ट्रांज़िशन एट्रिब्यूट का इस्तेमाल करके, वाहन पार्क करने के लिए अतिरिक्त समय जोड़ा जा सकता है. हालांकि, यह समय सिर्फ़ तब जोड़ा जाता है, जब ड्राइवर एक पार्किंग स्पॉट से दूसरे पार्किंग स्पॉट पर जाता है.

जब पार्किंग में लगने वाले समय को, विज़िट की अवधि से अलग मॉडल किया जाता है, तो ऐसे रास्ते बनाए जाते हैं जिनमें एक ही पार्किंग का इस्तेमाल करने वाली विज़िट को ग्रुप किया जाता है. इससे, इन रास्तों में कम समय लगता है. इससे मॉडल ज़्यादा सटीक बनता है. साथ ही, ऑप्टिमाइज़र उन रास्तों को प्राथमिकता देता है जिनमें विज़िट को ग्रुप किया जाता है.

Route Optimization API के अनुरोध में, यह काम करने के लिए यहां दिया गया तरीका अपनाएं:

  1. VisitRequest.duration का इस्तेमाल सिर्फ़ विज़िट करने में लगने वाले समय के लिए करें. उदाहरण के लिए, ग्राहक को पैकेज सौंपने और उससे हस्ताक्षर लेने में लगने वाले समय के लिए.

  2. मॉडल में इस्तेमाल किए गए हर अलग-अलग पार्किंग स्पॉट के लिए, एक नया टैग इस्तेमाल करें. यह टैग, मॉडल में किसी और चीज़ के लिए इस्तेमाल नहीं किया जाना चाहिए. उदाहरण के लिए, PARKING_123.

  3. इस टैग को इनमें जोड़ें:

    1. VisitRequest.tags विज़िट के उन सभी अनुरोधों में जिनमें इस पार्किंग स्पॉट का इस्तेमाल किया जाता है.

    2. Vehicle.start_tags अगर वाहन, इस पार्किंग स्पॉट से अपना रास्ता शुरू करता है, तो

    3. Vehicle.end_tags अगर वाहन, इस पार्किंग स्पॉट पर अपना रास्ता खत्म करता है, तो

  4. हर नए पार्किंग टैग के लिए, ShipmentModel.transition_attributes में एक एंट्री जोड़ें. इससे, किसी दूसरे पार्किंग स्पॉट से आने पर, वाहन को पार्क करने में लगने वाले समय के लिए देरी जोड़ी जाती है. इसके लिए, यह तरीका अपनाएं:

    1. TransitionAttributes.excluded_src_tag और TransitionAttributes.dst_tag को PARKING_123 पर सेट करें.

    2. TransitionAttributes.delay को, वाहन पार्क करने में लगने वाले समय पर सेट करें.

    उदाहरण के लिए, जब किसी जगह का टैग PARKING_123 हो और वाहन को पार्क करने में 150 सेकंड लगते हों, तो ShipmentModel.transition_attributes में यह एंट्री जोड़ें:

    {
      "excluded_src_tag": "PARKING_123",
      "dst_tag": "PARKING_123",
      "delay": "150s"
    }
    

रास्ते के आखिर में साफ़-सफ़ाई करना ज़रूरी है

इस परिदृश्य में, रास्ते के आखिर में वाहन की साफ़-सफ़ाई करना ज़रूरी है. इसके लिए, ये अतिरिक्त पाबंदियां लागू की गई हैं:

  • वाहन डिपो पर लौटने से पहले, साफ़-सफ़ाई किसी खास फ़ैसिलिटी में की जाती है. ऑप्टिमाइज़ किए गए रास्ते में, साफ़-सफ़ाई की सबसे अच्छी फ़ैसिलिटी का इस्तेमाल किया जाता है. यह फ़ैसिलिटी, वाहन की जगह और वाहन से किए गए पिकअप और डिलीवरी की जगहों के आधार पर तय की जाती है.
  • साफ़-सफ़ाई के बाद, वाहन से कोई और पिकअप या डिलीवरी नहीं की जानी चाहिए.
  • वहां तक ड्राइव करने और वाहन की साफ़-सफ़ाई करने में लगने वाला समय, ड्राइवर के काम के घंटों में गिना जाता है. साथ ही, यह समय, रास्ते की ज़्यादा से ज़्यादा अवधि के अंदर होना चाहिए.

इस ज़रूरत को मॉडल करने के लिए, सिर्फ़ उन रास्तों की अनुमति दें जो खाली हैं या जिनकी आखिरी विज़िट, साफ़-सफ़ाई की फ़ैसिलिटी पर है. Route Optimization API में, यह काम करने के लिए, रास्ते के आखिरी वेपॉइंट पर ट्रांज़िशन को रोकें. हालांकि, साफ़-सफ़ाई की फ़ैसिलिटी या रास्ते के शुरुआती पॉइंट से ट्रांज़िशन की अनुमति दें:

  1. दो नए टैग चुनें जो मॉडल में कहीं भी इस्तेमाल न किए गए हों. उदाहरण के लिए, CLEANED और ROUTE_END. पहला टैग उन जगहों के लिए है जहां वाहन की साफ़-सफ़ाई की जाती है या की गई है. वहीं, दूसरा टैग रास्ते के आखिर के लिए है.
  2. हर वाहन के लिए, सिर्फ़ डिलीवरी वाला एक नया शिपमेंट जोड़ें. यह शिपमेंट, साफ़-सफ़ाई की फ़ैसिलिटी पर जाने की विज़िट को दिखाता है. इसके लिए, ये एट्रिब्यूट इस्तेमाल करें:
    1. साफ़-सफ़ाई की फ़ैसिलिटी की हर जगह को, इस शिपमेंट के डिलीवरी विज़िट अनुरोध के तौर पर दिखाया जाना चाहिए.
    2. साफ़-सफ़ाई की फ़ैसिलिटी के शिपमेंट के हर विज़िट अनुरोध के VisitRequest.tags में, CLEANED जोड़ें. इससे पता चलता है कि इस जगह से निकलने वाला वाहन साफ़ है. मॉडल में मौजूद विज़िट के अन्य अनुरोधों में इस टैग का इस्तेमाल नहीं किया जाना चाहिए. इससे यह माना जाएगा कि वाहन, इन जगहों से निकलने पर "साफ़ नहीं" है.
    3. ऑप्टिमाइज़र को इस शिपमेंट को छोड़ने की अनुमति दें. ऐसा तब किया जा सकता है, जब वाहन का इस्तेमाल किसी और काम के लिए न किया जा रहा हो . इसके लिए, penalty_cost को कम वैल्यू पर सेट करें.
  3. हर वाहन के लिए, CLEANED को Vehicle.start_tags में जोड़ें. इसका इस्तेमाल, वाहन को किसी भी पिकअप या डिलीवरी से पहले साफ़ दिखाने के लिए किया जाता है. इससे यह माना जाता है कि वाहन की साफ़-सफ़ाई, पिछले कामकाजी दिन के आखिर में की गई थी. साथ ही, वाहन को शुरुआती वेपॉइंट से सीधे आखिरी वेपॉइंट तक जाने की अनुमति दी जाती है. भले ही, असल में ऐसे रास्ते न हों, लेकिन इस परिदृश्य की अनुमति देने से, ऑप्टिमाइज़र को ऑप्टिमाइज़ किए गए रास्तों को ज़्यादा आसानी से खोजने में मदद मिलती है.

  4. हर वाहन के लिए, ROUTE_END को Vehicle.end_tags में जोड़ें.

  5. ShipmentModel.transition_attributes में एक नई एंट्री जोड़ें. इससे, वाहनों को आखिरी वेपॉइंट पर पहुंचने से रोका जाता है, जब वे साफ़ न हों. इसके लिए, ये प्रॉपर्टी इस्तेमाल करें:

    1. TransitionAttributes.excluded_src_tag को CLEANED पर सेट करें.

    2. TransitionAttributes.dst_tag को ROUTE_END पर सेट करें.

    3. TransitionAttributes.delay को बड़ी वैल्यू पर सेट करें. जब देरी को, रास्ते की ज़्यादा से ज़्यादा अवधि से ज़्यादा रखा जाता है, तो ऑप्टिमाइज़र को किसी रास्ते में इस ट्रांज़िशन का इस्तेमाल करने से रोका जा सकता है.

    उदाहरण के लिए, जब मॉडल का टाइम स्केल एक कामकाजी दिन हो, तो 24 घंटे (86,400 सेकंड) की देरी का इस्तेमाल करके, रास्ते के आखिर में ट्रांज़िशन को रोका जा सकता है. हालांकि, साफ़-सफ़ाई की फ़ैसिलिटी और रास्ते की शुरुआत से ट्रांज़िशन की अनुमति दी जा सकती है:

    {
      "excluded_src_tag": "CLEANED",
      "dst_tag": "ROUTE_END",
      "delay": "86400s"
    }
    

देरी और लागतों के बीच कैसे तय करें

देरी और लागतों के बीच तय करना, लागू की गई कारोबार की लॉजिक और पाबंदियों पर निर्भर करता है. TransitionAttributes.delay को सेट करना, सख्त पाबंदियां लागू करने या खर्च किए गए समय के हिसाब से ट्रेड-ऑफ़ दिखाने के लिए सबसे अच्छा है. TransitionAttributes.cost नरम प्राथमिकताएं या अतिरिक्त लागत के तौर पर दिखाए गए ट्रेड-ऑफ़ लागू करने के लिए, बेहतर है. जब खर्च किए गए समय और लागत, दोनों की बात हो, तो देरी और लागतों को अपनी ज़रूरत के हिसाब से जोड़ा जा सकता है.

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

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

ऐसा ट्रांज़िशन एट्रिब्यूट कैसे जोड़ें जो विज़िट के सभी अनुरोधों से मैच करता हो

ऊपर दिए गए उदाहरणों में, ट्रांज़िशन एट्रिब्यूट का इस्तेमाल किया गया है. ये एट्रिब्यूट, उन जगहों से मैच करते हैं जिनमें कोई टैग दिया गया है या उन जगहों से मैच करते हैं जिनमें टैग नहीं दिया गया है. हालांकि, अगर आपको ऐसे ट्रांज़िशन एट्रिब्यूट जोड़ने हैं जो सभी ट्रांज़िशन पर लागू होते हैं, तो क्या करना होगा?

सिर्फ़ टैग को छोड़ा नहीं जा सकता. ऐसा इसलिए, क्योंकि हर TransitionAttributes मैसेज में, TransitionAttributes.src_tag और TransitionAttributes.excluded_src_tag में से कोई एक और TransitionAttributes.dst_tag और TransitionAttributes.excluded_dst_tagमें से कोई एक होना ज़रूरी है.

हालांकि, TransitionAttributes.excluded_src_tag या TransitionAttributes.excluded_dst_tag को ऐसे टैग पर सेट करके, सभी टैग मैच किए जा सकते हैं जो मॉडल में कहीं भी इस्तेमाल नहीं किया गया है. इससे, उन सभी जगहों को मैच किया जाएगा जिनमें यह टैग नहीं है. हालांकि, आपने जान-बूझकर ऐसा टैग चुना है जो किसी भी जगह के लिए इस्तेमाल नहीं किया गया है. इसलिए, ये ट्रांज़िशन एट्रिब्यूट सभी जगहों से मैच करेंगे.

इस बारे में और पढ़ें