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

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

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

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

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

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

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

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

असल दुनिया से जुड़े उदाहरणों को मॉडल करना

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

पार्किंग के लिए समय बुक करना

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

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

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 घंटे (86400 सेकंड) की देरी का इस्तेमाल किया जा सकता है. इससे, रूट के आखिर में ट्रांज़िशन को रोका जा सकता है. हालांकि, ऐसा सिर्फ़ सफ़ाई की सुविधा और रूट की शुरुआत को छोड़कर किया जा सकता है:

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

डिलीवरी में लगने वाले समय और उसके शुल्क के बीच फ़ैसला कैसे करें

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

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

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

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

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

टैग हटाए नहीं जा सकते, क्योंकि हर TransitionAttributes मैसेज में TransitionAttributes.src_tag और TransitionAttributes.excluded_src_tag में से कोई एक टैग होना चाहिए. साथ ही, TransitionAttributes.dst_tag और TransitionAttributes.excluded_dst_tag में से कोई एक टैग होना चाहिए.

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

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