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