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