สถานการณ์นี้จะเพิ่มประสิทธิภาพลำดับการแวะพักที่กำหนดให้กับยานพาหนะโดยใช้พารามิเตอร์ต้นทุนอย่างง่าย นี่คือโหมดการทำงานของการเพิ่มประสิทธิภาพเส้นทางที่ง่ายที่สุด และ ช่วยให้มั่นใจได้ว่าระบบจะเข้าชมจุดจอดทั้งหมดภายในกรอบเวลาที่ระบุ
ตัวอย่างต่อไปนี้แสดงสถานการณ์พื้นฐานที่มีรถ 1 คันและพัสดุ 3 รายการ ซึ่งทั้งหมดมีต้นทางจากสถานที่เดียวที่เรียกว่าคลังสินค้า
ดูตัวอย่างคำขอ
{ "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 ที่พิมพ์ได้ คุณสามารถใช้
เครื่องมือเข้ารหัส Polyline แบบอินเทอร์แอกทีฟเพื่อแสดงภาพเส้นทางที่คำนวณโดย
การเพิ่มประสิทธิภาพเส้นทาง ตัวอย่างในคู่มือนี้ตั้งค่า populatePolylines และ
populateTransitionPolylines เป็นจริง แต่คู่มืออื่นๆ ตั้งค่าเป็นเท็จเพื่อ
ลดขนาดการตอบกลับ
ดูคำอธิบายรูปแบบการเข้ารหัสได้ที่รูปแบบอัลกอริทึมของเส้นหลายเส้นที่เข้ารหัส
ข้อจำกัดด้านเวลาทั่วโลก
model.globalStartTime และ model.globalEndTime ถูกตั้งค่าเป็นระยะเวลา 24 ชั่วโมงโดยพลการ ซึ่งจะช่วยให้ตีความการประทับเวลาเอาต์พุตได้ง่ายขึ้น
ไปที่สถานที่
คำขอตัวอย่างใช้เฉพาะ model.shipments[].pickups[].arrivalLocation และ
model.shipments[].deliveries[].arrivalLocation นอกจากนี้ ยังมีพร็อพเพอร์ตี้
departureLocationสำหรับกรณีที่ยานพาหนะออกจาก
จุดที่แตกต่างจากจุดที่มาถึง เช่น อาคารจอดรถที่มีทางเข้า
ด้านหนึ่งของอาคารและทางออกอีกด้านหนึ่ง ในคำแนะนำนี้และคำแนะนำต่อๆ ไป เราจะถือว่าจุดเริ่มต้นและจุดสิ้นสุดเหมือนกัน
นอกจากนี้ ยังมีwaypointการมาถึงและการออกเดินทางเป็นทางเลือกแทน latLng ด้วย
ฟิลด์ Waypoint รองรับการใช้รหัสสถานที่ของ Google เป็นทางเลือกแทน LatLng
และยังระบุส่วนหัวของยานพาหนะได้ด้วย ดูรายละเอียดเพิ่มเติมได้ในเอกสารอ้างอิง
(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 ระดับบนสุดซึ่ง
แสดงเส้นทางที่เสนอ โดยมี 1 เส้นทางต่อยานพาหนะ 1 คัน เนื่องจากคำขอตัวอย่าง
ในคู่มือนี้ระบุยานพาหนะเพียงคันเดียว routes จึงมีข้อความ ShipmentRoute 1 รายการ
ที่พัก ShipmentRoute แห่ง
พร็อพเพอร์ตี้ 2 รายการที่สำคัญที่สุดสำหรับ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 จะมี transitions มากกว่า visits เสมอ เนื่องจาก
ยานพาหนะต้องเดินทางจากตำแหน่งเริ่มต้นไปยังจุดแรกที่เข้าชมในช่วงต้น
ของเส้นทาง และจากจุดสุดท้ายที่เข้าชมไปยังตำแหน่งสิ้นสุดในช่วงท้าย
ของเส้นทาง หากยานพาหนะไม่มีตำแหน่งเริ่มต้นหรือตำแหน่งสิ้นสุด ก็จะยังมีtransitionsมากกว่าvisitsอยู่ 1 รายการ เนื่องจากระบบจะใช้ตำแหน่งของการเข้าชมครั้งแรกหรือครั้งสุดท้ายเป็นตำแหน่งเริ่มต้นหรือตำแหน่งสิ้นสุดของยานพาหนะตามลำดับ
ในตัวอย่างนี้ การเข้าชมการรับสินค้า 3 ครั้งแรกมีการเปลี่ยนผ่านระหว่างกัน โดยมีระยะทางและระยะเวลาเป็น 0 เนื่องจาก การรับสินค้าทั้ง 3 ครั้งใช้สถานที่เดียวกันในคำขอ
ดูรายละเอียดเพิ่มเติมได้ในShipmentRouteเอกสารอ้างอิง (REST, gRPC)
การเพิ่มประสิทธิภาพลำดับจุดอ้างอิงอย่างง่าย
ดังที่ตัวอย่างนี้แสดงให้เห็น โมเดลการเพิ่มประสิทธิภาพเส้นทางจะถือว่าการเข้าชมเป็นพร็อพเพอร์ตี้ของการจัดส่ง และไม่มีแนวคิดเกี่ยวกับจุดแวะพักหรือจุดจอดในฐานะเอนทิตีอิสระ อย่างไรก็ตาม คุณสามารถแสดงจุดแวะพักหรือจุดอ้างอิงเป็นการจัดส่ง
ที่มี VisitRequest เพียง 1 รายการเป็นจุดรับหรือนำส่ง ยานพาหนะยังคงต้อง
ได้รับมอบหมาย costPerHour หรือ costPerKilometer เพื่อให้เครื่องมือเพิ่มประสิทธิภาพค้นหา
เส้นทางที่เหมาะสมที่สุด (แทนที่จะค้นหาเส้นทางที่เป็นไปได้)