डाइमेंशन

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

इस सेक्शन में, डाइमेंशन तय करने और उनके इस्तेमाल का तरीका बताया गया है.

डाइमेंशन के उदाहरण

यहां पिछले सेक्शन के डाइमेंशन के कुछ उदाहरण दिए गए हैं.

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

  • CVRP का उदाहरण, मांग (उदाहरण के लिए, वज़न या पैकेज के पिक अप का वॉल्यूम) के लिए डाइमेंशन बनाता है, जो ट्रैक को ट्रैक पर इकट्ठा किए गए कुल लोड को ट्रैक करता है. सॉल्वर इस कंस्ट्रेंट को लागू करने के लिए, डाइमेंशन का इस्तेमाल करता है कि किसी वाहन का लोड, क्षमता से ज़्यादा न हो.

नीचे दिए गए उदाहरणों में, AddDimension तरीका का इस्तेमाल करके, VRPTW डाइमेंशन की जानकारी दी गई है.

Python

routing.AddDimension(
    callback_index,
    slack_max,
    capacity,
    fix_start_cumul_to_zero,
    dimension_name)

C++

routing.AddDimension(
    callback_index,
    slack_max,
    capacity,
    fix_start_cumul_to_zero,
    dimension_name)

Java

routing.addDimension(
    callbackIndex,
    slackMax,
    capacity,
    fixStartCumulToZero,
    dimensionName)

C#

routing.AddDimension(
    callbackIndex,
    slackMax,
    capacity,
    fixStartCumulToZero,
    dimensionName)

AddDimension तरीके में ये इनपुट होते हैं:

  • callback_index: कॉलबैक का इंडेक्स, जो संख्या लौटाता है. इंडेक्स, जो कॉलबैक के लिए सॉल्वर का अंदरूनी रेफ़रंस है, RegisterTransitCallback या RegisterUnitaryTransitCallback जैसे तरीकों से बनाया जाता है.
  • slack_max स्लैक के लिए ज़्यादा से ज़्यादा मान, जो एक वैरिएबल होता है. इसका इस्तेमाल जगहों पर इंतज़ार के समय को दिखाने के लिए किया जाता है. ज़्यादा जानकारी के लिए, नीचे दिए गए स्लैक वैरिएबल देखें. अगर समस्या में इंतज़ार का समय शामिल नहीं है, तो आम तौर पर slack_max को 0 पर सेट किया जाता है.
  • capacity: हर रूट के लिए इकट्ठा किए गए कुल कन्वर्ज़न की ज़्यादा से ज़्यादा संख्या. CVRP में इस तरह की शर्तें बनाने के लिए, capacity का इस्तेमाल करें. अगर आपकी समस्या में ऐसी कोई समस्या नहीं है, तो आप capacity की वैल्यू सेट करें. इसकी मदद से, रास्तों पर कोई पाबंदी नहीं लगाई जा सकती. जैसे, मैट्रिक्स को परिभाषित करने के लिए इस्तेमाल की गई मैट्रिक्स या अरे की कुल वैल्यू.
  • fix_start_cumulative_to_zero: बूलियन वैल्यू. अगर सही है, तो संख्या का कुल मान 0 से शुरू होता है. ज़्यादातर मामलों में, इसे True पर सेट किया जाना चाहिए. हालांकि, VRPTW या रिसॉर्स की पाबंदियों से जुड़ी समस्याओं के लिए, कुछ वाहनों को समय विंडो की वजह से, 0 के बाद शुरू करना पड़ सकता है. इसलिए, इन समस्याओं को ठीक करने के लिए, आपको fix_start_cumulative_to_zero को False पर सेट करना चाहिए.
  • dimension_name, डाइमेंशन के नाम के लिए स्ट्रिंग, जैसे कि 'Distance'. आप इसका इस्तेमाल, प्रोग्राम में कहीं और वैरिएबल को ऐक्सेस करने के लिए कर सकते हैं.

CVRP प्रोग्राम, AddDimensionWithVehicleCapacity तरीके का इस्तेमाल करके, कुछ अलग तरह के डाइमेंशन बनाता है. इस तरीके में, क्षमता के हिसाब से कई विकल्प दिए जाते हैं. हर वाहन के लिए, एक एंट्री होती है. (इसके उलट, AddDimension एक ही वैल्यू capacity के लिए लेता है. इसलिए, यह माना जाता है कि सभी वाहनों में एक ही क्षमता होती है.

डाइमेंशन बनाने के दूसरे तरीकों के बारे में जानने के लिए, RoutingModel का रेफ़रंस पेज देखें.

यह सेक्शन सॉल्यूशन टाइम विंडो को सूची या अरे में सेव करता है यह ऐसे फ़ंक्शन दिखाता है जो सूची या अरे में किसी डाइमेंशन में कुल डेटा सेव करते हैं.

Slack वैरिएबल

यहां एक उदाहरण दिया गया है, जिसमें यात्रा के समय की समस्या वाली ऐसी चीज़ों को दिखाया गया है जो धीमी हैं. मान लीजिए कि कोई वाहन अपने रास्ते के एक चरण में जगह i से जगह j तक जाता है और:

  • i पर यात्रा करने का कुल समय 100 मिनट है.
  • वाहन के लिए j में कुल 200 मिनट लगते हैं.
  • i से j तक यात्रा में 75 मिनट लगते हैं.

गाड़ी से i तक पहुंचने पर, मैं तुरंत जगह नहीं छोड़ सकता. इसके अलावा, जगह j पर कुल समय 175 भी हो सकता है. इसके बजाय, वाहन को 25 मिनट इंतज़ार करने के बाद ही, जगह i पर जाने से पहले इंतज़ार करना होगा. दूसरे शब्दों में, जगह i पर स्लैक 25 है.

वीआरPTW में स्लैक को अनुमति दें, क्योंकि हो सकता है कि 'जगह की जानकारी' पर सेट किए गए समय की वजह से, वाहनों को किसी जगह पर जाने में इंतज़ार करना पड़े. इस तरह की समस्या में, वाहनों को अगली जगह पर जाने से पहले किसी जगह पर इंतज़ार करने के लिए ज़्यादा से ज़्यादा समय slack_max पर सेट करें. अगर इससे कोई फ़र्क़ नहीं पड़ता कि वे कितनी देर इंतज़ार करते हैं, तो slack_max को किसी बड़ी संख्या पर सेट करें.

दूसरी ओर, CVRP के लिए i से j तक, कुल लोड में हुआ बदलाव i की मांग के बराबर है. इसलिए, कोई कमी नहीं है. ऐसी समस्याओं के लिए, slack_max को 0 पर सेट किया जा सकता है.

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

  • ट्रांज़िट वैरिएबल: किसी रास्ते के हर कदम पर संख्या में बढ़ोतरी या कमी. अगर i -> j किसी रास्ते का एक कदम है, तो ट्रांज़िट वैरिएबल या तो ट्रांज़िट मैट्रिक्स (सिर्फ़ ट्रांज़िट कॉलबैक के लिए) की i, या j एंट्री (अगर कॉलबैक सिर्फ़ एक जगह पर निर्भर करता है) पर, जगह i पर कॉलबैक वैल्यू है.
  • कुल वैरिएबल: हर जगह के लिए इकट्ठा की गई कुल संख्या. आप dimension_name.CumulVar(i) तक जगह i पर जाकर, क्यूमलेटिव वैरिएबल को ऐक्सेस कर सकते हैं. एक उदाहरण के लिए, VRPTW उदाहरण में समय विंडो की सीमाएं देखें.

यह मानते हुए कि एक चरण में एक वाहन i से लोकेशन j तक जाता है, स्लैक का मतलब इन वैरिएबल से होता है:

slack(i) = cumul(j) - cumul(i) - transit(i, j)

डाइमेंशन के बारे में ज़्यादा जानकारी के लिए, रेफ़रंस सेक्शन में RoutingDimension देखें.