Yük talepleri ve sınırları

Bu kılavuzda, loadDemands, loadLimits ve bunların birbiriyle nasıl ilişkili olduğu 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. Bazı OptimizeToursRequest özellikleri yükleme kısıtlamalarını temsil eder.

Araçlar ve sevkiyatların, rota planlarken göz önünde bulundurulması gereken fiziksel mülkleri vardır.

  • Araçlar: loadLimits özelliği, aracın kaldırabileceğ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ı (REST, gRPC) belgelerini inceleyin.

Bu iki kısıtlama, optimize edicinin gönderileri araçlara uygun şekilde, filo kapasitenize ve gönderim taleplerinize en uygun şekilde atamasını sağ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 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 eşyaların 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ı ile Protokol Arabelleklerimap türünü kullanır.

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

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

Bir gönderinin loadDemands, kendisine atanan aracın loadLimits özelliğini yalnızca eşleşen yük türü anahtarlarına sahipse tüketir. Örneğin, şu özelliklere sahip bir kargo: loadDemands:

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

gönderimin tamamlanması için weightKg türünde 50 yükleme birimi gerektirir. Şu özelliklere sahip bir araç: loadLimits:

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

Aracın weightKg türündeki maxLoad değeri, weightKg türündeki gönderinin loadDemands değerinden yüksek veya buna eşit olduğundan gönderimi tamamlayabilir. Ancak şu özelliklere sahip bir araç: loadLimits:

"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. Gereken yük kapasitesi, gönderim için 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 pozitif visits.loadDemands ile temsil edilir.
  3. Araç, gönderimi teslim eder ve aracın vehicleLoads değeri, teslim edilen sevkiyatın loadDemand tutarı 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ük talepleri ve sınırlarıyla ilgili eksiksiz bir örnek

Yük talepleri ve sınırlarıyla ilgili ö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], 50 weightKg yükleme talebine sahip.
  • shipments[1], 10 weightKg yükleme talebine sahip.
  • shipments[2], 80 weightKg yük talebine sahip.
  • vehicles[0] uygulamasının yükleme sınırı 100 weightKg.

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 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 sevkiyatın araç tarafından loadLimits değerini aştığından araç tarafından aynı anda üç sevkiyatın tamamlanamadığını gösteriyor.

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

Her transitions girişi, Transition süresince toplam araç yükünü içerir. Örneğin transitions[2], toplam shipment[0] ve shipment[1] yüklemelerini temsil eden 60'lık bir weightKg yüküne sahiptir.

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

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

Teslim alma ve teslimat süresi aralığı kısıtlamalarında açıklanan zaman aralıklarında olduğu gibi yük sınırı kısıtlamalarının sabit ve esnek varyantları vardır. LoadLimit mesajının maxLoad özelliği sabit bir kısıtlama ifade ediyor: Araç, belirtilen türde maxLoad değerini aşan yükü hiçbir zaman taşımamalıdır. softMaxLoad ve costPerUnitAboveSoftMax mülkleri, softMaxLoad değerini aşan her birimin costPerUnitAboveSoftMax maliyetine neden olduğu esnek bir kısıtlama ifade eder.

Geçici yükleme sınırı kısıtlamalarının aşağıdakiler gibi çeşitli kullanım alanları vardır:

  • uygun maliyetli olduğunda, daha fazla araç genelinde gerekli minimum sayıdan fazla sevkiyatın dengelenmesi;
  • belirli bir rotada rahatça teslim alıp teslim edebilecekleri öğe sayısı için sürücü tercihini ifade eder.
  • aşınmayı sınırlandırmak ve bakım maliyetlerini azaltmak için araçları maksimum fiziksel kapasitelerinin altında yükleme

Sert ve hafif yükleme sınırı kısıtlamaları birlikte kullanılabilir. Örneğin, ağır yük sınırı, bir aracın güvenli bir şekilde taşıyabileceği maksimum kargo ağırlığını veya bir araca aynı anda sığabilecek maksimum öğe sayısını ifade ederken yumuşak yük sınırı, sürücünün araçtaki her şeyi sığdırabilmesine engel olacak maksimum ağırlık veya öğe sayısı olabilir.