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

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

  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] มีดีมานด์การโหลด 10 weightKg
  • 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

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

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

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