คู่มือนี้แสดงให้เห็นว่าจำนวนยานพาหนะที่มีให้ในโซลูชันการเพิ่มประสิทธิภาพเส้นทางอาจแตกต่างกันไปตามพารามิเตอร์คำขอ
Route Optimization API ไม่เพียงเพิ่มประสิทธิภาพให้คำสั่งซื้อที่เสร็จสมบูรณ์ของการจัดส่ง แต่ยังกำหนดการจัดส่งเหล่านั้นให้กับยานพาหนะเพื่อเพิ่มประสิทธิภาพต้นทุนภายใต้ข้อจำกัดที่คุณจัดการด้วย
ในตัวอย่างแรก จำนวนยานพาหนะตรงกับจำนวนการจัดส่ง โดยยานพาหนะทุกคันแชร์พร็อพเพอร์ตี้ค่าใช้จ่ายและสถานที่ตั้งเดียวกัน ยานพาหนะแต่ละคันมีค่าใช้จ่ายต่อเวลาทำงานและระยะทางต่อระยะทาง 1 กิโลเมตร ซึ่งจะช่วยลดเวลาในการเดินทางและระยะทาง ลูกค้ารายหนึ่งอาจกำหนดให้จัดส่งยานพาหนะหลายคัน แต่คำตอบตัวอย่างแสดงโซลูชันที่มีค่าใช้จ่ายน้อยที่สุดเมื่อพิจารณาจากพารามิเตอร์รูปแบบต้นทุนที่ระบุ
ดูตัวอย่างคำขอที่มียานพาหนะหลายคัน
{ "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" } ], "penaltyCost": 100.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 5.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 50.0 } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 50.0, "costPerKilometer": 10.0 }, { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 50.0, "costPerKilometer": 10.0 }, { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 50.0, "costPerKilometer": 10.0 } ] } }
ดูการตอบกลับคำขอที่มียานพาหนะหลายคัน
{ "routes": [ { "vehicleStartTime": "2023-01-14T00:00:00Z", "vehicleEndTime": "2023-01-14T00:28:22Z", "visits": [ { "isPickup": true, "startTime": "2023-01-14T00:00:00Z", "detour": "0s" }, { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-14T00:02:30Z", "detour": "150s" }, { "startTime": "2023-01-14T00:08:55Z", "detour": "150s" }, { "shipmentIndex": 2, "startTime": "2023-01-14T00:21:21Z", "detour": "572s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:00:00Z" }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:02:30Z" }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-14T00:05:00Z" }, { "travelDuration": "496s", "travelDistanceMeters": 1893, "waitDuration": "0s", "totalDuration": "496s", "startTime": "2023-01-14T00:13:05Z" }, { "travelDuration": "171s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "171s", "startTime": "2023-01-14T00:25:31Z" } ], "metrics": { "performedShipmentCount": 2, "travelDuration": "902s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "800s", "totalDuration": "1702s", "travelDistanceMeters": 3353 }, "routeCosts": { "model.vehicles.cost_per_kilometer": 33.53, "model.vehicles.cost_per_hour": 23.638888888888889 }, "routeTotalCost": 57.168888888888887 }, { "vehicleIndex": 1 }, { "vehicleIndex": 2 } ], "skippedShipments": [ { "index": 1 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 2, "travelDuration": "902s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "800s", "totalDuration": "1702s", "travelDistanceMeters": 3353 }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-14T00:00:00Z", "latestVehicleEndTime": "2023-01-14T00:28:22Z", "totalCost": 62.168888888888887, "costs": { "model.vehicles.cost_per_hour": 23.638888888888889, "model.shipments.penalty_cost": 5, "model.vehicles.cost_per_kilometer": 33.53 } } }
เครื่องมือแก้โจทย์จะกำหนดการจัดส่งทั้งหมดให้กับยานพาหนะเพียง 1 คัน โดยข้ามการจัดส่ง 1 คัน
แม้จะมียานพาหนะจำนวนมากก็ตาม เนื่องจากค่าใช้จ่ายในการดำเนินงานยานพาหนะเพิ่มเติมนั้นสูงเกินกว่าที่จะอธิบายได้ และจะไม่ประหยัดค่าใช้จ่ายสำหรับยานพาหนะทุกประเภทในการจัดส่งแบบข้ามเนื่องจากค่าปรับต่ำ
แม้จะมีความจุของยานพาหนะ แต่ยานพาหนะ 1 คันสามารถดำเนินการจัดส่งที่กำหนดไว้ทั้งหมดได้อย่างคุ้มค่ามากที่สุด รถในคำขอไม่ได้ตั้งค่าพร็อพเพอร์ตี้ usedIfRouteIsEmpty
ไว้ (โปรดดูรายละเอียดในเอกสารประกอบข้อความ Vehicle
(REST, gRPC)) ดังนั้นจึงไม่มีค่าใช้จ่ายหากไม่ได้ใช้
การเปลี่ยนพารามิเตอร์ต้นทุนเพื่อจัดลําดับความสําคัญของโซลูชันที่สั้นลงทั่วโลกแทนเส้นทางยานพาหนะที่สั้นลงต่อกันจะทำให้มียานพาหนะเข้าร่วมโซลูชันมากขึ้น คำขอตัวอย่างถัดไปจะแทนที่ Vehicle.costPerHour
ด้วย ShipmentModel.globalDurationCostPerHour
ส่วนกลาง โดยให้ความสําคัญกับโซลูชันที่มีเวลารวมน้อยกว่าเวลาใช้งานสำหรับยานพาหนะหนึ่งๆ นอกจากนี้ ค่าปรับสำหรับ shipment[1]
จะเพิ่มขึ้นด้วยเพื่อลดความเสี่ยงที่จะถูกข้าม
ดูตัวอย่างคำขอที่ใช้ globalDurationCostPerHour
{ "model": { "globalStartTime": "2023-01-13T16:00:00-08:00", "globalEndTime": "2023-01-14T16:00:00-08:00", "globalDurationCostPerHour": 150.0, "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 100.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 75.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 50.0 } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerKilometer": 10.0 }, { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerKilometer": 10.0 }, { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerKilometer": 10.0 } ] } }
ผลลัพธ์แสดงให้เห็นว่าการใช้พารามิเตอร์ต้นทุนต่อชั่วโมงทั่วโลกจะส่งผลให้มีการใช้ยานพาหนะทั้ง 3 คัน แทนที่จะเป็นเพียงคันเดียว
ดูการตอบกลับคำขอโดยใช้ globalDurationCostPerHour
{ "routes": [ { "vehicleStartTime": "2023-01-14T00:00:00Z", "vehicleEndTime": "2023-01-14T00:16:20Z", "visits": [ { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-14T00:00:00Z", "detour": "0s" }, { "shipmentIndex": 2, "startTime": "2023-01-14T00:09:19Z", "detour": "0s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:00:00Z" }, { "travelDuration": "409s", "travelDistanceMeters": 1371, "waitDuration": "0s", "totalDuration": "409s", "startTime": "2023-01-14T00:02:30Z" }, { "travelDuration": "171s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "171s", "startTime": "2023-01-14T00:13:29Z" } ], "metrics": { "performedShipmentCount": 1, "travelDuration": "580s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "400s", "totalDuration": "980s", "travelDistanceMeters": 2036 }, "routeCosts": { "model.vehicles.cost_per_kilometer": 20.36 }, "routeTotalCost": 20.36 }, { "vehicleIndex": 1, "vehicleStartTime": "2023-01-14T00:00:00Z", "vehicleEndTime": "2023-01-14T00:18:54Z", "visits": [ { "shipmentIndex": 1, "isPickup": true, "startTime": "2023-01-14T00:00:00Z", "detour": "0s" }, { "shipmentIndex": 1, "startTime": "2023-01-14T00:08:24Z", "detour": "0s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:00:00Z" }, { "travelDuration": "354s", "travelDistanceMeters": 1192, "waitDuration": "0s", "totalDuration": "354s", "startTime": "2023-01-14T00:02:30Z" }, { "travelDuration": "380s", "travelDistanceMeters": 1190, "waitDuration": "0s", "totalDuration": "380s", "startTime": "2023-01-14T00:12:34Z" } ], "metrics": { "performedShipmentCount": 1, "travelDuration": "734s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "400s", "totalDuration": "1134s", "travelDistanceMeters": 2382 }, "routeCosts": { "model.vehicles.cost_per_kilometer": 23.82 }, "routeTotalCost": 23.82 }, { "vehicleIndex": 2, "vehicleStartTime": "2023-01-14T00:00:00Z", "vehicleEndTime": "2023-01-14T00:16:14Z", "visits": [ { "isPickup": true, "startTime": "2023-01-14T00:00:00Z", "detour": "0s" }, { "startTime": "2023-01-14T00:06:25Z", "detour": "0s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:00:00Z" }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-14T00:02:30Z" }, { "travelDuration": "339s", "travelDistanceMeters": 1276, "waitDuration": "0s", "totalDuration": "339s", "startTime": "2023-01-14T00:10:35Z" } ], "metrics": { "performedShipmentCount": 1, "travelDuration": "574s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "400s", "totalDuration": "974s", "travelDistanceMeters": 2071 }, "routeCosts": { "model.vehicles.cost_per_kilometer": 20.71 }, "routeTotalCost": 20.71 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 3, "travelDuration": "1888s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "3088s", "travelDistanceMeters": 6489 }, "usedVehicleCount": 3, "earliestVehicleStartTime": "2023-01-14T00:00:00Z", "latestVehicleEndTime": "2023-01-14T00:18:54Z", "totalCost": 112.14, "costs": { "model.vehicles.cost_per_kilometer": 64.89, "model.global_duration_cost_per_hour": 47.25 } } }
ในการตอบกลับนี้ จะมีการใช้ยานพาหนะทั้ง 3 คัน (ต่อ metrics.usedVehicleCount
) โดยยานพาหนะแต่ละคันจะได้รับการจัดส่ง 1 คันเพื่อดำเนินการให้เสร็จสมบูรณ์ หากมีสถานที่เริ่มต้น ตำแหน่งจุดหมาย และ costPerKilometer
เหมือนกัน รถทั้ง 3 คันจะใช้สลับสับเปลี่ยนกันได้อย่างมีประสิทธิภาพ ไม่ว่าจะกำหนดการจัดส่งให้กับยานพาหนะใด
globalDurationCostPerHour
ทำให้เครื่องมือเพิ่มประสิทธิภาพพบวิธีแก้ปัญหาที่สั้นกว่า ความแตกต่างระหว่าง earliestVehicleStartTime
กับ latestVehicleEndTime
คือ 18 นาที 54 วินาทีเท่านั้น เมื่อเทียบกับคำตอบก่อนหน้า 28 นาทีกับ 22 วินาที อย่างไรก็ตาม metrics.costs.model.vehicles.cost_per_kilometer
ได้เพิ่มขึ้น ซึ่งแสดงถึงระยะทางในการเดินทางรวมที่มากขึ้นจากยานพาหนะที่ใช้ทั้ง 3 คัน ซึ่งสาธิตวิธีหนึ่งที่รูปแบบต้นทุนจะช่วยให้คุณทำข้อดีข้อเสียได้ ดังนี้
- ต้นทุนด้านเวลาทั่วโลกที่เพิ่มขึ้น: เพิ่มการใช้ยานพาหนะเพื่อลดเวลาเสร็จสมบูรณ์โดยรวม โดยใช้ต้นทุนสำหรับระยะทางและเวลาในการขนส่งยานพาหนะที่เพิ่มขึ้น
- ค่าเสียเวลาของยานพาหนะที่เพิ่มขึ้น: ลดการใช้ยานพาหนะและเวลาที่ใช้ในการขนส่ง โดยใช้ต้นทุนสำหรับโซลูชันโดยรวมที่นานขึ้น
โปรดทราบว่าค่า globalDurationCostPerHour
ของ 150.0 ในตัวอย่างนี้กำหนดไว้ 3 เท่าของ costPerHour
ของยานพาหนะแต่ละคันที่ 50.0 จากตัวอย่างก่อนหน้านี้ มูลค่าต้นทุนทั่วโลกนี้คาดหวังไว้อย่างดีว่ายานพาหนะทั้ง 3 คันจะทำงานพร้อมกันได้ แต่ในสถานการณ์จริง สมมติฐานเช่นนี้อาจไม่ได้สะท้อนถึงความเป็นจริงและอาจส่งผลเสียต่อคุณภาพของผลลัพธ์
ตามที่อธิบายไว้ในพารามิเตอร์โมเดลต้นทุน พารามิเตอร์ต้นทุนทั้งหมดแสดงในหน่วยที่ไม่มีมิติข้อมูลเดียวกันแต่อาจมีความหมายต่างกันมาก โดยทั่วไป ค่าพารามิเตอร์ของโมเดลค่าใช้จ่ายควรเป็นไปตามความเป็นจริงมากที่สุด เนื่องจากต้นทุนปลอมเช่นในตัวอย่างนี้อาจทำให้ API เพิ่มประสิทธิภาพสำหรับวัตถุประสงค์ที่ไม่ตรงกับความตั้งใจของคุณ