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

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

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

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

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

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

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

मॉडल के लिए सभी ट्रांज़िशन एट्रिब्यूट तय किए जाते हैं. इसके लिए, उन्हें 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 का इस्तेमाल तब बेहतर होता है, जब आपको किसी अतिरिक्त लागत के तौर पर, नरम प्राथमिकताओं या ट्रेड-ऑफ़ को लागू करना हो. समय और लागत, दोनों के मामले में देरी और लागत को मनमाने तरीके से जोड़ा जा सकता है.

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

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

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

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

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

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

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