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

ตัวอย่างนี้แสดงวิธีใช้ loadDemands และ loadLimits เพื่อจัดการ ข้อจำกัดด้านความจุของยานพาหนะในคำขอ Route Optimization API

ดูภาพรวมแนวคิดทั้งหมดได้ในเอกสารแนวคิดสำคัญเกี่ยวกับดีมานด์และขีดจำกัดในการโหลด

ตัวอย่างคำขอ

ตัวอย่างต่อไปนี้แสดงสถานการณ์ที่รถยนต์คันเดียวที่มีขีดจำกัดน้ำหนักบรรทุก ต้องนำส่งสินค้า 3 รายการที่มีน้ำหนักแตกต่างกัน

คำขอตัวอย่างนี้มีพารามิเตอร์ที่เกี่ยวข้องกับการโหลดต่อไปนี้

  • shipments[0] ที่มีดีมานด์การโหลด amount ที่ 50 weightKg
  • shipments[1] โดยมีดีมานด์การโหลด amount เท่ากับ 10 weightKg
  • shipments[2] ที่มีดีมานด์การโหลด amount ที่ 80 weightKg
  • vehicles[0] โดยมีขีดจำกัดการโหลด maxLoad ที่ 100 weightKg

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

{
  "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"
          }
        }
      }
    ]
  }
}
    

ตัวอย่างการตอบกลับ

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

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

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

เนื่องจากloadDemandsรวมของการจัดส่งทั้ง 3 รายการ (50 + 10 + 80 = 140) เกินloadLimitsของยานพาหนะ (100) ยานพาหนะจึงรับสินค้าทั้งหมดพร้อมกันไม่ได้ เครื่องมือเพิ่มประสิทธิภาพจะพิจารณาเฉพาะเส้นทางที่ shipment[0] และ shipment[2] ไม่ได้อยู่ในยานพาหนะพร้อมกัน เนื่องจากสินค้าที่จัดส่งเหล่านี้ มีน้ำหนักรวมกันเกินขีดจำกัดการบรรทุกของยานพาหนะ

เส้นทางมีvisitsต่อไปนี้เพื่อไม่ให้เกินขีดจำกัดน้ำหนักบรรทุกของยานพาหนะ

  1. มีผู้มารับ shipment[0] แล้ว
  2. มีผู้มารับ shipment[1] แล้ว
  3. shipment[0] ได้รับการนำส่งแล้ว
  4. shipment[1] ได้รับการนำส่งแล้ว
  5. มีผู้มารับ shipment[2] แล้ว
  6. shipment[2] ได้รับการนำส่งแล้ว

น้ำหนักบรรทุกของยานพาหนะจะเปลี่ยนแปลงตลอดเส้นทาง ซึ่งคุณสามารถสังเกตได้ในอาร์เรย์ transitions เช่น transitions[2] แสดงยานพาหนะ บรรทุกสินค้า 60 weightKg หลังจากรับสินค้า 2 รายการแรก (50 + 10)

พร็อพเพอร์ตี้ maxLoads ใน metrics แสดงให้เห็นว่าน้ำหนักบรรทุกสูงสุด ที่บรรทุกในจุดใดก็ตามของเส้นทางคือ 80 weightKg ซึ่งยืนยันว่า โซลูชันยังคงอยู่ภายในขีดจำกัด 100 weightKg ของยานพาหนะได้สำเร็จ

ขีดจำกัดการโหลดแบบไม่เข้มงวด

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

ตัวอย่างคำขอ

ตอนนี้คำขอนี้รวมการจัดส่งแบบนำส่งเท่านั้น 3 รายการและยานพาหนะ 2 คันที่มีloadLimits และ softMaxLoad เดียวกัน

พารามิเตอร์หลักสำหรับตัวอย่างนี้มีดังนี้

  • การจัดส่งทั้ง 3 รายการมีloadDemandsรวม 140 weightKg (50
    • 60 + 30)
  • มียานพาหนะ 2 คันที่มี softMaxLoad เป็น "100" weightKg และมี costPerUnitAboveSoftMax เป็น 5.0

ดูตัวอย่างคำขอที่มีขีดจำกัดการโหลดแบบยืดหยุ่น

{
  "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"
          }
        ],
        
        "loadDemands": {
          "weightKg": {
            "amount": "50"
          }
        }
        
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s"
          }
        ],
        
        "loadDemands": {
          "weightKg": {
            "amount": "60"
          }
        }
        
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s"
          }
        ],
        
        "loadDemands": {
          "weightKg": {
            "amount": "30"
          }
        }
        
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0,
        
        "loadLimits": {
          "weightKg": {
            "maxLoad": "150",
            "softMaxLoad": "100",
            "costPerUnitAboveSoftMax": 5.0
          }
        }
        
      },
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0,
        
        "loadLimits": {
          "weightKg": {
            "maxLoad": "150",
            "softMaxLoad": "100",
            "costPerUnitAboveSoftMax": 5.0
          }
        }
        
      }
    ]
  }
}
    

ตัวอย่างการตอบกลับ

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

ดูการตอบกลับคำขอที่มีขีดจำกัดการโหลดแบบยืดหยุ่น

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T16:00:00Z",
      "vehicleEndTime": "2023-01-13T16:13:31Z",
      "visits": [
        {
          "startTime": "2023-01-13T16:03:53Z",
          "detour": "0s",
          "loadDemands": {
            "weightKg": {
              "amount": "-50"
            }
          }
        }
      ],
      "transitions": [
        {
          "travelDuration": "233s",
          "travelDistanceMeters": 794,
          "waitDuration": "0s",
          "totalDuration": "233s",
          "startTime": "2023-01-13T16:00:00Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "50"
            }
          }
        },
        {
          "travelDuration": "328s",
          "travelDistanceMeters": 1188,
          "waitDuration": "0s",
          "totalDuration": "328s",
          "startTime": "2023-01-13T16:08:03Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        }
      ],
      "metrics": {
        "performedShipmentCount": 1,
        "travelDuration": "561s",
        "visitDuration": "250s",
        "totalDuration": "811s",
        "travelDistanceMeters": 1982,
        "maxLoads": {
          "weightKg": {
            "amount": "50"
          }
        }
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 19.82,
        "model.vehicles.cost_per_hour": 9.01
      },
      "routeTotalCost": 28.83
    },
    {
      "vehicleIndex": 1,
      "vehicleStartTime": "2023-01-13T16:00:00Z",
      "vehicleEndTime": "2023-01-13T16:21:43Z",
      "visits": [
        {
          "shipmentIndex": 1,
          "startTime": "2023-01-13T16:05:54Z",
          "detour": "0s",
          "loadDemands": {
            "weightKg": {
              "amount": "-60"
            }
          }
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T16:13:52Z",
          "detour": "473s",
          "loadDemands": {
            "weightKg": {
              "amount": "-30"
            }
          }
        }
      ],
      "transitions": [
        {
          "travelDuration": "354s",
          "travelDistanceMeters": 1196,
          "waitDuration": "0s",
          "totalDuration": "354s",
          "startTime": "2023-01-13T16:00:00Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "90"
            }
          }
        },
        {
          "travelDuration": "228s",
          "travelDistanceMeters": 808,
          "waitDuration": "0s",
          "totalDuration": "228s",
          "startTime": "2023-01-13T16:10:04Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "30"
            }
          }
        },
        {
          "travelDuration": "221s",
          "travelDistanceMeters": 655,
          "waitDuration": "0s",
          "totalDuration": "221s",
          "startTime": "2023-01-13T16:18:02Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        }
      ],
      "metrics": {
        "performedShipmentCount": 2,
        "travelDuration": "803s",
        "visitDuration": "500s",
        "totalDuration": "1303s",
        "travelDistanceMeters": 2659,
        "maxLoads": {
          "weightKg": {
            "amount": "90"
          }
        }
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 26.59,
        "model.vehicles.cost_per_hour": 14.48
      },
      "routeTotalCost": 41.07
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 3,
      "travelDuration": "1364s",
      "visitDuration": "750s",
      "totalDuration": "2114s",
      "travelDistanceMeters": 4641,
      "maxLoads": {
        "weightKg": {
          "amount": "90"
        }
      }
    },
    "usedVehicleCount": 2,
    "earliestVehicleStartTime": "2023-01-13T16:00:00Z",
    "latestVehicleEndTime": "2023-01-13T16:21:43Z",
    "totalCost": 69.90,
    "costs": {
      "model.vehicles.cost_per_kilometer": 46.41,
      "model.vehicles.cost_per_hour": 23.49
    }
  }
}
    

ฟิลด์ต่อไปนี้แสดงวิธีที่เครื่องมือเพิ่มประสิทธิภาพแบ่งการจัดส่งในรถ 2 คันเพื่อรักษาน้ำหนักบรรทุกไม่ให้เกินขีดจำกัดแบบยืดหยุ่นที่ 100 weightKg

  • เส้นทางแรก (vehicleIndex: 0) จัดการการจัดส่ง 50 weightKg maxLoads คือ "50" ซึ่งต่ำกว่าขีดจำกัดแบบยืดหยุ่น
  • ส่วนเส้นทางที่ 2 (vehicleIndex: 1) จะจัดการการจัดส่ง 60 และ 30 weightKg maxLoads คือ "90" ซึ่งต่ำกว่าขีดจำกัดแบบยืดหยุ่นเช่นกัน
  • เนื่องจากรถทั้ง 2 คันไม่ละเมิดขีดจำกัดแบบยืดหยุ่น routeCosts ของทั้ง 2 เส้นทางจึงไม่แสดงค่าปรับcostPerUnitAboveSoftMax