คู่มือนี้แสดงให้เห็นว่าจำนวนยานพาหนะที่ระบุไว้ในโซลูชันการเพิ่มประสิทธิภาพเส้นทางอาจแตกต่างกันไปตามพารามิเตอร์คำขอ
Route Optimization API ไม่เพียงเพิ่มประสิทธิภาพลําดับความเสร็จสมบูรณ์ของการจัดส่งเท่านั้น แต่ยังกําหนดการจัดส่งเหล่านั้นให้กับยานพาหนะเพื่อเพิ่มประสิทธิภาพต้นทุนภายใต้ข้อจํากัดที่คุณจัดการ
ในตัวอย่างแรก จำนวนยานพาหนะตรงกับจำนวนการจัดส่ง โดยมียานพาหนะทั้งหมดใช้พร็อพเพอร์ตี้ต้นทุนและสถานที่ตั้งเดียวกัน ยานพาหนะแต่ละคันจะมีต้นทุนต่อชั่วโมงที่ใช้งานและต้นทุนต่อกิโลเมตรที่เดินทาง ซึ่งจะช่วยลดความถี่และระยะทางในการเดินทาง คุณอาจคาดหวังว่าจะมียานพาหนะหลายคันที่กําหนดให้จัดส่ง แต่คําตอบตัวอย่างแสดงโซลูชันที่มีต้นทุนต่ำที่สุดโดยพิจารณาจากพารามิเตอร์รูปแบบต้นทุนที่ระบุ
ดูตัวอย่างคำขอที่มียานพาหนะหลายคัน
{ "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 รายการแม้ว่าจะมียานพาหนะเพียงพอ เนื่องจากค่าใช้จ่ายในการใช้งานยานพาหนะเพิ่มเติมสูงเกินกว่าที่จะสมเหตุสมผล และการนำยานพาหนะใดก็ตามไปดำเนินการจัดส่งที่ข้ามไปนั้นไม่คุ้มค่าเนื่องจากมีค่าใช้จ่ายในการดําเนินการต่ำ
แม้จะมีกำลังการผลิตของยานพาหนะ แต่ยานพาหนะคันเดียวสามารถดำเนินการจัดส่งทั้งหมดที่ได้รับมอบหมายในลักษณะที่คุ้มค่าที่สุด ยานพาหนะในคำขอไม่มีการตั้งค่าพร็อพเพอร์ตี้ 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 เพิ่มประสิทธิภาพเพื่อวัตถุประสงค์ที่ไม่ตรงกับความต้องการของคุณ