คู่มือนี้จะอธิบาย loadDemands
และ loadLimits
รวมถึงความสัมพันธ์ระหว่างกัน
ดังที่ได้กล่าวไว้ในข้อจำกัดของกรอบเวลาการรับและนำส่ง ข้อความ OptimizeToursRequest
(REST, gRPC) มีพารามิเตอร์หลายรายการที่ระบุข้อจำกัดของปัญหาที่จะเพิ่มประสิทธิภาพ พร็อพเพอร์ตี้ OptimizeToursRequest
หลายรายการแสดงข้อจำกัดการโหลด
ยานพาหนะและการจัดส่งมีคุณสมบัติทางกายภาพที่ต้องพิจารณาเมื่อวางแผนเส้นทาง
- ยานพาหนะ: พร็อพเพอร์ตี้
loadLimits
จะระบุน้ำหนักบรรทุกสูงสุดที่ยานพาหนะรับได้ ดูเอกสารประกอบของข้อความVehicle
(REST, gRPC) - การจัดส่ง: พร็อพเพอร์ตี้
loadDemands
จะระบุปริมาณการโหลดที่การจัดส่งหนึ่งๆ ใช้ ดูเอกสารประกอบของข้อความShipment
(REST, gRPC)
ข้อจำกัดทั้ง 2 ข้อนี้ช่วยให้เครื่องมือเพิ่มประสิทธิภาพสามารถกำหนดการจัดส่งให้กับยานพาหนะได้อย่างเหมาะสมในลักษณะที่ตรงกับกำลังการผลิตของยานพาหนะและดีมานด์การจัดส่งของคุณมากที่สุด
ส่วนที่เหลือของเอกสารนี้จะอธิบาย loadLimits
และ loadDemands
อย่างละเอียด
ความต้องการและขีดจํากัดของโหลด: ประเภท
คุณแสดงดีมานด์การโหลดและข้อจำกัดการจำกัดแต่ละรายการเป็นประเภท
คุณสามารถระบุชุดประเภทการโหลดของคุณเองได้ เช่น ตัวอย่างต่อไปนี้
- น้ำหนัก
- ระดับเสียง
- การวัดเชิงเส้น
- ชื่อของสินค้าหรืออุปกรณ์ที่ขนส่ง
คู่มือนี้ใช้ weightKg
เป็นประเภทตัวอย่าง
ทั้ง Shipment.loadDemands
และ Vehicle.loadLimits
ใช้ Protocol Buffers
map
โดยมีคีย์ string
ที่แสดงถึงประเภทของการโหลด
ค่า Shipment.loadDemands
ใช้ข้อความ Load
(REST, gRPC)
ข้อความ Load
มีพร็อพเพอร์ตี้ amount
รายการเดียวซึ่งแสดงถึงปริมาณความจุที่จําเป็นในการนำส่งให้เสร็จสมบูรณ์ในประเภทที่ระบุ
ค่า Vehicle.loadLimits
ใช้ข้อความ LoadLimit
(REST,
gRPC) ข้อความ LoadLimit
มีพร็อพเพอร์ตี้หลายรายการ โดย maxLoad
จะแสดงถึงน้ำหนักบรรทุกสูงสุดของยานพาหนะในประเภทที่ระบุ
loadDemands
ของการจัดส่งจะใช้ loadLimits
ของยานพาหนะที่กําหนดไว้ก็ต่อเมื่อทั้ง 2 รายการมีคีย์ประเภทการโหลดที่ตรงกัน เช่น การจัดส่งที่มี loadDemands
รายการต่อไปนี้
"loadDemands": {
"weightKg": {
"amount": 50
}
}
ต้องใช้หน่วยน้ำหนักบรรทุก 50 หน่วยในประเภท weightKg
เพื่อให้การจัดส่งเสร็จสมบูรณ์ ยานพาหนะที่มี loadLimits
รายการต่อไปนี้
"loadLimits": {
"weightKg": {
"maxLoad": 100
}
}
อาจทำการจัดส่งให้เสร็จสมบูรณ์ได้ เนื่องจาก maxLoad
ของยานพาหนะในประเภท weightKg
มากกว่าหรือเท่ากับ loadDemands
ของการจัดส่งในประเภท weightKg
อย่างไรก็ตาม ยานพาหนะที่มีลักษณะต่อไปนี้ loadLimits
"loadLimits": {
"equipmentRackStorage": {
"maxLoad": 10
}
}
โดยนัยแล้วจะมีขีดจํากัดweightKg
ไม่จํากัดเนื่องจากไม่มีขีดจํากัดการบรรทุกweightKg
ดังนั้นยานพาหนะจึงไม่ต้องมีข้อจํากัดด้านน้ำหนักของสินค้า
การขนถ่ายระหว่างการจัดส่งกับยานพาหนะ
เมื่อยานพาหนะรับพัสดุไปส่ง loadDemand
ของพัสดุจะโอนระหว่างพัสดุกับยานพาหนะ คุณจะเห็นน้ำหนักบรรทุกของยานพาหนะในรายการ routes.transitions
ของข้อความ OptimizeToursResponse
(REST, gRPC) สำหรับยานพาหนะหนึ่งๆ ลำดับมีดังนี้
- ระบบจะกำหนดน้ำหนักบรรทุกที่จำเป็นสำหรับการจัดส่งเป็น
loadDemand
- มีการนำส่งสินค้าโดยยานพาหนะที่กําหนดไว้ และ
vehicleLoads
ของยานพาหนะจะเพิ่มขึ้นตามจํานวนloadDemand
ของการจัดส่ง การโอนนี้แสดงด้วยvisits.loadDemands
บวกในข้อความตอบกลับ - ยานพาหนะนำส่งสินค้าและ
vehicleLoads
ของยานพาหนะลดลงตามจํานวนloadDemand
ของสินค้าที่นําส่ง การโอนนี้จะแสดงด้วยvisits.loadDemands
ติดลบในข้อความตอบกลับ
vehicleLoads
ของยานพาหนะต้องไม่เกินloadLimits
ที่ระบุไว้ไม่ว่า ณ จุดใดก็ตามบนเส้นทาง
ตัวอย่างที่สมบูรณ์พร้อมดีมานด์และขีดจํากัดของการโหลด
ดูตัวอย่างคำขอที่มีความต้องการในการโหลดและขีดจำกัด
{ "populatePolylines": false, "populateTransitionPolylines": false, "model": { "globalStartTime": "2023-01-13T16:00:00Z", "globalEndTime": "2023-01-14T16:00:00Z", "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 100.0, "loadDemands": { "weightKg": { "amount": 50 } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 15.0, "loadDemands": { "weightKg": { "amount": 10 } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 50.0, "loadDemands": { "weightKg": { "amount": 80 } } } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0, "loadLimits": { "weightKg": { "maxLoad": 100 } } } ] } }
คําขอตัวอย่างมีพารามิเตอร์ที่เกี่ยวข้องกับการโหลดหลายรายการ ดังนี้
shipments[0]
มีดีมานด์การโหลด 50weightKg
shipments[1]
มีดีมานด์การโหลด 10weightKg
shipments[2]
มีดีมานด์การโหลด 80weightKg
vehicles[0]
มีขีดจํากัดการโหลด 100weightKg
ดูการตอบสนองต่อคำขอพร้อมความต้องการและขีดจำกัดของโหลด
{ "routes": [ { "vehicleStartTime": "2023-01-13T16:00:00Z", "vehicleEndTime": "2023-01-13T16:43:27Z", "visits": [ { "isPickup": true, "startTime": "2023-01-13T16:00:00Z", "detour": "0s", "loadDemands": { "weightKg": { "amount": "50" } } }, { "shipmentIndex": 1, "isPickup": true, "startTime": "2023-01-13T16:02:30Z", "detour": "150s", "loadDemands": { "weightKg": { "amount": "10" } } }, { "startTime": "2023-01-13T16:08:55Z", "detour": "150s", "loadDemands": { "weightKg": { "amount": "-50" } } }, { "shipmentIndex": 1, "startTime": "2023-01-13T16:16:37Z", "detour": "343s", "loadDemands": { "weightKg": { "amount": "-10" } } }, { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-13T16:27:07Z", "detour": "1627s", "loadDemands": { "weightKg": { "amount": "80" } } }, { "shipmentIndex": 2, "startTime": "2023-01-13T16:36:26Z", "detour": "0s", "loadDemands": { "weightKg": { "amount": "-80" } } } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T16:00:00Z", "vehicleLoads": { "weightKg": {} } }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T16:02:30Z", "vehicleLoads": { "weightKg": { "amount": "50" } } }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-13T16:05:00Z", "vehicleLoads": { "weightKg": { "amount": "60" } } }, { "travelDuration": "212s", "travelDistanceMeters": 791, "waitDuration": "0s", "totalDuration": "212s", "startTime": "2023-01-13T16:13:05Z", "vehicleLoads": { "weightKg": { "amount": "10" } } }, { "travelDuration": "380s", "travelDistanceMeters": 1190, "waitDuration": "0s", "totalDuration": "380s", "startTime": "2023-01-13T16:20:47Z", "vehicleLoads": { "weightKg": {} } }, { "travelDuration": "409s", "travelDistanceMeters": 1371, "waitDuration": "0s", "totalDuration": "409s", "startTime": "2023-01-13T16:29:37Z", "vehicleLoads": { "weightKg": { "amount": "80" } } }, { "travelDuration": "171s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "171s", "startTime": "2023-01-13T16:40:36Z", "vehicleLoads": { "weightKg": {} } } ], "metrics": { "performedShipmentCount": 3, "travelDuration": "1407s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2607s", "travelDistanceMeters": 4812, "maxLoads": { "weightKg": { "amount": "80" } } }, "routeCosts": { "model.vehicles.cost_per_kilometer": 48.12, "model.vehicles.cost_per_hour": 28.966666666666665 }, "routeTotalCost": 77.086666666666659 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 3, "travelDuration": "1407s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2607s", "travelDistanceMeters": 4812, "maxLoads": { "weightKg": { "amount": "80" } } }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-13T16:00:00Z", "latestVehicleEndTime": "2023-01-13T16:43:27Z", "totalCost": 77.086666666666659, "costs": { "model.vehicles.cost_per_hour": 28.966666666666665, "model.vehicles.cost_per_kilometer": 48.12 } } }
ข้อจำกัดการโหลดที่เพิ่มเข้ามาจะส่งผลต่อลําดับของ visits
ดังนี้
- มีผู้มารับ
shipment[0]
ไปแล้ว - มีผู้มารับ
shipment[1]
ไปแล้ว shipment[0]
ส่งแล้วshipment[1]
ส่งแล้ว- มีผู้มารับ
shipment[2]
ไปแล้ว shipment[2]
ส่งแล้ว
คำสั่งซื้อนี้แสดงว่ารถไม่สามารถนำส่งสินค้า 3 รายการพร้อมกันได้เนื่องจากloadDemands
รวมกันเกินloadLimits
ของรถ
รายการ visits
แต่ละรายการจะมีการเปลี่ยนแปลงน้ำหนักบรรทุกของยานพาหนะที่เป็นผลมาจากVisit
ที่เสร็จสมบูรณ์ ค่าการโหลดที่เป็นบวกแสดงการโหลดสินค้า ส่วนค่าลบแสดงการขนถ่ายสินค้า
รายการ transitions
แต่ละรายการรวมน้ำหนักบรรทุกของยานพาหนะทั้งหมดในช่วง Transition
ตัวอย่างเช่น transitions[2]
มีweightKg
60 ซึ่งแสดงถึงภาระรวมของ shipment[0]
และ shipment[1]
ออบเจ็กต์เมตริก routes[0].metrics
และ metrics.aggregatedRouteMetrics
มีพร็อพเพอร์ตี้ maxLoads
ค่าสำหรับประเภท weightKg
คือ 80 ซึ่งแสดงถึงส่วนของเส้นทางยานพาหนะที่ขนส่ง shipments[2]
ไปยังสถานที่นำส่ง
ข้อจำกัดขีดจำกัดการโหลดแบบไม่เข้มงวด
ข้อจำกัดน้ำหนักบรรทุกมีตัวแปรแบบบังคับและแบบไม่บังคับเช่นเดียวกับกรอบเวลาตามที่อธิบายไว้ในข้อจำกัดกรอบเวลาการรับและนำส่ง พร็อพเพอร์ตี้ maxLoad
ของข้อความ LoadLimit
แสดงข้อจำกัดที่เข้มงวด: ยานพาหนะต้องไม่บรรทุกน้ำหนักเกินค่า maxLoad
ในประเภทที่ระบุ พร็อพเพอร์ตี้ softMaxLoad
และ costPerUnitAboveSoftMax
แสดงข้อจำกัดแบบไม่บังคับ โดยหน่วยที่เกิน softMaxLoad
แต่ละหน่วยจะมีต้นทุน costPerUnitAboveSoftMax
ข้อจำกัดขีดจำกัดการโหลดแบบ Soft มีประโยชน์หลายประการ เช่น
- ปรับสมดุลการจัดส่งในยานพาหนะมากกว่าจำนวนขั้นต่ำที่จําเป็นเมื่อทําเช่นนั้นได้อย่างคุ้มค่า
- แสดงค่ากำหนดของผู้ขับขี่เกี่ยวกับจำนวนสินค้าที่รับและนำส่งได้อย่างสะดวกสบายในเส้นทางหนึ่งๆ
- การบรรทุกยานพาหนะให้ต่ำกว่าความจุสูงสุดเพื่อจำกัดการสึกหรอและลดค่าใช้จ่ายในการบำรุงรักษา
คุณใช้ข้อจำกัดขีดจำกัดการโหลดแบบบังคับและแบบไม่บังคับร่วมกันได้ ตัวอย่างเช่น ขีดจำกัดน้ำหนักบรรทุกสูงสุดอาจแสดงน้ำหนักสูงสุดของสินค้ายานพาหนะสามารถบรรทุกได้อย่างปลอดภัย หรือจำนวนสูงสุดของสินค้าที่ใส่ลงในยานพาหนะได้พร้อมกัน ส่วนขีดจำกัดน้ำหนักบรรทุกสูงสุดแบบยืดหยุ่นอาจเป็นน้ำหนักสูงสุดหรือจำนวนสินค้าที่อาจทำให้ผู้ขับขี่บรรจุทุกอย่างลงในยานพาหนะได้ยาก