ট্রানজিশন অ্যাট্রিবিউট সহ মডেল বিজনেস লজিক

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

শুরু করার আগে

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

ট্রানজিশন হল রুটের সেই অংশ যা একটি লোকেশনকে পরবর্তী লোকেশনের সাথে কানেক্ট করে।

লোকেশন বলতে কোনও গাড়ির রুটের নিম্নলিখিত পয়েন্টগুলির মধ্যে যেকোনও একটিকে বোঝায়:

  • রুটের শুরুর স্থান।
  • যেখানে পিক-আপ বা ডেলিভারি করা হয়।
  • রুটের শেষ পয়েন্ট।

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

বাস্তব জগতের পরিস্থিতি মডেল করা

এই বিভাগে ট্রানজিশন অ্যাট্রিবিউট ব্যবহার করে কীভাবে বাস্তব-জগতের ব্যবসায়িক বাধ্যবাধকতা প্রয়োগ করতে হয় তার দুটি ছোট উদাহরণ দেখানো হয়েছে।

পার্কিংয়ের জন্য সময় রিজার্ভ করুন

এই পরিস্থিতিতে, ড্রাইভারকে লোকেশন A-তে যাওয়ার আগে গাড়ি পার্ক করতে হবে। লোকেশন 'খ' কাছাকাছি অবস্থিত এবং ড্রাইভার দুটি ভিজিটের জন্যই একই পার্কিং স্পট ব্যবহার করতে পারেন। ড্রাইভার যদি A-এর ঠিক পরেই B-তে যান, তাহলে তার সময় বাঁচবে কারণ তাকে পার্কিং স্পট ছেড়ে যেতে হবে না এবং আবার গাড়ি পার্ক করতে হবে না। রুট অপ্টিমাইজেশন 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 হলে এবং গাড়ি পার্ক করতে ১৫০ সেকেন্ড সময় লাগলে, আপনি 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 একটি বড় ভ্যালুতে সেট করুন। আপনি যখন সর্বাধিক রুট সময়কালের চেয়ে বেশি বিলম্ব করেন, তখন আপনি কার্যকরভাবে অপ্টিমাইজারকে রুটে এই ট্রানজিশন ব্যবহার করতে বাধা দেন।

    যেমন, মডেলের টাইম স্কেল এক কর্মদিবস হলে, আপনি পরিষ্কার করার সুবিধা ও রুটের শুরু ছাড়া অন্য কোনও জায়গা থেকে রুটের শেষ পর্যন্ত ট্রানজিট নিষিদ্ধ করতে ২৪ ঘণ্টার (৮৬৪০০ সেকেন্ড) বিলম্ব ব্যবহার করতে পারেন:

    {
      "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 সেট করে সব ট্যাগ ম্যাচ করতে পারবেন, এমন একটি ট্যাগে যা মডেলে কোথাও ব্যবহার করা হয়নি। এটি সেইসব লোকেশনের সাথে ম্যাচ করবে যেগুলিতে এই ট্যাগ নেই, কিন্তু যেহেতু আপনি ইচ্ছাকৃতভাবে এমন একটি ট্যাগ বেছে নিয়েছেন যা কোনও লোকেশন ব্যবহার করে না, তাই এই ট্রানজিশন অ্যাট্রিবিউট সব লোকেশনের সাথে ম্যাচ করবে।

আরও পড়ুন