สถานการณ์นี้จะเพิ่มประสิทธิภาพลำดับจุดจอดที่กำหนดให้กับยานพาหนะโดยใช้พารามิเตอร์ต้นทุนอย่างง่าย นี่คือโหมดการทำงานของการเพิ่มประสิทธิภาพเส้นทางที่ง่ายที่สุด และ ช่วยให้มั่นใจได้ว่าระบบจะเข้าชมจุดจอดทั้งหมดภายในกรอบเวลาที่ระบุ
ตัวอย่างต่อไปนี้แสดงสถานการณ์พื้นฐานที่มีรถ 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
ที่กำหนดไว้เพื่อให้เครื่องมือเพิ่มประสิทธิภาพค้นหาเส้นทางที่เหมาะสมที่สุด (แทนที่จะค้นหาเส้นทางที่เป็นไปได้)