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

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

  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

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

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

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