คู่มือนี้จะอธิบาย 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
เปลี่ยนพาหนะระหว่างการจัดส่งและยานพาหนะ คุณสามารถดู
โหลดของยานพาหนะในข้อความ OptimizeToursResponse
(REST,
gRPC)routes.transitions
สำหรับยานพาหนะที่กำหนด ลำดับมีดังนี้
- ระบบกำหนดน้ำหนักบรรทุกที่จำเป็นสำหรับการจัดส่งเป็น
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 มีประโยชน์หลายประการ เช่น
- สร้างสมดุลระหว่างการขนส่งยานพาหนะมากกว่าจำนวนขั้นต่ำที่จำเป็น เมื่อต้องการดำเนินการดังกล่าวเพื่อความคุ้มค่า
- แสดงค่ากำหนดของผู้ขับขี่เกี่ยวกับจำนวนสินค้าที่รับและนำส่งได้อย่างสะดวกสบายในเส้นทางหนึ่งๆ
- โหลดยานพาหนะที่ต่ำกว่าความจุทางกายภาพสูงสุดเพื่อจำกัดการสึกหรอและ ลดต้นทุนการบำรุงรักษา
สามารถใช้ข้อจำกัดขีดจำกัดการโหลดแบบฮาร์ดและซอฟต์ร่วมกันได้ ตัวอย่างเช่น ขีดจำกัดน้ำหนักบรรทุกสูงสุดอาจแสดงน้ำหนักสูงสุดของสินค้ายานพาหนะสามารถบรรทุกได้อย่างปลอดภัย หรือจำนวนสูงสุดของสินค้าที่ใส่ลงในยานพาหนะได้พร้อมกัน ส่วนขีดจำกัดน้ำหนักบรรทุกสูงสุดแบบยืดหยุ่นอาจเป็นน้ำหนักสูงสุดหรือจำนวนสินค้าที่อาจทำให้ผู้ขับขี่บรรจุทุกอย่างลงในยานพาหนะได้ยาก