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