রুট অপটিমাইজেশন এপিআই সংশ্লিষ্ট অনুরোধে থাকা যানবাহনগুলোর জন্য রুট ফেরত দেয়। অনুরোধের বৈশিষ্ট্যের উপর নির্ভর করে চালানগুলো যানবাহনে বরাদ্দ করা হয়, অথবা বাদও দেওয়া হতে পারে।
একটি OptimizeToursResponse মেসেজের ( REST , gRPC ) দুটি প্রধান টপ-লেভেল প্রপার্টি রয়েছে:
-
routes[]হলো প্রতিটি যানবাহনের জন্য নির্ধারিত চালানসহ তার রুটসমূহ। প্রতিটিRouteসেই নির্দিষ্ট রুটের বৈশিষ্ট্যসূচক মেট্রিকস থাকে। -
metricsহলো সমস্ত যানবাহন এবং রুট পরিকল্পনা জুড়ে, সমগ্র প্রতিক্রিয়ার জন্য সমষ্টিগত মেট্রিক। শীর্ষ-স্তরের মেট্রিকগুলোতে প্রতি-রুট মেট্রিকের মতোই বৈশিষ্ট্য থাকে, তবে এর মানগুলো সমস্ত রুট জুড়ে সমষ্টিগতভাবে গণনা করা হয়।
অপ্টিমাইজেশনের ফলাফলের উপর নির্ভর করে কিছু প্রপার্টি সবসময় পূরণ নাও হতে পারে:
-
skippedShipments[]সেইসব চালানের তালিকা করে যা কোনো যানবাহন দ্বারা সম্পন্ন করা হয়নি। একটি চালান বাদ দেওয়া হতে পারে যদি তা নির্দিষ্ট সীমাবদ্ধতার মধ্যে সম্পন্ন করা না যায় অথবা যদি চালানটি সম্পন্ন করার খরচ তার জরিমানা খরচকে ছাড়িয়ে যায়। উদাহরণস্বরূপ, যদি কোনো চালানের পিকআপ বা ডেলিভারির জন্য খুব সংকীর্ণ একটিtimeWindowথাকে, তবে কোনো যানবাহনের পক্ষে সেই নির্ধারিত সময়সীমার মধ্যে কাজটি সম্পন্ন করা সম্ভব নাও হতে পারে বা তা ব্যয়সাশ্রয়ী নাও হতে পারে। -
validationErrors[]সেইসব ত্রুটি নির্দিষ্ট করে, যা অনুরোধেরsolvingModeVALIDATE_ONLYতে সেট করা থাকলে অনুরোধটিকে অবৈধ বা সমাধান করা অসম্ভব করে তোলে। সাধারণDEFAULT_SOLVEমোডে, ভ্যালিডেশন ত্রুটিগুলো রেসপন্স বডির পরিবর্তে একটি ত্রুটি বার্তায় প্রদর্শিত হবে। উল্লেখ্য যে,VALIDATE_ONLYসলভিং মোড একবারে একাধিক ত্রুটি রিপোর্ট করতে পারে, যা অনুরোধ দ্রুত ডিবাগ করার জন্য উপযোগী।
রুট বৈশিষ্ট্য
প্রতিটি routes[] এন্ট্রি হলো একটি ShipmentRoute মেসেজ ( REST , gRPC )। প্রতিটি ShipmentRoute অনুরোধ থেকে একটি নির্দিষ্ট গাড়ির জন্য নির্ধারিত রুটকে নির্দেশ করে। এর সংশ্লিষ্ট Vehicle সাথে সম্পর্কিত গুরুত্বপূর্ণ ShipmentRoute প্রোপার্টিগুলোর মধ্যে রয়েছে:
-
vehicleIndexহলো সংশ্লিষ্ট অনুরোধ বার্তায় থাকাVehicleএর শূন্য-ভিত্তিক সূচক। এর মান শূন্য হলে REST প্রতিক্রিয়াগুলি এই বৈশিষ্ট্যটি বাদ দেয়। -
vehicleStartTimeহলো সেই সময় যখন যানবাহনটিকে তার যাত্রা শুরু করতে হবে। -
vehicleEndTimeহলো সেই সময়, যখন যানবাহনটির তার যাত্রাপথ শেষ করার কথা।
প্রতিক্রিয়ায়, routes দেখতে এইরকম হবে:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
...
],
"transitions": [
...
],
"metrics": {
...
},
...
}
],
...
}
প্রতিটি ShipmentRoute যানবাহনটির সম্পন্ন করার জন্য visits একটি ক্রমিক তালিকা অন্তর্ভুক্ত থাকে। প্রতিটি Visit ( REST , gRPC ) সংশ্লিষ্ট রিকোয়েস্ট থেকে আসা একটি VisitRequest ( REST , gRPC )-কে প্রতিনিধিত্ব করে। Visit গুরুত্বপূর্ণ প্রপার্টিগুলোর মধ্যে রয়েছে:
-
shipmentIndexহলো সংশ্লিষ্ট অনুরোধে এই ভিজিটটি যে শিপমেন্টের অন্তর্গত, তার শূন্য-ভিত্তিক সূচক। - যখন কোনো ভিজিট পিকআপ হয় তখন
isPickupমান true হয় এবং যখন কোনো ভিজিট ডেলিভারি হয় তখন এর মান false হয়। REST রেসপন্সগুলো এই প্রপার্টির মান false হলে তা বাদ দিয়ে দেয়। -
visitRequestIndexহলো সংশ্লিষ্ট অনুরোধের মধ্যে থাকাShipment.pickupsবাShipment.deliveriesএরVisitRequestএর শূন্য-ভিত্তিক সূচক, যে অনুরোধটিকেVisitটি প্রতিনিধিত্ব করে। এর মান শূন্য হলে REST প্রতিক্রিয়াগুলি এই প্রপার্টিটি বাদ দেয়। -
startTimeহলো সেই সময় যখন পরিদর্শনটি শুরু হবে বলে আশা করা হচ্ছে। -
loadDemandsএকটিVisitসম্পন্ন করার জন্য প্রয়োজনীয় লোডের পরিমাণকে লোডের ধরনের সাথে সংযুক্ত করে। ডেলিভারি ভিজিটের ক্ষেত্রে লোডের পরিমাণ ঋণাত্মক হয়, যা যানবাহন থেকে লোড সরিয়ে নেওয়াকে বোঝায়।
একটি Visit উদাহরণ দেখতে এইরকম:
{
"routes": [
{
...
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
...
],
},
...
],
...
}
প্রতিটি ShipmentRoute transitions একটি ক্রমিক তালিকা অন্তর্ভুক্ত থাকে, যা একটি নির্দিষ্ট যানবাহনের জন্য বিভিন্ন visits মধ্যবর্তী ভ্রমণকে নির্দেশ করে। গুরুত্বপূর্ণ Transition মেসেজ ( REST , gRPC ) প্রোপার্টিগুলির মধ্যে রয়েছে:
-
startTimeহলো সেই সময়, যে সময়ে যানবাহনটি রূপান্তরটি সম্পাদন করা শুরু করবে। -
travelDurationহলো সেই সময়কাল, যা যানবাহনটিকে স্থানান্তরটি সম্পন্ন করার জন্য ভ্রমণ করতে হয়। -
travelDistanceMetersহলো সেই দূরত্ব যা যানবাহনটিকে রূপান্তরটি সম্পন্ন করার জন্য মিটারে অতিক্রম করতে হবে। -
trafficInfoUnavailableনির্দেশ করে যে ট্রানজিশনটির জন্য ট্র্যাফিক ডেটা উপলব্ধ আছে কিনা। -
waitDurationহলো সেই নিষ্ক্রিয় সময় যা যানবাহনটি তার পরবর্তীVisitশুরু করার আগে অপেক্ষা করতে ব্যয় করে। পরবর্তীVisitstart_timeএর কারণে এটি হতে পারে। -
totalDurationহলো স্থানান্তরের মোট সময়কাল, যার মধ্যে ভ্রমণ, অপেক্ষা, বিরতি এবং বিলম্বের সময় অন্তর্ভুক্ত। -
vehicleLoadsএই স্থানান্তরের সময় যানবাহন দ্বারা বহন করা লোডের ধরনের সাথে লোডের পরিমাণকে সংযুক্ত করে।
একটি উদাহরণ Transition দেখতে এইরকম:
{
"routes": [
{
...
"transitions": [
...
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
...
],
...
}
],
...
}
vists এবং transitions মধ্যে সম্পর্ক সম্পর্কে আরও তথ্যের জন্য, পিকআপ এবং ডেলিভারি স্টপ অর্ডার অপটিমাইজেশন এবং ShipmentRoute রেফারেন্স ডকুমেন্টেশন ( REST , gRPC ) দেখুন। একটি Transition মেসেজের routePolyline এবং routeToken প্রোপার্টি সম্পর্কে আরও তথ্যের জন্য, ট্রানজিশন পলিলাইন এবং রুট টোকেন দেখুন।
মেট্রিক বৈশিষ্ট্য
Metrics মেসেজ ( REST , gRPC ) সম্পূর্ণ সলিউশনটির সারসংক্ষেপ তুলে ধরে। Metrics কিছু গুরুত্বপূর্ণ প্রপার্টি হলো:
-
totalCostহলো রুটগুলো সম্পন্ন করতে হওয়া মোট খরচ। খরচ সম্পর্কে আরও জানতে Cost Model Parameters পড়ুন। -
usedVehicleCountহলো সলিউশনে ব্যবহৃত মোট গাড়ির সংখ্যা। অপটিমাইজার যখন নির্ধারণ করে যে কোনো গাড়ির ব্যবহার অপ্রয়োজনীয়, তখন সেটির রুট খালি থাকতে পারে। -
skippedMandatoryShipmentCountহলো সেইসব বাতিলকৃত চালানের সংখ্যা যেগুলো "বাধ্যতামূলক"। একটি বাধ্যতামূলক চালান বাতিল করা হলে যেpenaltyCostহয়, তা বাধ্যতামূলক চালানের ক্ষেত্রে নির্দিষ্ট করা থাকে না। নির্দিষ্ট সীমাবদ্ধতার অধীনে কোনো বাধ্যতামূলক চালান সম্পাদন করা সম্ভব না হলে, সেটিও বাতিল করা যেতে পারে। খরচ সম্পর্কে আরও জানতে Cost Model Parameters পড়ুন।
অতিরিক্ত মেট্রিকগুলো AggregatedMetrics মেসেজ ( REST , gRPC ) হিসেবে রিপোর্ট করা হয়। AggregatedMetrics মেসেজ টাইপটি Metrics.aggregatedRouteMetrics এবং ShipmentRoute.metrics প্রপার্টির জন্য ব্যবহৃত হয়। Metrics.aggregatedRouteMetrics OptimizeToursResponse এর সমস্ত ShipmentRoute জুড়ে একত্রিত মেট্রিকগুলো থাকে। প্রতিটি ShipmentRoute.metrics প্রপার্টিতে সেই নির্দিষ্ট ShipmentRoute মেট্রিকগুলো থাকে।
গুরুত্বপূর্ণ AggregatedMetrics বৈশিষ্ট্যগুলির মধ্যে রয়েছে:
-
performedShipmentCountহলো যানবাহনগুলো দ্বারা তাদের সম্পূর্ণ রুট জুড়ে সম্পন্ন করা চালানের সংখ্যা। -
travelDurationহলো যানবাহনগুলোর তাদের নির্ধারিত পথ সম্পন্ন করতে যাতায়াতে ব্যয়িত মোট সময়। -
waitDurationহলো যানবাহনগুলোর তাদের রুট সম্পন্ন করার সময় অপেক্ষারত মোট সময়। -
delayDurationহলো যানবাহনগুলোর জন্য মোট বিলম্বের সময়। অনুরোধেTransitionAttributesব্যবহার করা না হলে এর মান সাধারণত শূন্য হয়। -
breakDurationহলো যানবাহনগুলো তাদের পথ সম্পূর্ণ করার সময় বিরতিতে যে মোট সময় ব্যয় করে। -
visitDurationহলো যানবাহনগুলো তাদের রুট সম্পন্ন করার সময় পরিদর্শনে যে মোট সময় ব্যয় করে। এটি মূলত প্রযোজ্য যানবাহনের জন্য নির্ধারিতVisitসাথে সম্পর্কিতVisitRequestগুলোর সমস্তVisitRequest.durationমানের সমষ্টি। -
totalDurationহলো যানবাহনগুলোর রুট সম্পন্ন করতে প্রয়োজনীয় মোট সময়কাল। -
travelDistanceMetersহলো যানবাহনগুলোর তাদের নির্ধারিত পথ সম্পন্ন করতে অতিক্রান্ত মোট দূরত্ব। -
maxLoads, যানবাহনগুলোর রুটের যেকোনো পয়েন্টে তাদের বহন করা সর্বোচ্চ লোডের পরিমাণের সাথে লোডের প্রকারভেদগুলোকে সংযুক্ত করে।
একটি Metrics বার্তার উদাহরণ দেখতে এইরকম:
{
"routes": [
...
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}
সম্পূর্ণ উদাহরণ
Construct a Request থেকে করা অনুরোধের একটি সম্পূর্ণ নমুনা প্রতিক্রিয়া দেখতে এইরকম:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
{
"startTime": "2024-02-13T00:19:31Z",
"detour": "0s"
}
],
"transitions": [
{
"travelDuration": "0s",
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1151s",
"travelDistanceMeters": 9599,
"waitDuration": "0s",
"totalDuration": "1151s",
"startTime": "2024-02-13T00:19:31Z"
}
],
"metrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"routeCosts": {
"model.vehicles.cost_per_kilometer": 18.603
},
"routeTotalCost": 18.603
}
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}