Parametry modelu kosztów

Deweloperzy z Europejskiego Obszaru Gospodarczego (EOG)

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

  • Nadawanie priorytetu szybszym trasom Vehicle kosztem krótszych lub odwrotnie
  • Określanie, czy koszt dostarczenia Shipment jest wart wartości ukończenia Shipment.
  • Realizowanie odbiorów i dostaw w określonych 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 kosztu

Wiadomość Vehicle (REST, gRPC) ma kilka właściwości związanych z kosztem:

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

Te parametry kosztów umożliwiają optymalizatorowi dokonywanie kompromisów między czasem a przebytą odległością. Koszty poniesione na optymalnej trasie pojawiają się w odpowiedzi jako metrics.costs:

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

którą można pokonać w dozwolonym przedziale czasu, niezależnie od długości czy czasu trwania.

Shipment właściwości kosztu

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

  • Shipment.penalty_cost reprezentuje koszt poniesiony w wyniku pominięcia przesyłki. Nie ustawienie parametru penalty_cost przesyłki sprawia, że przesyłka jest obowiązkowa, co oznacza, że zostanie pominięta tylko wtedy, gdy nie można jej zrealizować z uwzględnieniem określonych ograniczeń.
  • Shipment.VisitRequest.cost reprezentuje koszt konkretnego odbioru lub dostawy. Jest używany głównie do umożliwienia kompromisu między wieloma opcjami odbioru lub dostawy w przypadku jednej przesyłki.

Parametry kosztu Shipment używają tych samych jednostek bezwymiarowych co parametry kosztu Vehicle. Koszt poniesiony w celu ukończenia Shipment przekracza koszt kary, więc Shipment nie jest uwzględniony na trasie żadnego Vehicle, ale pojawia się na liście skipped_shipments w wiadomości z odpowiedzią.

ShipmentModel właściwości kosztu

Wiadomość ShipmentModel (REST, gRPC) zawiera jedną właściwość cost (koszt) – globalDurationCostPerHour. Ten koszt jest ponoszony na podstawie łącznego czasu potrzebnego wszystkim pojazdom na wykonanie ShipmentRoute. Zwiększenie globalDurationCostPerHour priorytetu wcześniejszego ukończenia wszystkich przesyłek.

Właściwości kosztów odpowiedzi Optymalizacji tras

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

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 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ętych przesyłek. Właściwość skippedShipments zawiera listę pominiętych przesyłek.

W tym przykładzie pomijany jest tylko parametr model.shipments[1] w przykładowym żądaniu. model.shipments[1] ma koszt kary w wysokości 5 jednostek, co odpowiada kluczowi model.shipments.penalty_cost w przykładzie odpowiedzi. Niska wartość przesyłki penaltyCost w porównaniu z wartością Vehicle40,0 costPerHour i 10,0 costPerKilometer sprawia, że bardziej opłaca się zrezygnować z przesyłki niż ją dostarczyć.

Temat zaawansowany: koszty i łagodne ograniczenia

Kilka właściwości OptimizeToursRequest wiadomości (REST, gRPC) reprezentuje miękkie ograniczenia, czyli ograniczenia, które generują koszt, gdy nie można ich spełnić.

Na przykład ograniczenia dotyczące pojazdu LoadLimit (REST, gRPC) mają właściwości softMaxLoadcostPerUnitAboveSoftMax. Łącznie generują one koszt proporcjonalny do jednostek obciążenia przekraczających softMaxLoad, co pozwala przekroczyć limit tylko wtedy, gdy ma to sens z punktu widzenia kosztów.

Podobnie TimeWindow ograniczenia (REST, gRPC) mają właściwości soft_start_timesoft_end_time, z odpowiednimi właściwościami cost_per_hour_before_soft_start_timecost_per_hour_after_soft_end_time, które są naliczane w zależności od tego, jak wcześnie lub późno wystąpi ograniczone zdarzenie w stosunku do TimeWindow.

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

Ograniczenia LoadLimit są szczegółowo omówione w artykule Wymagania dotyczące obciążenia i limity. Ograniczenia TimeWindow są szczegółowo omówione w artykule Ograniczenia dotyczące przedziału czasu odbioru i dostawy.