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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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