Yük talepleri ve sınırları

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

Teslim alma ve teslim süresi 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ı (REST, gRPC) belgelerini inceleyin.
  • Gönderimler: loadDemands özelliği, 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ükleme 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ı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ı (REST, gRPC) kullanır. 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. Şu özelliklere sahip bir araç: loadLimits:

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

Araç, weightKg türündeki maxLoad değerine sahip olduğu için gönderimi tamamlayabilir. Bu değer, gönderimin weightKg türündeki loadDemands değerinden büyük veya eşit olmalıdır. Ancak aşağıdakilerden loadLimits olan bir araç:

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

weightKg yük sınırı olmadığı için dolaylı olarak sınırsız weightKg kapasitesine sahiptir. Böylece araç, kargonun ağırlık talebiyle kısıtlanmaz.

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

Gönderiler araçlar tarafından alınıp teslim edilirken loadDemand, gönderim ile araç arasında aktarılır. Belirli bir aracın OptimizeToursResponse mesajının (REST, gRPC)routes.transitions girişinde aracın yüklemelerini 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, kendisine atanan araç tarafından teslim alınır ve aracın vehicleLoads değeri, sevkiyatın loadDemand tutarı kadar artar. Bu aktarım, yanıt mesajında olumlu 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 temsil edilir.

Bir aracın vehicleLoads değeri, rota üzerindeki herhangi 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ükle ilgili çeşitli parametreler içerir:

  • shipments[0], 50 weightKg yük talebine sahiptir.
  • shipments[1], 10 weightKg yükleme 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ıyla 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'ün sırasını etkiler:

  1. shipment[0] 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 maddesinin tamamlanmasından kaynaklanan araç yükündeki 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üresince 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 esnek 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 yumuşak bir kısıtlama ifade eder. softMaxLoad'ü aşan her birim için costPerUnitAboveSoftMax maliyeti oluşur.

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

  • uygun maliyetli olduğunda, daha fazla araç genelinde gerekli minimum sayıdan fazla sevkiyatın dengelenmesi;
  • 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.