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

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

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

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

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

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

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

मॉडल के लिए सभी ट्रांज़िशन एट्रिब्यूट तय करने के लिए, उन्हें 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 को ऐसे टैग पर सेट करके सभी टैग मैच किए जा सकते हैं जिसका इस्तेमाल मॉडल में कहीं भी नहीं किया गया है. इससे उन सभी जगहों को मैच किया जाएगा जिनमें यह टैग नहीं है. हालांकि, आपने जान-बूझकर ऐसा टैग चुना है जिसका इस्तेमाल किसी भी जगह के लिए नहीं किया जाता. इसलिए, ये ट्रांज़िशन एट्रिब्यूट सभी जगहों से मैच करेंगे.

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