একটি যানবাহনের পথকে সময় অক্ষ বরাবর এইভাবে বিভক্ত করা যেতে পারে (আমরা ধরে নিচ্ছি এখানে n সংখ্যক পরিদর্শন রয়েছে):
| | | | | T[2], | | |
| Transition | Visit #0 | | | V[2], | | |
| #0 | aka | T[1] | V[1] | ... | V[n-1] | T[n] |
| aka T[0] | V[0] | | | V[n-2],| | |
| | | | | T[n-1] | | |
^ ^ ^ ^ ^ ^ ^ ^
vehicle V[0].start V[0].end V[1]. V[1]. V[n]. V[n]. vehicle
start (arrival) (departure) start end start end end
লক্ষ্য করুন যে আমরা নিম্নলিখিত বিষয়গুলোর মধ্যে পার্থক্য করি:
- "নির্দিষ্ট ঘটনা", যেমন যানবাহনের যাত্রা শুরু ও শেষ এবং প্রতিটি পরিদর্শনের শুরু ও শেষ (অর্থাৎ আগমন ও প্রস্থান)। এগুলো একটি নির্দিষ্ট সেকেন্ডে ঘটে।
- "সময় ব্যবধান", যেমন সাক্ষাৎগুলো এবং সাক্ষাৎগুলোর মধ্যবর্তী সময়। যদিও সময় ব্যবধানের সময়কাল কখনও কখনও শূন্য হতে পারে, অর্থাৎ একই সেকেন্ডে শুরু এবং শেষ হতে পারে, তবে প্রায়শই এর একটি ধনাত্মক সময়কাল থাকে।
অপরিবর্তনীয় বিষয়সমূহ:
- যদি n সংখ্যক পরিদর্শন থাকে, তবে n+1 সংখ্যক স্থানান্তর থাকবে।
- একটি ভিজিট সর্বদা তার আগে একটি ট্রানজিশন (একই ইনডেক্স) এবং তার পরে একটি ট্রানজিশন (ইনডেক্স + ১) দ্বারা পরিবেষ্টিত থাকে।
- যানবাহন চালু হওয়ার পর সর্বদা ট্রানজিশন #০ অনুসরণ করা হয়।
- যানবাহনের শেষের আগে সর্বদা #n ট্রানজিশনটি থাকে।
আরও বিশদভাবে দেখলে, একটি Transition এবং একটি Visit সময় যা ঘটে তা হলো:
---+-------------------------------------+-----------------------------+-->
| TRANSITION[i] | VISIT[i] |
| | |
| * TRAVEL: the vehicle moves from | PERFORM the visit: |
| VISIT[i-1].departure_location to | |
| VISIT[i].arrival_location, which | * Spend some time: |
| takes a given travel duration | the "visit duration". |
| and distance | |
| | * Load or unload |
| * BREAKS: the driver may have | some quantities from the |
| breaks (e.g. lunch break). | vehicle: the "demand". |
| | |
| * WAIT: the driver/vehicle does | |
| nothing. This can happen for | |
| many reasons, for example when | |
| the vehicle reaches the next | |
| event's destination before the | |
| start of its time window | |
| | |
| * DELAY: *right before* the next | |
| arrival. E.g. the vehicle and/or | |
| driver spends time unloading. | |
| | |
---+-------------------------------------+-----------------------------+-->
^ ^ ^
V[i-1].end V[i].start V[i].end
সবশেষে, একটি রূপান্তরের সময় ভ্রমণ, বিরতি, বিলম্ব এবং অপেক্ষাকে কীভাবে সাজানো যেতে পারে, তা এখানে দেওয়া হলো।
- এগুলো একে অপরের উপর পড়ে না।
- বিলম্বটি স্বতন্ত্র এবং এটি অবশ্যই পরবর্তী পরিদর্শনের (বা যানবাহনের শেষ হওয়ার) ঠিক আগের একটি অবিচ্ছিন্ন সময়কাল হতে হবে। সুতরাং, এর শুরু এবং শেষের সময় জানার জন্য বিলম্বের সময়কাল জানাই যথেষ্ট।
- বিরতিগুলো হলো পরপর অবস্থিত ও পরস্পর সম্পর্কহীন সময়কাল। উত্তরে প্রতিটি বিরতির শুরুর সময় ও সময়কাল উল্লেখ করা থাকে।
- ভ্রমণ এবং অপেক্ষা হলো "পূর্বনির্ধারিত বাধা": এই রূপান্তরের সময় এগুলোকে একাধিকবার থামানো যেতে পারে। ক্লায়েন্টরা ধরে নিতে পারেন যে ভ্রমণ "যত তাড়াতাড়ি সম্ভব" সম্পন্ন হয় এবং বাকি সময়টুকু "অপেক্ষা" দ্বারা পূর্ণ থাকে।
একটি (জটিল) উদাহরণ:
TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
|| | | | | | | ||
|| T | B | T | | B | | D ||
|| r | r | r | W | r | W | e ||
|| a | e | a | a | e | a | l ||
|| v | a | v | i | a | i | a ||
|| e | k | e | t | k | t | y ||
|| l | | l | | | | ||
|| | | | | | | ||
--++-----------------------------------------------------------------++-->
| JSON উপস্থাপনা |
|---|
{ "vehicleIndex": integer, "vehicleLabel": string, "vehicleStartTime": string, "vehicleEndTime": string, "visits": [ { object ( |
| ক্ষেত্র | |
|---|---|
vehicleIndex | রুটটি সম্পাদনকারী যানবাহন, যা উৎস |
vehicleLabel | এই রুটে চলাচলকারী যানবাহনের লেবেল, যা নির্দিষ্ট করা থাকলে |
vehicleStartTime | যে সময়ে যানবাহনটি তার যাত্রা শুরু করে। RFC 3339 ব্যবহার করা হয়, যেখানে তৈরি হওয়া আউটপুট সর্বদা Z-নরম্যালাইজড হবে এবং এতে ০, ৩, ৬ বা ৯টি ভগ্নাংশীয় অঙ্ক ব্যবহৃত হবে। "Z" ছাড়াও অন্যান্য অফসেটও গ্রহণ করা হয়। উদাহরণ: |
vehicleEndTime | যে সময়ে যানবাহনটি তার পথচলা শেষ করে। RFC 3339 ব্যবহার করা হয়, যেখানে তৈরি হওয়া আউটপুট সর্বদা Z-নরম্যালাইজড হবে এবং এতে ০, ৩, ৬ বা ৯টি ভগ্নাংশীয় অঙ্ক ব্যবহৃত হবে। "Z" ছাড়াও অন্যান্য অফসেটও গ্রহণ করা হয়। উদাহরণ: |
visits[] | একটি রুটের প্রতিনিধিত্বকারী পরিদর্শনের ক্রমিক অনুক্রম। visits[i] হলো রুটের i-তম পরিদর্শন। যদি এই ক্ষেত্রটি খালি থাকে, তবে যানবাহনটিকে অব্যবহৃত বলে গণ্য করা হয়। |
transitions[] | রুটটির ট্রানজিশনগুলোর ক্রমিক তালিকা। |
hasTrafficInfeasibilities | যখন যানজটের কারণে আনুমানিক ভ্রমণ সময় |
routePolyline | রুটের এনকোডেড পলিলাইন উপস্থাপনা। এই ফিল্ডটি শুধুমাত্র তখনই পূরণ করা হয় যখন |
breaks[] | এই রুটে চলাচলকারী যানবাহনটির জন্য নির্ধারিত বিরতি। |
metrics | এই রুটের জন্য সময়কাল, দূরত্ব এবং লোড মেট্রিক্স। প্রসঙ্গের উপর নির্ভর করে, |
vehicleFullness | নির্ধারিত মেট্রিকগুলো তাদের নিজ নিজ গাড়ির সীমার কতটা কাছাকাছি, তা গণনা করার জন্য পরীক্ষামূলক: ভবিষ্যতে এই ক্ষেত্রের আচরণ বা অস্তিত্ব পরিবর্তিত হতে পারে। |
routeCosts | রুটের খরচ, যা খরচ-সম্পর্কিত অনুরোধ ফিল্ড অনুসারে বিভক্ত। কী-গুলো হলো প্রোটো পাথ, যা ইনপুট OptimizeToursRequest-এর সাথে সম্পর্কিত, যেমন "model.shipments.pickups.cost", এবং ভ্যালু-গুলো হলো সংশ্লিষ্ট কস্ট ফিল্ড দ্বারা উৎপন্ন মোট খরচ, যা পুরো রুট জুড়ে একত্রিত করা হয়েছে। অন্য কথায়, costs["model.shipments.pickups.cost"] হলো রুট জুড়ে সমস্ত পিকআপ খরচের সমষ্টি। মডেলে সংজ্ঞায়িত সমস্ত খরচ এখানে বিস্তারিতভাবে রিপোর্ট করা হয়েছে, TransitionAttributes-সম্পর্কিত খরচ ব্যতীত, যা ২০২২/০১ তারিখ থেকে শুধুমাত্র একত্রিতভাবে রিপোর্ট করা হয়। |
routeTotalCost | রুটের মোট খরচ। কস্ট ম্যাপে থাকা সমস্ত খরচের সমষ্টি। |
পরিদর্শন করুন
একটি রুট চলাকালীন সম্পাদিত পরিদর্শন। এই পরিদর্শনটি কোনো Shipment পিকআপ বা ডেলিভারিকে বোঝায়।
| JSON উপস্থাপনা |
|---|
{ "shipmentIndex": integer, "isPickup": boolean, "visitRequestIndex": integer, "startTime": string, "loadDemands": { string: { object ( |
| ক্ষেত্র | |
|---|---|
shipmentIndex | উৎস |
isPickup | যদি সত্য হয়, তবে এই পরিদর্শনটি একটি |
visitRequestIndex | |
startTime | পরিদর্শন শুরুর সময়। উল্লেখ্য যে, যানবাহনটি পরিদর্শনের স্থানে এর আগেও পৌঁছাতে পারে। সময়গুলো RFC 3339 ব্যবহার করা হয়, যেখানে তৈরি হওয়া আউটপুট সর্বদা Z-নরম্যালাইজড হবে এবং এতে ০, ৩, ৬ বা ৯টি ভগ্নাংশীয় অঙ্ক ব্যবহৃত হবে। "Z" ছাড়াও অন্যান্য অফসেটও গ্রহণ করা হয়। উদাহরণ: |
loadDemands | চালান এবং ভিজিট অনুরোধের |
detour | পরিদর্শনের আগে পথে পরিদর্শন করা চালান এবং নির্দিষ্ট সময়সীমার কারণে সৃষ্ট সম্ভাব্য অপেক্ষার সময়ের জন্য অতিরিক্ত পথ পরিবর্তনজনিত সময়। যদি পরিদর্শনটি একটি ডেলিভারি হয়, তবে পথ পরিবর্তনজনিত সময় সংশ্লিষ্ট পিকআপ পরিদর্শন থেকে গণনা করা হয় এবং তা নিম্নরূপ: অন্যথায়, এটি গাড়ির সেকেন্ডে পরিমাপকৃত সময়কাল, যা সর্বোচ্চ নয়টি ভগ্নাংশ অঙ্ক পর্যন্ত হতে পারে এবং শেষে ' |
shipmentLabel | |
visitLabel | |
visitType | ঐচ্ছিক। পরিদর্শনের ধরণ নির্দিষ্ট করে। এটি |
injectedSolutionLocationToken | পরিদর্শনের স্থান সম্পর্কিত তথ্য উপস্থাপনকারী একটি অস্বচ্ছ টোকেন। এই ভিজিটের জন্য পরীক্ষামূলক: আরও বিস্তারিত জানতে https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request দেখুন। |
পরিদর্শনের ধরণ
এটি নির্দেশ করে যে ভিজিটটি একটি পিকআপ, ডেলিভারি, নাকি কোনো Stop ভিজিট। Stop ভিজিট শুধুমাত্র তখনই ব্যবহৃত হয় যখন মাল্টিমোডাল অপটিমাইজেশন সক্রিয় থাকে।
| এনাম | |
|---|---|
VISIT_TYPE_UNSPECIFIED | অনির্দিষ্ট পরিদর্শনের ধরণ। |
PICKUP_SHIPMENT | এই পরিদর্শনের মাধ্যমে পণ্য চালান সংগ্রহ করা হয়। |
DELIVER_SHIPMENT | পরিদর্শন বলতে চালান সরবরাহকে বোঝায়। |
রূপান্তর
রুটের দুটি ইভেন্টের মধ্যে ট্রানজিশন। ShipmentRoute এর বিবরণ দেখুন।
যদি যানবাহনটির কোনো startLocation এবং/অথবা endLocation না থাকে, তাহলে সংশ্লিষ্ট ভ্রমণের মেট্রিক্স ০ হবে।
| JSON উপস্থাপনা |
|---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( |
| ক্ষেত্র | |
|---|---|
travelDuration | এই পরিবর্তনকালীন ভ্রমণের সময়কাল। সেকেন্ডে পরিমাপকৃত সময়কাল, যা সর্বোচ্চ নয়টি ভগ্নাংশ অঙ্ক পর্যন্ত হতে পারে এবং শেষে ' |
travelDistanceMeters | রূপান্তরের সময় অতিক্রান্ত দূরত্ব। |
trafficInfoUnavailable | যখন |
delayDuration | এই ট্রানজিশনে প্রয়োগ করা বিলম্বের সময়কালগুলোর সমষ্টি। যদি কোনো বিলম্ব থাকে, তবে তা পরবর্তী ইভেন্টের (ভিজিট বা গাড়ির শেষ) ঠিক সেকেন্ডে পরিমাপকৃত সময়কাল, যা সর্বোচ্চ নয়টি ভগ্নাংশ অঙ্ক পর্যন্ত হতে পারে এবং শেষে ' |
breakDuration | এই ট্রানজিশনের সময় ঘটা বিরতিগুলোর (যদি থাকে) মোট সময়কাল। প্রতিটি বিরতির শুরুর সময় এবং সময়কাল সম্পর্কিত বিস্তারিত তথ্য সেকেন্ডে পরিমাপকৃত সময়কাল, যা সর্বোচ্চ নয়টি ভগ্নাংশ অঙ্ক পর্যন্ত হতে পারে এবং শেষে ' |
waitDuration | এই রূপান্তরের সময় অপেক্ষার সময়। অপেক্ষার সময়কাল বলতে নিষ্ক্রিয় সময়কে বোঝায় এবং এর মধ্যে বিরতির সময় অন্তর্ভুক্ত নয়। আরও মনে রাখবেন যে এই অপেক্ষার সময়টি কয়েকটি বিচ্ছিন্ন বিরতিতে বিভক্ত হতে পারে। সেকেন্ডে পরিমাপকৃত সময়কাল, যা সর্বোচ্চ নয়টি ভগ্নাংশ অঙ্ক পর্যন্ত হতে পারে এবং শেষে ' |
totalDuration | রূপান্তরের মোট সময়কাল, যা সুবিধার জন্য প্রদান করা হলো:
সেকেন্ডে পরিমাপকৃত সময়কাল, যা সর্বোচ্চ নয়টি ভগ্নাংশ অঙ্ক পর্যন্ত হতে পারে এবং শেষে ' |
startTime | এই রূপান্তরের শুরুর সময়। RFC 3339 ব্যবহার করা হয়, যেখানে তৈরি হওয়া আউটপুট সর্বদা Z-নরম্যালাইজড হবে এবং এতে ০, ৩, ৬ বা ৯টি ভগ্নাংশীয় অঙ্ক ব্যবহৃত হবে। "Z" ছাড়াও অন্যান্য অফসেটও গ্রহণ করা হয়। উদাহরণ: |
routePolyline | ট্রানজিশনের সময় অনুসরণ করা পথের এনকোডেড পলিলাইন উপস্থাপনা। এই ফিল্ডটি শুধুমাত্র তখনই পূরণ করা হয় যখন |
routeToken | শুধুমাত্র আউটপুট। এটি একটি অস্বচ্ছ টোকেন যা নেভিগেশনের সময় রুট পুনর্গঠন করতে এবং রুট পরিবর্তনের ক্ষেত্রে, রুট তৈরির সময়কার মূল উদ্দেশ্যকে সম্মান জানাতে নেভিগেশন SDK- তে পাঠানো যেতে পারে। এই টোকেনটিকে একটি অস্বচ্ছ ব্লব হিসেবে বিবেচনা করুন। বিভিন্ন রিকোয়েস্টের মধ্যে এর মান তুলনা করবেন না, কারণ সার্ভিসটি হুবহু একই রুট ফেরত দিলেও এর মান পরিবর্তিত হতে পারে। এই ফিল্ডটি শুধুমাত্র তখনই পূরণ করা হয় যখন |
vehicleLoads | এই স্থানান্তরের সময় যানবাহনের লোড, প্রতিটি ধরণের জন্য যা হয় এই যানবাহনের প্রথম ট্রানজিশনের সময়কার লোডগুলোই হলো যানবাহন রুটের প্রারম্ভিক লোড। এরপর, প্রতিটি ভিজিটের পরে, ভিজিটটি পিকআপ ছিল নাকি ডেলিভারি ছিল তার উপর নির্ভর করে, পরবর্তী ট্রানজিশনের লোড পাওয়ার জন্য সেই ভিজিটের |
এনকোডেডপলিলাইন
একটি পলিলাইনের এনকোডেড উপস্থাপনা। পলিলাইন এনকোডিং সম্পর্কে আরও তথ্য এখানে পাওয়া যাবে: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding ।
| JSON উপস্থাপনা |
|---|
{ "points": string } |
| ক্ষেত্র | |
|---|---|
points | পলিলাইনের এনকোড করা পয়েন্টগুলো উপস্থাপনকারী স্ট্রিং। |
বিরতি
একটি বিরতি কার্যকর হওয়ার তথ্য।
| JSON উপস্থাপনা |
|---|
{ "startTime": string, "duration": string } |
| ক্ষেত্র | |
|---|---|
startTime | বিরতির শুরুর সময়। RFC 3339 ব্যবহার করা হয়, যেখানে তৈরি হওয়া আউটপুট সর্বদা Z-নরম্যালাইজড হবে এবং এতে ০, ৩, ৬ বা ৯টি ভগ্নাংশীয় অঙ্ক ব্যবহৃত হবে। "Z" ছাড়াও অন্যান্য অফসেটও গ্রহণ করা হয়। উদাহরণ: |
duration | বিরতির সময়কাল। সেকেন্ডে পরিমাপকৃত সময়কাল, যা সর্বোচ্চ নয়টি ভগ্নাংশ অঙ্ক পর্যন্ত হতে পারে এবং শেষে ' |
যানবাহন পূর্ণতা
VehicleFullness হলো একটি মেট্রিক যা গণনা করে একটি যানবাহন কতটা পূর্ণ। প্রতিটি VehicleFullness ফিল্ডের মান ০ থেকে ১-এর মধ্যে থাকে, যা একটি নির্দিষ্ট মেট্রিক ফিল্ড (যেমন AggregatedMetrics.travel_distance_meters ) এবং এর সম্পর্কিত যানবাহনের সীমার (যেমন Vehicle.route_distance_limit ) অনুপাত হিসাবে গণনা করা হয়, যদি সেই সীমাটি বিদ্যমান থাকে। অন্যথায়, পূর্ণতার অনুপাতটি অনির্ধারিত থাকে। যদি সীমাটি ০ হয়, তবে ফিল্ডটির মান ১ নির্ধারণ করা হয়। দ্রষ্টব্য: যখন কোনো রুটে যানজটের কারণে চলাচল করা অসম্ভব হয়ে পড়ে, তখন কিছু পূর্ণতার অনুপাত ১.০ অতিক্রম করতে পারে, যেমন যানবাহনটি তার দূরত্বের সীমা অতিক্রম করতে পারে। এই ক্ষেত্রে, আমরা পূর্ণতার মান ১.০-এ সীমাবদ্ধ করে দিই।
| JSON উপস্থাপনা |
|---|
{ "maxFullness": number, "distance": number, "travelDuration": number, "activeDuration": number, "maxLoad": number, "activeSpan": number } |
| ক্ষেত্র | |
|---|---|
maxFullness | এই বার্তার অন্য সব ক্ষেত্রের সর্বোচ্চ মান। |
distance | |
travelDuration | [AggregatedMetrics.travel_duration_seconds][] এবং |
activeDuration | [AggregatedMetrics.total_duration_seconds][] এবং |
maxLoad | সকল প্রকারের [AggregatedMetrics.max_load][] এবং তাদের নিজ নিজ |
activeSpan | একটি নির্দিষ্ট গাড়ির জন্য অনুপাতটি হলো (vehicleEndTime - vehicleStartTime) / (latestVehicleEndTime - earliestVehicleStartTime)। যদি হরটি উপস্থিত না থাকে, তবে এর পরিবর্তে ( |