ความต้องการและขีดจำกัดในการโหลด

คู่มือนี้อธิบาย loadDemands และ loadLimits และความเกี่ยวข้องระหว่างกัน

ดังที่กล่าวไว้ในข้อจำกัดกรอบเวลาการรับสินค้าและเวลานำส่ง ข้อความ OptimizeToursRequest (REST, gRPC) มีพร็อพเพอร์ตี้จำนวนหนึ่งที่ระบุข้อจำกัดของปัญหาในการเพิ่มประสิทธิภาพ พร็อพเพอร์ตี้ OptimizeToursRequest หลายรายการแสดงถึงข้อจำกัดในการโหลด

ยานพาหนะและการจัดส่งมีคุณสมบัติทางกายภาพซึ่งต้องนำมาพิจารณาเมื่อวางแผนเส้นทาง

  • ยานพาหนะ: พร็อพเพอร์ตี้ loadLimits ระบุน้ำหนักสูงสุดที่ยานพาหนะรับได้ ดูเอกสารประกอบ (REST, gRPC) ของข้อความ Vehicle
  • การจัดส่ง: พร็อพเพอร์ตี้ loadDemands ระบุปริมาณโหลดที่จะใช้ ดูเอกสารประกอบ (REST, gRPC) ของข้อความ Shipment

ข้อจำกัดทั้ง 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 สำหรับยานพาหนะที่ระบุ ลำดับมีดังนี้

  1. ระบบกำหนดน้ำหนักบรรทุกที่จำเป็นสำหรับการจัดส่งเป็น loadDemand
  2. บริษัทจะมารับพัสดุโดยยานพาหนะที่กำหนดและ vehicleLoads ของยานพาหนะจะเพิ่มขึ้นตามจำนวนเงิน loadDemand ของการจัดส่ง การโอนนี้จะแสดงด้วย visits.loadDemands เชิงบวกในข้อความตอบกลับ
  3. ยานพาหนะนำส่งสินค้าแล้วและ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] มีความต้องการโหลดอยู่ที่ 50 weightKg
  • shipments[1] มีความต้องการโหลดเท่ากับ weightKg 10
  • shipments[2] มีความต้องการโหลดอยู่ที่ 80 weightKg
  • vehicles[0] มีขีดจำกัดการโหลดอยู่ที่ 100 weightKg

ดูการตอบกลับคำขอที่มีความต้องการโหลดและขีดจำกัด

{
  "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:

  1. shipment[0] มารับแล้ว
  2. shipment[1] มารับแล้ว
  3. นำส่ง shipment[0] แล้ว
  4. นำส่ง shipment[1] แล้ว
  5. shipment[2] มารับแล้ว
  6. นำส่ง 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

ข้อจำกัดของขีดจำกัดการโหลดแบบนุ่มนวลมีประโยชน์หลายอย่าง เช่น

  • สร้างความสมดุลระหว่างการส่งสินค้ากับยานพาหนะจำนวนมากให้มากกว่าจำนวนขั้นต่ำที่จำเป็น เมื่อการดำเนินการดังกล่าวคุ้มค่า
  • แสดงความชื่นชอบของคนขับในจำนวนสิ่งของที่เขาสามารถไปรับ และนำส่งได้อย่างสะดวกสบายบนเส้นทางที่กำหนด
  • การบรรทุกยานพาหนะให้ต่ำกว่าความจุทางกายภาพสูงสุดเพื่อจำกัดการสึกหรอและลดค่าใช้จ่ายในการบำรุงรักษา

ข้อจำกัดขีดจำกัดของการฮาร์ดโหลดและซอฟต์โหลดใช้ด้วยกันได้ เช่น ขีดจำกัดการบรรทุกหนักอาจแสดงน้ำหนักบรรทุกสูงสุดที่รถจะบรรทุกได้อย่างปลอดภัย หรือจำนวนสินค้าสูงสุดที่จะใส่ในยานพาหนะได้ในคราวเดียว ขณะที่ขีดจำกัดการบรรทุกแบบนิรภัยอาจเป็นน้ำหนักสูงสุดหรือจำนวนสินค้าที่ต้องเติมน้ำหนักให้คนขับสามารถใส่ทุกอย่างในยานพาหนะได้