মাত্রা

রাউটিং সলভার গাড়ির রুটে জমে থাকা পরিমাণের ট্র্যাক রাখতে একটি মাত্রা নামক বস্তু ব্যবহার করে, যেমন ভ্রমণের সময় বা, যদি গাড়িটি পিকআপ এবং ডেলিভারি করে, মোট ওজন বহন করে। যদি একটি রাউটিং সমস্যা এই ধরনের একটি পরিমাণ জড়িত থাকে, হয় সীমাবদ্ধতা বা উদ্দেশ্য ফাংশনে, আপনাকে সেগুলি নির্দিষ্ট করার জন্য একটি মাত্রা সংজ্ঞায়িত করতে হবে।

এই বিভাগটি ব্যাখ্যা করে কিভাবে মাত্রা সংজ্ঞায়িত করতে হয় এবং ব্যবহার করতে হয়।

মাত্রার উদাহরণ

এখানে পূর্ববর্তী বিভাগগুলি থেকে মাত্রার কয়েকটি উদাহরণ রয়েছে৷

  • VRPTW উদাহরণ প্রতিটি গাড়ির ক্রমবর্ধমান ভ্রমণের সময় ট্র্যাক করার জন্য একটি মাত্রা তৈরি করে। সমাধানকারী সীমাবদ্ধতা প্রয়োগ করতে মাত্রা ব্যবহার করে যে একটি যানবাহন শুধুমাত্র অবস্থানের সময় উইন্ডোর মধ্যে একটি অবস্থান পরিদর্শন করতে পারে।

  • CVRP উদাহরণটি চাহিদাগুলির জন্য একটি মাত্রা তৈরি করে (যেমন, প্যাকেজের ওজন বা ভলিউম বাছাই করা হবে), যা যানবাহনটি তার রুটে বহন করা ক্রমবর্ধমান লোডকে ট্র্যাক করে। একটি গাড়ির লোড তার ক্ষমতা অতিক্রম করতে পারে না যে সীমাবদ্ধতা প্রয়োগ করার জন্য সমাধানকারী মাত্রা ব্যবহার করে।

নীচের উদাহরণগুলি AddDimension পদ্ধতি ব্যবহার করে VRPTW-এর জন্য একটি মাত্রা সংজ্ঞায়িত করে।

পাইথন

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

সি++

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

জাভা

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

সি#

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 : বুলিয়ান মান। True হলে, পরিমাণের ক্রমবর্ধমান মান 0 থেকে শুরু হয়। বেশিরভাগ ক্ষেত্রে, এটি সত্যে সেট করা উচিত। যাইহোক, VRPTW বা সম্পদের সীমাবদ্ধতার সমস্যাগুলির জন্য, কিছু যানবাহন সময় উইন্ডোর সীমাবদ্ধতার কারণে 0 এর পরে শুরু করতে হতে পারে, তাই এই সমস্যাগুলির জন্য আপনার fix_start_cumulative_to_zero কে False সেট করা উচিত।
  • dimension_name : মাত্রার নামের জন্য স্ট্রিং, যেমন 'Distance' , যা আপনি প্রোগ্রামের অন্য কোথাও ভেরিয়েবল অ্যাক্সেস করতে ব্যবহার করতে পারেন।

CVRP প্রোগ্রাম AddDimensionWithVehicleCapacity পদ্ধতি ব্যবহার করে একটু ভিন্ন ধরনের মাত্রা তৈরি করে। এই পদ্ধতিতে প্রতিটি গাড়ির জন্য একটি এন্ট্রি সহ ক্ষমতার একটি অ্যারে লাগে। (বিপরীতভাবে, AddDimension capacity জন্য একটি একক মান নেয়, তাই সমস্ত যানবাহনের একই ক্ষমতা রয়েছে বলে ধরে নেওয়া হয়।)

মাত্রা তৈরি করে এমন অন্যান্য পদ্ধতির জন্য RoutingModel রেফারেন্স পৃষ্ঠাটি দেখুন।

বিভাগটি একটি তালিকা বা অ্যারেতে সমাধান সময় উইন্ডোগুলি সংরক্ষণ করে এমন ফাংশনগুলি উপস্থাপন করে যা একটি তালিকা বা অ্যারেতে একটি মাত্রায় ক্রমবর্ধমান ডেটা সংরক্ষণ করে।

স্ল্যাক ভেরিয়েবল

এখানে একটি উদাহরণ যা ভ্রমণের সময় জড়িত একটি সমস্যার জন্য স্ল্যাক ভেরিয়েবলকে চিত্রিত করে। ধরুন একটি যান তার রুটের এক ধাপে অবস্থান i থেকে অবস্থান j পর্যন্ত যায়, এবং তা হল:

  • i এ গাড়ির ক্রমবর্ধমান ভ্রমণের সময় হল 100 মিনিট৷
  • j-এ গাড়ির ক্রমবর্ধমান ভ্রমণের সময় হল 200 মিনিট৷
  • i থেকে j পর্যন্ত ভ্রমণের সময় 75 মিনিট।

গাড়িটি আগমনের সাথে সাথে অবস্থান i ছেড়ে যেতে পারে না, অথবা j অবস্থানে এর ক্রমবর্ধমান সময় হবে 175। পরিবর্তে, গাড়িটি প্রস্থান করার আগে i অবস্থানে 25 মিনিট অপেক্ষা করতে হবে; অন্য কথায়, অবস্থান i-এ স্ল্যাক 25।

আপনাকে একটি VRPTW-তে ঢিলেঢালা অনুমতি দিতে হবে কারণ সময় জানালার সীমাবদ্ধতার কারণে যানবাহনগুলিকে একটি অবস্থানে যাওয়ার আগে অপেক্ষা করতে হতে পারে। এই ধরনের সমস্যায়, পরবর্তী অবস্থানে যাওয়ার আগে যানবাহনগুলিকে একটি অবস্থানে অপেক্ষা করার অনুমতি দিতে আপনি যে পরিমাণ সর্বোচ্চ সময় চান তাতে 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 ডাইমেনশন দেখুন।