Yük talepleri ve sınırları

Avrupa Ekonomik Alanı (AEA) geliştiricileri

Bu kılavuzda loadDemands ve loadLimits ile bunların birbiriyle ilişkisi açıklanmaktadır.

Teslim Alma ve Teslimat Zaman Aralığı Kısıtlamaları bölümünde belirtildiği gibi, OptimizeToursRequest mesajı (REST, gRPC), optimize edilen sorunla ilgili kısıtlamaları belirten bir dizi özellik içerir. Çeşitli OptimizeToursRequest özellikleri yük kısıtlamalarını temsil eder.

Araçların ve gönderilerin, rota planlanırken dikkate alınması gereken fiziksel özellikleri vardır.

  • Araçlar: loadLimits mülk özelliği, aracın taşıyabileceği maksimum yükü belirtir. VehicleMesajın (REST, gRPC) dokümanlarına bakın.
  • Gönderimler: loadDemands özelliği, belirli bir gönderimin ne kadar yük tükettiğini belirtir. ShipmentMesajın (REST, gRPC) dokümanlarına bakın.

Bu iki kısıtlama, optimizasyon aracının gönderileri filonuzun kapasitesine ve gönderi taleplerinize en uygun şekilde araçlara atamasını sağlar.

Bu belgenin geri kalanında loadLimits ve loadDemands ayrıntılı olarak ele alınmaktadır.

Yük talepleri ve sınırları: türler

Her yük talebini ve sınır kısıtlamasını bir tür olarak ifade edersiniz.

Aşağıdaki örneklerde olduğu gibi kendi yük türlerinizi belirtebilirsiniz:

  • ağırlık
  • ses düzeyi
  • doğrusal ölçümler
  • taşınan öğelerin veya ekipmanların adları

Bu kılavuzda örnek tür olarak weightKg kullanılmaktadır.

Hem Shipment.loadDemands hem de Vehicle.loadLimits, yük türlerini temsil eden string anahtarlarıyla birlikte Protocol Buffers map türünü kullanır.

Shipment.loadDemands değerleri, Load mesajını (REST, gRPC) kullanır. Load mesajında, belirtilen türde gönderimin tamamlanması için ne kadar kapasite gerektiğini gösteren tek bir amount özelliği bulunur.

Vehicle.loadLimits değerleri, LoadLimit mesajını (REST, gRPC) kullanır. LoadLimit mesajı çeşitli özelliklere sahiptir. maxLoad, belirtilen türdeki aracın maksimum yük kapasitesini gösterir.

Bir gönderimin loadDemands, yalnızca ikisinin yük türü anahtarları eşleşiyorsa kendisine atanan aracın loadLimits tüketir. Örneğin, aşağıdakileri içeren bir gönderim:loadDemands

"loadDemands": {
  "weightKg": {
    "amount": 50
  }
}

gönderimin tamamlanması için weightKg türünde 50 yük birimi gerektirir. Aşağıdakilerden loadLimits'e sahip bir araç:

"loadLimits": {
  "weightKg": {
    "maxLoad": 100
  }
}

weightKg türündeki aracın maxLoad değeri, weightKg türündeki kargonun loadDemands değerine eşit veya daha yüksek olduğundan kargo tamamlanabilir. Ancak aşağıdaki özelliklere sahip araçlar:loadLimits

"loadLimits": {
  "equipmentRackStorage": {
    "maxLoad": 10
  }
}

weightKg yük sınırı olmadığı için sınırsız weightKg kapasiteye sahiptir. Bu nedenle, araç gönderinin ağırlık talebiyle sınırlanmaz.

Gönderiler ve araçlar arasında yük aktarımı

Gönderiler araçlarla teslim alındığı ve teslim edildiği için gönderinin loadDemand, gönderi ile araç arasında aktarılır. Belirli bir araç için OptimizeToursResponse mesajının (REST, gRPC) routes.transitions girişinde aracın yüklerini görebilirsiniz. Sıra aşağıdaki gibidir:

  1. Gerekli yük kapasitesi, gönderi için loadDemand olarak tanımlanır.
  2. Gönderi, kendisine atanan araç tarafından alınır ve aracın vehicleLoads, gönderinin loadDemand miktarı kadar artar. Bu aktarım, yanıt mesajında pozitif visits.loadDemands ile gösterilir.
  3. Araç, gönderiyi teslim eder ve aracın vehicleLoads, teslim edilen gönderinin loadDemand miktarı kadar azalır. Bu aktarım, yanıt mesajında negatif visits.loadDemands ile gösterilir.

Bir aracın vehicleLoads değeri, rotası üzerindeki hiçbir noktada belirtilen loadLimits değerini aşamaz.

Yükleme talepleri ve sınırları içeren eksiksiz bir örnek

Yük talepleri ve sınırları içeren örnek bir istek

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

Örnek istek, yüklemeyle ilgili çeşitli parametreler içerir:

  • shipments[0], 50 weightKg yük talebine sahip.
  • shipments[1], 10 weightKg yük talebine sahip.
  • shipments[2], 80 weightKg yük talebine sahip.
  • vehicles[0] için 100 weightKg yükleme sınırı vardır.

Yük talepleri ve sınırlarla ilgili isteğe verilen yanıtı görme

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

Eklenen yük kısıtlamaları, visits sırasını etkiler:

  1. shipment[0] teslim alındı
  2. shipment[1] teslim alındı
  3. shipment[0] teslim edildi
  4. shipment[1] teslim edildi
  5. shipment[2] teslim alındı
  6. shipment[2] teslim edildi

Bu sipariş, toplam loadDemands değeri aracın loadLimits değerini aştığı için üç gönderimin aynı anda araçla tamamlanamayacağını gösteriyor.

Her visits girişi, Visit tamamlanmasından kaynaklanan araç yükündeki değişikliği içerir. Pozitif yük değerleri sevkiyat yüklemesini, negatif değerler ise sevkiyat boşaltmasını temsil eder.

Her transitions girişi, Transition sırasındaki toplam araç yükünü içerir. Örneğin, transitions[2] için shipment[0] ve shipment[1] yüklerinin birleşimi olan 60 weightKg yükü vardır.

Metrik nesneleri routes[0].metrics ve metrics.aggregatedRouteMetrics, maxLoads özelliğini içerir. weightKg türünün değeri 80'dir. Bu değer, aracın shipments[2] öğesini teslimat konumuna taşıdığı rotanın bölümünü gösterir.

Yükleme sınırı kısıtlamaları

Teslim Alma ve Teslimat Zaman Aralığı Kısıtlamaları'nda açıklanan zaman aralıklarında olduğu gibi, yük sınırı kısıtlamalarının da kesin ve esnek varyantları vardır. LoadLimit mesajının maxLoad özelliği, kesin bir kısıtlamayı ifade eder: Araç, belirtilen türde hiçbir zaman maxLoad değerini aşan bir yük taşımamalıdır. softMaxLoad ve costPerUnitAboveSoftMax özellikleri, her birimin softMaxLoad'yı aşması durumunda costPerUnitAboveSoftMax maliyetine neden olan yumuşak bir kısıtlamayı ifade eder.

Yumuşak yükleme sınırı kısıtlamalarının çeşitli kullanım alanları vardır. Örneğin:

  • Maliyet açısından avantajlı olduğunda, gönderileri gerekli minimum araç sayısından daha fazla araca dağıtmak
  • sürücünün, belirli bir rotada rahatça alıp teslim edebileceği öğe sayısı tercihini ifade etme
  • Aşınmayı sınırlamak ve bakım maliyetlerini azaltmak için araçları maksimum fiziksel kapasitelerinin altında yükleme

Kesin ve esnek yükleme sınırı kısıtlamaları birlikte kullanılabilir. Örneğin, katı bir yük sınırı, bir aracın güvenli bir şekilde taşıyabileceği maksimum kargo ağırlığını veya araca aynı anda sığabilecek maksimum öğe sayısını ifade edebilir. Esnek bir yük sınırı ise sürücünün her şeyi araca sığdırma becerisini zorlayacak maksimum ağırlık veya öğe sayısı olabilir.