এই পরিস্থিতিটি সহজ খরচ পরামিতি সহ একটি যানবাহনের জন্য নির্ধারিত স্টপের ক্রমকে অপ্টিমাইজ করে। এটি রুট অপ্টিমাইজেশন অপারেশনের সবচেয়ে সহজ পদ্ধতি, এবং নিশ্চিত করে যে সমস্ত স্টপ নির্দিষ্ট সময়সীমার মধ্যে পরিদর্শন করা হয়েছে।
নিচের উদাহরণটি একটি মৌলিক দৃশ্যপট তুলে ধরে যেখানে একটি গাড়ি এবং তিনটি চালান পাঠানো হয়, যার সবকটিই ডিপো নামক একটি একক স্থান থেকে উৎপন্ন হয়।
একটি নমুনা অনুরোধ দেখুন
{ "populatePolylines": true, "populateTransitionPolylines": true, "model": { "globalStartTime": "2023-01-13T16:00:00-08:00", "globalEndTime": "2023-01-14T16:00:00-08:00", "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ] }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ] }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ] } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerKilometer": 10.0, "costPerHour": 40.0 } ] } }
রুট অপ্টিমাইজেশন অনুরোধ ক্ষেত্র
ওভারভিউতে উল্লেখ করা হয়েছে, সবচেয়ে গুরুত্বপূর্ণ রুট অপ্টিমাইজেশন অনুরোধ বৈশিষ্ট্য হল vehicles এবং shipments ।
যানবাহন এবং চালান ছাড়াও, অনুরোধে নিম্নলিখিত ক্ষেত্রগুলি অন্তর্ভুক্ত রয়েছে:
পলিলাইন
populatePolylines এবং populateTransitionPolylines নির্দিষ্ট করে যে Route Optimization পলিলাইন ফিরিয়ে দেবে কিনা।
এই পরিষেবাটি Maps JS পলিলাইন কোডেক ব্যবহার করে পলিলাইন এনকোড করে, যা প্রিন্টযোগ্য ASCII অক্ষর ব্যবহার করে বাইনারি পলিলাইন ডেটা উপস্থাপন করে। আপনি Route Optimization দ্বারা গণনা করা পাথগুলি কল্পনা করতে ইন্টারেক্টিভ পলিলাইন এনকোডার ইউটিলিটি ব্যবহার করতে পারেন। এই নির্দেশিকার উদাহরণটি populatePolylines এবং populateTransitionPolylines কে true তে সেট করে কিন্তু অন্যান্য নির্দেশিকা প্রতিক্রিয়ার আকার কমাতে তাদের false তে সেট করে।
এনকোডিং ফর্ম্যাটের বর্ণনার জন্য এনকোডেড পলিলাইন অ্যালগরিদম ফর্ম্যাট দেখুন।
বিশ্বব্যাপী সময়ের সীমাবদ্ধতা
model.globalStartTime এবং model.globalEndTime একটি নির্বিচারে 24 ঘন্টা সময়কালে সেট করা আছে। এর ফলে আউটপুট টাইমস্ট্যাম্পগুলি ব্যাখ্যা করা সহজ হয়।
অবস্থানগুলি দেখুন
উদাহরণ অনুরোধে শুধুমাত্র model.shipments[].pickups[].arrivalLocation এবং model.shipments[].deliveries[].arrivalLocation ব্যবহার করা হয়েছে। এমন পরিস্থিতিতে departureLocation বৈশিষ্ট্যও রয়েছে যেখানে গাড়িটি যেখানে পৌঁছায় তার থেকে ভিন্ন বিন্দু থেকে ছেড়ে যায়, যেমন একটি পার্কিং কমপ্লেক্স যেখানে ভবনের একপাশে প্রবেশপথ এবং অন্য দিকে প্রস্থান পথ রয়েছে। এই এবং পরবর্তী নির্দেশিকাগুলিতে, আগমন এবং প্রস্থান বিন্দু একই বলে ধরে নেওয়া হয়েছে।
latLng এর বিকল্প হিসেবে আগমন এবং প্রস্থানের waypoint বিদ্যমান। Waypoint ক্ষেত্রগুলি LatLng এর বিকল্প হিসেবে Google Place ID ব্যবহার করে সমর্থন করে এবং যানবাহনের শিরোনামও নির্দিষ্ট করতে পারে। আরও বিস্তারিত জানার জন্য রেফারেন্স ডকুমেন্টেশন ( REST , gRPC ) দেখুন।
উদাহরণে সীমাবদ্ধতা
এই পরিস্থিতি অপ্টিমাইজারকে বিভিন্ন উপায়ে সীমাবদ্ধ করে:
- সমস্ত কার্যকলাপ বিশ্বব্যাপী শুরু এবং শেষ সময়ের মধ্যে সম্পন্ন করতে হবে । এই পরিস্থিতিতে, চালানের কাছাকাছি অবস্থান এবং বিস্তৃত বিশ্বব্যাপী সময় জানালার কারণে শুরু এবং শেষের সময়গুলি খুবই শিথিল সীমাবদ্ধতা।
- সমস্ত চালান সম্পন্ন করতে হবে । যখন
shipmentsউপর জরিমানা খরচ নির্দিষ্ট করা হয় না তখন এটি ডিফল্ট আচরণ। - গাড়িতে
costPerKilometerএবংcostPerHourনির্ধারণ করা আছে।
খরচ মডেল প্যারামিটারে খরচগুলি উল্লেখ করা হয়েছে।
রুট অপ্টিমাইজেশন প্রতিক্রিয়া বৈশিষ্ট্য
নমুনা অনুরোধের একটি প্রতিক্রিয়া দেখুন
{ "routes": [ { "vehicleStartTime": "2023-01-14T00:00:00Z", "vehicleEndTime": "2023-01-14T00:36:41Z", "visits": [ { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-14T00:00:00Z", "detour": "0s" }, { "shipmentIndex": 1, "isPickup": true, "startTime": "2023-01-14T00:02:30Z", "detour": "150s" }, { "isPickup": true, "startTime": "2023-01-14T00:05:00Z", "detour": "300s" }, { "startTime": "2023-01-14T00:11:25Z", "detour": "0s" }, { "shipmentIndex": 1, "startTime": "2023-01-14T00:19:29Z", "detour": "503s" }, { "shipmentIndex": 2, "startTime": "2023-01-14T00:29:02Z", "detour": "1324s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:00:00Z", "routePolyline": {} }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:02:30Z", "routePolyline": {} }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:05:00Z", "routePolyline": {} }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-14T00:07:30Z", "routePolyline": { "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@" } }, { "travelDuration": "234s", "travelDistanceMeters": 793, "waitDuration": "0s", "totalDuration": "234s", "startTime": "2023-01-14T00:15:35Z", "routePolyline": { "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@" } }, { "travelDuration": "323s", "travelDistanceMeters": 1204, "waitDuration": "0s", "totalDuration": "323s", "startTime": "2023-01-14T00:23:39Z", "routePolyline": { "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@" } }, { "travelDuration": "209s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "209s", "startTime": "2023-01-14T00:33:12Z", "routePolyline": { "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A" } } ], "routePolyline": { "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@RWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@STY@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A" }, "metrics": { "performedShipmentCount": 3, "travelDuration": "1001s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2201s", "travelDistanceMeters": 3457 }, "travelSteps": [ { "duration": "0s", "routePolyline": {} }, { "duration": "0s", "routePolyline": {} }, { "duration": "0s", "routePolyline": {} }, { "duration": "227s", "distanceMeters": 794, "routePolyline": { "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@" } }, { "duration": "233s", "distanceMeters": 791, "routePolyline": { "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@" } }, { "duration": "322s", "distanceMeters": 1205, "routePolyline": { "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@" } }, { "duration": "208s", "distanceMeters": 666, "routePolyline": { "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A" } } ], "vehicleDetour": "2201s", "routeCosts": { "model.vehicles.cost_per_hour": 24.455555555555556, "model.vehicles.cost_per_kilometer": 34.57 }, "routeTotalCost": 59.025555555555556 } ], "totalCost": 59.025555555555556, "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 3, "travelDuration": "1001s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2201s", "travelDistanceMeters": 3457 }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-14T00:00:00Z", "latestVehicleEndTime": "2023-01-14T00:36:41Z", "totalCost": 59.025555555555556, "costs": { "model.vehicles.cost_per_kilometer": 34.57, "model.vehicles.cost_per_hour": 24.455555555555556 } } }
রুট অপ্টিমাইজেশন প্রতিক্রিয়ায় একটি শীর্ষ-স্তরের routes ক্ষেত্র অন্তর্ভুক্ত থাকে যা প্রস্তাবিত রুটগুলিকে প্রতিনিধিত্ব করে, প্রতিটি যানবাহনের জন্য একটি রুট সহ। যেহেতু এই নির্দেশিকায় উদাহরণ অনুরোধে শুধুমাত্র একটি যানবাহন উল্লেখ করা হয়েছে, routes একটি ShipmentRoute বার্তা অন্তর্ভুক্ত থাকে।
ShipmentRoute বৈশিষ্ট্য
ShipmentRoute মেসেজ টাইপের জন্য দুটি সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্য হল visits এবং transitions ।
প্রতিটি Visit হল অনুরোধ বার্তার VisitRequest থেকে একটি পিকআপ বা ডেলিভারির সমাপ্তি। একটি ভিজিট হল কার্যকরভাবে কোনও স্থান এবং সময়ে একটি যানবাহন দ্বারা সম্পন্ন করার জন্য নির্ধারিত কাজ।
প্রতিটি Transition এক স্থান থেকে অন্য স্থানে ভ্রমণকারী যানবাহনকে প্রতিনিধিত্ব করে। যানবাহনের শুরুর বিন্দু, ভ্রমণের স্থান এবং গাড়ির শেষ বিন্দুর মধ্যে পরিবর্তন ঘটতে পারে।
গাড়ির সম্পূর্ণ রুট পুনর্গঠনের জন্য ShipmentRoute এর visits এবং transitions একত্রিত করতে হবে। গাড়ির কার্যকলাপের অগ্রগতিতে ক্ষেত্রগুলির সংমিশ্রণটি নিম্নরূপ দেখায়:
request.vehicles[0].startLocation -> transitions[0] -> visits[0] ->
transitions[1] -> visits[1] -> transitions[2] -> ... -> visits[3] ->
transitions[4] -> request.vehicles[0].endLocation
একটি ShipmentRoute সর্বদা visits চেয়ে একটি transitions বেশি থাকে, কারণ গাড়িটিকে রুটের শুরুতে তার শুরুর স্থান থেকে প্রথম ভিজিটে এবং রুটের শেষে তার শেষ ভিজিট থেকে শেষ অবস্থানে যেতে হবে। যদি গাড়ির কোনও শুরু বা শেষ অবস্থান না থাকে, তবে visits চেয়ে আরও একটি transitions বেশি থাকবে কারণ প্রথম বা শেষ ভিজিটের অবস্থান যথাক্রমে গাড়ির শুরু বা শেষ অবস্থান হিসাবে ব্যবহৃত হয়।
এই উদাহরণে, প্রথম তিনটি পিকআপ ভিজিটের মধ্যে শূন্য দূরত্ব এবং সময়কাল সহ ট্রানজিশন রয়েছে কারণ তিনটি পিকআপই অনুরোধে একই অবস্থান ভাগ করে নেয়।
আরও বিস্তারিত জানার জন্য ShipmentRoute রেফারেন্স ডকুমেন্টেশন ( REST , gRPC ) দেখুন।
সহজ ওয়েপয়েন্ট অর্ডার অপ্টিমাইজেশন
এই উদাহরণ থেকে বোঝা যায়, রুট অপ্টিমাইজেশন মডেল ভিজিটকে শিপমেন্টের বৈশিষ্ট্য হিসেবে বিবেচনা করে এবং ওয়েপয়েন্ট বা স্টপের কোনও স্বাধীন সত্তা হিসেবে ধারণা রাখে না। তবে, পিকআপ বা ডেলিভারি হিসেবে ঠিক একটি VisitRequest ব্যবহার করে শিপমেন্ট হিসেবে স্টপ বা ওয়েপয়েন্টকে উপস্থাপন করা সম্ভব। অপ্টিমাইজারকে সর্বোত্তম রুট খুঁজে বের করার জন্য গাড়িটিকে এখনও একটি costPerHour বা costPerKilometer বরাদ্দ করতে হবে (কোনও সম্ভাব্য রুট খুঁজে বের করার বিপরীতে)।