Parametry modelu kosztu

Wiadomość OptimizeToursRequest (REST, gRPC) zawiera wiele właściwości związanych z kosztami. Te parametry kosztów razem stanowią model kosztowy prośby. Model kosztów uwzględnia wiele ogólnych celów optymalizacji żądania, takich jak:

  • priorytetem są szybsze Vehicle trasy, a nie krótsze,
  • Decyzja, czy koszt realizacji Shipment jest wart wartości wynikającej z ukończenia Shipment
  • odbiór i dostawę w określonych przedziałach czasowych tylko wtedy, gdy jest to opłacalne;

Przykładowe zgłoszenie z koszty

{
  "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 kosztu

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

  • Vehicle.cost_per_hour: koszt eksploatacji pojazdu na godzinę, w tym czas przejazdu, oczekiwania, wizyty i przerw.
  • Vehicle.cost_per_kilometer: koszt przejechania 1 km przez pojazd.
  • Vehicle.cost_per_traveled_hour: reprezentuje koszt eksploatacji pojazdu tylko w trakcie przejazdu, z wyłączeniem czasu oczekiwania, wizyt i przerwy.

Te parametry kosztów umożliwiają optymalizatorowi dokonywanie kompromisów między czasem a przebytą odległością. Koszty poniesione na podstawie zoptymalizowanej trasy są widoczne w odpowiedzi w formie metrics.costs:

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

Shipment właściwości kosztu

Wiadomość Shipment (REST, gRPC) zawiera też kilka parametrów kosztów:

  • Shipment.penalty_cost to koszt poniesiony w wyniku pominięcia przesyłki.
  • Shipment.VisitRequest.cost to koszt określonego odbioru lub dostawy, który służy głównie do porównywania kosztów różnych opcji odbioru lub dostawy w przypadku jednej przesyłki.

Parametry kosztów Shipment używają tych samych bezwymiarowych jednostek co parametry kosztów Vehicle. Jeśli koszt poniesiony w ramach Shipment przekracza koszt kary, Shipment nie jest uwzględniany na żadnym z trasa Vehicle, a zamiast tego pojawia się na liście skipped_shipments w wiadomości z odpowiedzią.

ShipmentModel właściwości kosztu

Komunikat ShipmentModel (REST, gRPC) zawiera jedną właściwość kosztu globalDurationCostPerHour. Koszt ten jest ponoszony na podstawie łącznego czasu wymaganego na wykonanie ShipmentRoute przez wszystkie pojazdy. Zwiększenie wartości globalDurationCostPerHour spowoduje, że priorytetem będzie wcześniejsze zrealizowanie wszystkich przesyłek.

Właściwości odpowiedzi z optymalizacji trasy dotyczące kosztów

Komunikat OptimizeToursResponse (REST, gRPC) ma właściwości kosztu, które reprezentują koszty poniesione w procesie realizacji ShipmentRoute. Właściwości metrics.costsmetrics.totalCost w odpowiedzi reprezentują liczbę jednostek kosztu poniesionych na wszystkich trasach. Każdy wpis routes ma właściwości routeCosts i routeTotalCosts, które przedstawiają koszty na danej trasie.

Odpowiedź na przykładowe zgłoszenie z koszty

{
  "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 elementy najwyższego poziomu 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 to koszt poniesiony z powodu pominięć dostawy. Właściwość skippedShipments zawiera listę pominanych przesyłek.

W tym przykładzie pominięto tylko element model.shipments[1] w przykładowym żądaniu. model.shipments[1] ma koszt kary równy 5 jednostkom, który jest zgodny z kluczem total model.shipments.penalty_cost w przykładowej odpowiedzi. Wysyłka z niskim penaltyCost w porównaniu z Vehicle 40,0 costPerHour i 10,0 costPerKilometer sprawia, że pominięcie wysyłki jest bardziej opłacalne niż jej zrealizowanie.

Zaawansowany temat: koszty i miękkie ograniczenia

Niektóre właściwości wiadomości OptimizeToursRequest (REST, gRPC) stanowią miękkie ograniczenia, które powodują powstanie kosztów, gdy nie mogą zostać spełnione.

Na przykład ograniczenia dotyczące pojazdu LoadLimit (REST, gRPC) mają właściwości softMaxLoadcostPerUnitAboveSoftMax. Razem powodują one koszty proporcjonalne do jednostek obciążenia, które przekraczają wartość softMaxLoad, co pozwala przekroczyć limit tylko wtedy, gdy ma to sens z punktu widzenia kosztów.

Podobnie ograniczenia TimeWindow (REST, gRPC) mają właściwości soft_start_timesoft_end_time oraz odpowiadające im właściwości cost_per_hour_before_soft_start_timecost_per_hour_after_soft_end_time, które są generowane na podstawie tego, jak wcześnie lub późno zdarzenie ograniczone występuje w stosunku do TimeWindow.

Podobnie jak w przypadku wszystkich parametrów modelu kosztu, koszty ograniczeń miękkich są wyrażone w tych samych bezwymiarowych jednostkach co inne parametry kosztu.

Ograniczenia LoadLimit są szczegółowo omawiane w artykule Potrzeby i limity obciążenia. Ograniczenia TimeWindow są szczegółowo opisane w ograniczeniach dotyczących czasu odbioru i dostawy.