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