Parametry modelu kosztu

Komunikat OptimizeToursRequest (REST, gRPC) zawiera szereg właściwości związanych z kosztami. Łącznie te parametry kosztu reprezentują model kosztów żądania. Model kosztów uwzględnia wiele ogólnych celów optymalizacji żądania, takich jak:

  • Priorytetowe traktowanie szybszych tras (Vehicle) zamiast krótszych tras lub na odwrót
  • Określenie, czy koszt realizacji elementu Shipment jest wart wartości ukończenia zadania Shipment
  • Wykonywanie odbioru i dostawy w przedziałach czasowych tylko wtedy, gdy jest to opłacalne

Zobacz przykładowe żądanie z kosztami

{
  "model": {
    "globalStartTime": "2023-01-13T16:00:00-08:00",
    "globalEndTime": "2023-01-14T16:00:00-08:00",
    "shipments": [
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789456,
              "longitude": -122.390192
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 5.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0
      }
    ]
  }
}
    

Vehicle właściwości kosztów

Komunikat Vehicle (REST, gRPC) ma kilka właściwości kosztów:

  • Vehicle.cost_per_hour: koszt obsługi pojazdu na godzinę, łącznie z przejazdem, czasem oczekiwania, wizytą i czasem przerw.
  • Vehicle.cost_per_kilometer: pokazuje koszt za kilometr pokonany pojazdem.
  • Vehicle.cost_per_traveled_hour: pokazuje koszt obsługi pojazdu tylko w trakcie transportu z wyłączeniem czasu oczekiwania, wizyty i przerwach.

Dzięki tym parametrom kosztów optymalizator może porównać ze sobą różnice między długością a podróżą. Koszty ponoszone przez zoptymalizowaną trasę wyświetlają się w komunikacie z odpowiedzią jako metrics.costs:

Wraz ze wzrostem costPerHour optymalizator próbuje znaleźć szybsze trasy, które mogą nie być najkrótsze. W tym przykładzie najszybsza trasa jest najkrótsza, więc zmiany parametrów kosztów mają niewielki wpływ.

Shipment właściwości kosztów

Komunikat Shipment (REST, gRPC) zawiera też kilka parametrów kosztów:

  • Shipment.penalty_cost pokazuje koszty poniesione w wyniku pominięcia wysyłki.
  • Wartość Shipment.VisitRequest.cost reprezentuje koszt konkretnego odbioru lub dostawy. Służy głównie do zapewnienia kompromisu w zakresie kosztów między wieloma opcjami odbioru lub dostawy w przypadku jednej przesyłki.

Parametry kosztów Shipment używają tych samych jednostek bezwymiarowych co parametry kosztów Vehicle. Poniesiony koszt za Shipment przekracza jego koszt karny, dlatego Shipment nie jest uwzględniany na żadnej trasie routingu Vehicle i zamiast tego pojawia się na liście skipped_shipments w wiadomości z odpowiedzią.

ShipmentModel właściwości kosztów

Komunikat ShipmentModel (REST, gRPC) zawiera 1 właściwość kosztu: globalDurationCostPerHour. Ten koszt jest obliczany na podstawie łącznego czasu potrzebnego na ukończenie ShipmentRoute przez wszystkie pojazdy. Zwiększenie wartości globalDurationCostPerHour spowoduje priorytetowe wcześniejsze zakończenie wszystkich dostaw.

Właściwości kosztu odpowiedzi optymalizacji trasy

Komunikat OptimizeToursResponse (REST, gRPC) zawiera właściwości kosztów, które reprezentują koszty poniesione w ramach procesu realizacji ShipmentRoute. Właściwości metrics.costs i metrics.totalCost przedstawiają liczbę jednostek kosztów poniesionych na wszystkich trasach w odpowiedzi. Każdy wpis routes ma właściwości routeCosts i routeTotalCosts, które reprezentują koszty związane z konkretną trasą.

Zobacz odpowiedź na przykładowe żądanie z kosztami

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-14T00:00:00Z",
      "vehicleEndTime": "2023-01-14T00:28:22Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-14T00:00:00Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-14T00:02:30Z",
          "detour": "150s"
        },
        {
          "startTime": "2023-01-14T00:08:55Z",
          "detour": "150s"
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-14T00:21:21Z",
          "detour": "572s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-14T00:00:00Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-14T00:02:30Z"
        },
        {
          "travelDuration": "235s",
          "travelDistanceMeters": 795,
          "waitDuration": "0s",
          "totalDuration": "235s",
          "startTime": "2023-01-14T00:05:00Z"
        },
        {
          "travelDuration": "496s",
          "travelDistanceMeters": 1893,
          "waitDuration": "0s",
          "totalDuration": "496s",
          "startTime": "2023-01-14T00:13:05Z"
        },
        {
          "travelDuration": "171s",
          "travelDistanceMeters": 665,
          "waitDuration": "0s",
          "totalDuration": "171s",
          "startTime": "2023-01-14T00:25:31Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 2,
        "travelDuration": "902s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "800s",
        "totalDuration": "1702s",
        "travelDistanceMeters": 3353
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 33.53,
        "model.vehicles.cost_per_hour": 18.911111111111111
      },
      "routeTotalCost": 52.441111111111113
    }
  ],
  "skippedShipments": [
    {
      "index": 1
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 2,
      "travelDuration": "902s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "800s",
      "totalDuration": "1702s",
      "travelDistanceMeters": 3353
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-14T00:00:00Z",
    "latestVehicleEndTime": "2023-01-14T00:28:22Z",
    "totalCost": 57.441111111111113,
    "costs": {
      "model.vehicles.cost_per_kilometer": 33.53,
      "model.vehicles.cost_per_hour": 18.911111111111111,
      "model.shipments.penalty_cost": 5
    }
  }
}
    

W przykładowej odpowiedzi najważniejsze metrics.costs to:

{
  "metrics": {
    ...
    "costs": {
      "model.vehicles.cost_per_hour": 18.911111111111111,
      "model.vehicles.cost_per_kilometer": 33.53,
      "model.shipments.penalty_cost": 5
    }
  }
}

Wartość model.shipments.penalty_cost odzwierciedla koszty poniesione w wyniku pominięć dostawy. Właściwość skippedShipments zawiera informacje o tym, które przesyłki zostały pominięte.

W tym przykładzie pominięto tylko żądanie model.shipments[1] w przykładowym żądaniu. model.shipments[1] ma koszt karny wynoszący 5 jednostek, co jest zgodne z łącznym kluczem model.shipments.penalty_cost w przykładowej odpowiedzi. penaltyCost w porównaniu z 40,0 costPerHour i 10,0 (costPerKilometer) w usłudze Vehicle sprawia, że pominięcie przesyłki jest bardziej opłacalne niż jej ukończenie.

Zagadnienie zaawansowane: koszty i niezmienne ograniczenia

Kilka właściwości komunikatów OptimizeToursRequest (REST i gRPC) reprezentuje ograniczenia pozorne, czyli ograniczenia, które powodują koszty, gdy nie można ich spełnić.

Na przykład ograniczenia dotyczące pojazdu LoadLimit (REST, gRPC) mają właściwości softMaxLoad i costPerUnitAboveSoftMax. Łącznie powodują one naliczanie kosztów proporcjonalnych do jednostek obciążenia przekraczających softMaxLoad, dzięki czemu limit można przekroczyć tylko wtedy, gdy ma to sens z punktu widzenia kosztów.

Podobnie ograniczenia TimeWindow (REST, gRPC) mają właściwości soft_start_time i soft_end_time z odpowiadającymi im właściwościami cost_per_hour_before_soft_start_time i cost_per_hour_after_soft_end_time, które są zgłaszane w zależności od tego, jak wczesna lub późna występuje zdarzenie ograniczenia w odniesieniu do TimeWindow.

Tak jak w przypadku wszystkich parametrów modelu kosztów, koszty łagodnego ograniczenia są wyrażone w tych samych jednostkach bezwymiarowych co inne parametry kosztów.

Szczegółowy opis ograniczeń typu LoadLimit znajdziesz w artykule Żądania i limity obciążenia. Ograniczenia TimeWindow zostały szczegółowo omówione w artykule Ograniczenia dotyczące przedziału czasu odbioru i dostawy.