Yük talepleri ve sınırları

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

Teslim Alma ve Teslimat Süresi Aralığı Kısıtlamaları bölümünde belirtildiği gibi, OptimizeToursRequest mesajı (REST, gRPC), optimize edilmekte olan sorunla ilgili kısıtlamaları belirten çeşitli özellikler içerir. Bazı OptimizeToursRequest özelliği yük kısıtlamalarını temsil eder.

Araçlar ve sevkıyatlar, rota planlanırken dikkate alınması gereken fiziksel özelliklere sahiptir.

  • Taşıtlar: loadLimits özelliği, aracın kaldırabileceği maksimum yükü belirtir. Vehicle iletisinin (REST, gRPC) belgelerine bakın.
  • Sevkiyatlar: loadDemands özelliği, belirli bir gönderinin ne kadar yük tükettiğini belirtir. Shipment iletisinin (REST, gRPC) belgelerine bakın.

Bu iki kısıtlama birlikte, optimize edicinin araçları filo kapasitenize ve sevkiyat taleplerine en uygun şekilde uygun şekilde araçlarına atamasını mümkün kılar.

Bu dokümanın geri kalanında loadLimits ve loadDemands ayrıntılı olarak açıklanmaktadır.

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

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

Aşağıdaki örnekler gibi kendi yükleme türlerinizi sağlayabilirsiniz:

  • 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ılmıştır.

Hem Shipment.loadDemands hem de Vehicle.loadLimits, yük türlerini temsil eden string anahtarlarıyla Protokol Arabelleklerimap türünü kullanır.

Shipment.loadDemands değerleri Load mesajını (REST, gRPC) kullanır. Load mesajında, belirtilen türde gönderimi tamamlamak için ne kadar kapasitenin gerekli olduğunu gösteren tek bir amount özelliği bulunur.

Vehicle.loadLimits değerleri LoadLimit mesajını (REST, gRPC) kullanır. LoadLimit mesajında birkaç özellik vardır. maxLoad, aracın belirtilen türdeki maksimum yük kapasitesini gösterir.

Bir gönderimin loadDemands özelliği, kendisine atanan aracın loadLimits değerlerini yalnızca eşleşen yük türü anahtarları varsa tüketir. Örneğin, loadDemands değeri olan bir gönderim:

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

gönderinin tamamlanması için weightKg türünde 50 yükleme birimi gerektirir. loadLimits metriğine sahip araç:

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

Aracın weightKg türündeki maxLoad değeri, weightKg türündeki gönderinin loadDemands değerine eşit veya bu değerden büyük olduğu için gönderimi tamamlayabilir. Ancak loadLimits sahip bir araç:

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

weightKg yük sınırı olmadığı için dolaylı olarak sınırsız weightKg kapasiteye sahiptir. Bu sayede araç, kargonun ağırlığı talebiyle kısıtlanmaz.

Sevkiyatlar ve araçlar arasında yük aktarımı

Sevkiyatlar araç tarafından alınıp teslim edilirken, gönderinin loadDemand değeri gönderim ile araç arasında aktarılır. Araç yüklerini belirli bir araç için OptimizeToursResponse mesajının (REST, gRPC)routes.transitions girişinde görebilirsiniz. Sıralama şu şekildedir:

  1. Gönderim için gerekli yük kapasitesi loadDemand olarak tanımlanmış.
  2. Gönderi, atandığı araç tarafından teslim alınır ve aracın vehicleLoads değeri, gönderim loadDemand tutarında artar. Bu aktarım, yanıt mesajında pozitif visits.loadDemands ile temsil edilir.
  3. Araç, gönderimi teslim eder ve aracın vehicleLoads değeri, teslim edilen gönderimin loadDemand miktarı kadar azalır. Bu aktarım, yanıt mesajında negatif visits.loadDemands ile temsil edilir.

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

Yük talepleri ve sınırları hakkında eksiksiz bir örnek

Yük taleplerini ve sınırlarını içeren örnek bir isteği inceleyin

{
  "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ükle ilgili çeşitli parametreler içerir:

  • shipments[0] için 50 weightKg yük talebi var.
  • shipments[1] için 10 weightKg yük talebi var.
  • shipments[2] için 80 weightKg yük talebi var.
  • vehicles[0] için yük sınırı 100 weightKg.

Yük talepleri ve sınırları içeren isteğe verilen yanıtı görün

{
  "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 öğesinin sırasını etkiler:

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

Bu sipariş, toplam loadDemands aracın loadLimits tutarını aştığından araç tarafından aynı anda üç gönderimin tamamlanamadığını belirtmektedir.

Her visits girişi, Visit işleminin tamamlanmasından kaynaklanan araç yükündeki değişikliği içerir. Pozitif yük değerleri gönderim yüklemeyi, negatif değerler ise gönderi boşaltmayı temsil eder.

Her transitions girişi, Transition sırasındaki toplam araç yükünü içerir. Örneğin transitions[2], shipment[0] ve shipment[1] değerlerinin birleşik yükünü temsil eden 60 weightKg yüküne sahiptir.

routes[0].metrics ve metrics.aggregatedRouteMetrics metrik nesneleri maxLoads özelliği içerir. weightKg türü değeri 80'dir. Bu değer, araç rotasının shipments[2] öğesini teslim konumuna taşıyan kısmını temsil eder.

Esnek yük sınırı kısıtlamaları

Teslim Alma ve Teslimat Süresi Aralığı Kısıtlamaları bölümünde açıklanan zaman aralıklarında olduğu gibi, yük sınırı kısıtlamalarının sabit ve hafif varyantları vardır. LoadLimit mesajının maxLoad özelliği sabit bir kısıtlama ifade eder: Araç, belirtilen türde hiçbir zaman maxLoad değerini aşan bir yük taşımamalıdır. softMaxLoad ve costPerUnitAboveSoftMax mülkleri bir hafif kısıtlama ifade eder. softMaxLoad değerini aşan her birim, costPerUnitAboveSoftMax maliyetine neden olur.

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

  • daha fazla araç arasında sevkiyat dengesi sağlamak
  • Sürücünün belirli bir rotadan rahatça alıp teslim edebileceği öğe sayısına dair tercihini belirtmesi
  • aşınmayı sınırlandırmak ve bakım maliyetlerini azaltmak için araçları maksimum fiziksel kapasitelerinin altında yükleme

Sabit ve yumuşak yük sınır kısıtlamaları birlikte kullanılabilir. Örneğin, katı yük sınırı, bir aracın güvenli bir şekilde taşıyabileceği kargonun maksimum ağırlığını veya bir araca aynı anda sığabilecek maksimum öğe sayısını belirtirken hafif yük sınırı, sürücünün araçtaki her şeyi sığdırma yeteneğini vergilendirecek maksimum ağırlık ya da öğe sayısı olabilir.