Yük talepleri ve sınırları

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

Arama 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. Birkaç OptimizeToursRequest mülkü yükleme kısıtlamalarını temsil eder.

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

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

Bu iki kısıtlama birlikte, optimizasyon aracının kargoları filo kapasitenize ve kargo taleplerinize en uygun şekilde araçlara uygun şekilde 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ırlama kısıtlamasını bir tür olarak 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ılmaktadır.

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

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

Vehicle.loadLimits değerleri, LoadLimit mesajını (REST,gRPC) kullanır. LoadLimit mesajında çeşitli özellikler bulunur. maxLoad, aracın belirtilen türdeki maksimum yük kapasitesini temsil eder.

Bir gönderinin loadDemands, yalnızca ikisinin eşleşen yükleme türü anahtarlarına sahip olması durumunda atanmış aracının loadLimits'unu tüketir. Örneğin, loadDemands içeren bir gönderim:

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

gönderimin tamamlanması için weightKg türündeki 50 yük birimi gerekir. Aşağıdakilerden loadLimits'ü içeren bir araç:

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

Araç, weightKg türündeki maxLoad değerine sahip olduğu için gönderim, weightKg türündeki loadDemands değerine sahip olduğu için tamamlanabilir. Ancak aşağıdakilerden loadLimits olan bir araç:

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

weightKg yük sınırı olmadığı için weightKg kapasitesi sınırsız olduğundan araç, gönderinin ağırlık talebiyle sınırlı değildir.

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

Gönderiler araçlar tarafından teslim alındığında, gönderinin loadDemand gönderi ile araç arasında aktarılır. Aracın yüklerini, belirli bir araç için OptimizeToursResponse mesajının (REST, gRPC)routes.transitions girişinde görebilirsiniz. Sıralama aşağıdaki gibidir:

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

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

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

Yük talepleri ve sınırlar içeren örnek bir isteğe bakın

{
  "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 birkaç parametre içerir:

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

Yük talepleri ve sınırlarını içeren istek yanıtını 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'ün sırasını etkiler:

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

Bu sipariş, toplam loadDemands'leri aracın loadLimits'unu aştığı için üç gönderimin aynı anda araç tarafından tamamlanamadığını gösterir.

Her visits girişi, Visit'un tamamlanmasından kaynaklanan araç yükünde meydana gelen değişikliği içerir. Pozitif yükleme değerleri, kargo yüklemeyi, negatif yükleme değerleri ise kargo boşaltmayı temsil eder.

Her transitions girişi, Transition sırasındaki toplam araç yükünü içerir. Örneğin, transitions[2]'ün weightKg yükü 60'tır. Bu değer, shipment[0] ve shipment[1]'in birleşik yüklerini temsil eder.

routes[0].metrics ve metrics.aggregatedRouteMetrics metrik nesneleri bir maxLoads özelliği içeriyor. weightKg türü için değer 80'dir ve aracın rotasının shipments[2]'yi teslimat konumuna taşıyan kısmını temsil eder.

Sanal yükleme sınırı kısıtlamaları

Araç Alma ve Teslimat Zaman Aralığı Kısıtlamaları bölümünde açıklanan zaman aralıkları gibi, yükleme sınırı kısıtlamalarının da katı ve yumuşak varyantları vardır. LoadLimit mesajının maxLoad mülkü katı bir kısıtlamayı ifade eder: Araç hiçbir zaman belirtilen türdeki maxLoad değerini aşan yük taşımamalıdır. softMaxLoad ve costPerUnitAboveSoftMax özellikleri, softMaxLoad'ü aşan her bir birimin costPerUnitAboveSoftMax maliyeti olmasını sağlayan yumuşak bir kısıtlama ifade eder.

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

  • Maliyet etkin olduğunda gönderimleri gerekli minimum sayıdan daha fazla araç arasında dengeleme
  • Sürücünün, belirli bir rotada rahatça alıp teslim edebileceği öğe sayısıyla ilgili tercihini belirtmesi
  • Araçları, aşınmayı sınırlamak ve bakım maliyetlerini azaltmak için maksimum fiziksel kapasitelerinin altında yükleme

Sert ve yumuşak yükleme sınırı kısıtlamaları birlikte kullanılabilir. Örneğin, katı yükleme sınırı, bir aracın güvenli bir şekilde taşıyabileceği maksimum kargo ağırlığını veya bir araca tek seferde sığabilecek maksimum öğe sayısını ifade edebilir. Öte yandan, yumuşak yükleme sınırı, sürücünün her şeyi araca sığdırma kapasitesini zorlayan maksimum ağırlık veya öğe sayısı olabilir.