Skip to content

Early arrival time penalty

Info

This feature is configurable via .json input, without the need for code customization and is available for both the Marketplace app and Platform. You can find a list of all available features.

Info

The format for timestamps should be RFC3339, e.g.: "2023-01-01T00:00:00Z".

Field name Required Data type SI Unit Defined on Example Configurable via defaults
target_arrival_time No timestamp NA stop {"target_arrival_time": "2023-01-01T00:00:00Z"}
early_arrival_time_penalty No float NA stop {"early_arrival_time_penalty": 1.23}

The early_arrival_time_penalty is a cost applied to the objective (value function) when a vehicle arrives at a stop before the given target_arrival_time. These fields are defined on stops, and are useful for discouraging behavior such as ride sharing vehicles arriving too early for an airport pickup.

The value added to the objective is calculated as follows:

early_arrival_time_penalty * max(target_arrival_time - arrival_time, 0)

For example, if a vehicle arrives at a stop 60 seconds before a target arrival time and the penalty is set to 10, 600 seconds are added to the value function.

Please note that:

  • The time duration given by target_arrival_time - arrival_time is in seconds.
  • When defining an early_arrival_time_penalty on a stop, you must also define a target_arrival_time for that stop.
  • Specifying early_arrival_time_penalty and target_arrival_time on a stop brings additional information on the output. For example, the early_arrival_duration of the stop defines the time duration given by target_arrival_time - arrival_time in seconds, when greater than zero.

Here is an example defining penalties for all stops. A sample output obtained after solving the problem is also shown.

{
  "defaults": {
    "vehicles": {
      "speed": 20,
      "start_time": "2023-01-01T12:00:00Z"
    },
    "stops": {
      "early_arrival_time_penalty": 1.5,
      "unplanned_penalty": 2000000
    }
  },
  "stops": [
    {
      "id": "Fushimi Inari Taisha",
      "location": { "lon": 135.772695, "lat": 34.967146 },
      "target_arrival_time": "2023-01-01T12:00:00Z"
    },
    {
      "id": "Kiyomizu-dera",
      "location": { "lon": 135.78506, "lat": 34.994857 },
      "target_arrival_time": "2023-01-01T12:05:00Z"
    },
    {
      "id": "Nijō Castle",
      "location": { "lon": 135.748134, "lat": 35.014239 },
      "target_arrival_time": "2023-01-01T12:10:00Z"
    },
    {
      "id": "Kyoto Imperial Palace",
      "location": { "lon": 135.762057, "lat": 35.025431 },
      "target_arrival_time": "2023-01-01T12:15:00Z"
    },
    {
      "id": "Gionmachi",
      "location": { "lon": 135.775682, "lat": 35.002457 },
      "target_arrival_time": "2023-01-01T12:20:00Z"
    },
    {
      "id": "Kinkaku-ji",
      "location": { "lon": 135.728898, "lat": 35.039705 },
      "target_arrival_time": "2023-01-01T12:25:00Z"
    },
    {
      "id": "Arashiyama Bamboo Forest",
      "location": { "lon": 135.672009, "lat": 35.017209 },
      "target_arrival_time": "2023-01-01T12:30:00Z"
    }
  ],
  "vehicles": [
    {
      "id": "v1"
    },
    {
      "id": "v2"
    }
  ]
}
{
  "options": {
    "check": {
      "duration": 30000000000,
      "verbosity": "off"
    },
    "format": {
      "disable": {
        "progression": true
      }
    },
    "model": {
      "constraints": {
        "disable": {
          "attributes": false,
          "capacities": null,
          "capacity": false,
          "distance_limit": false,
          "groups": false,
          "maximum_duration": false,
          "maximum_stops": false,
          "maximum_wait_stop": false,
          "maximum_wait_vehicle": false,
          "mixing_items": false,
          "precedence": false,
          "start_time_windows": false,
          "vehicle_end_time": false,
          "vehicle_start_time": false
        },
        "enable": {
          "cluster": false
        }
      },
      "objectives": {
        "capacities": "",
        "cluster": 0,
        "distance": 0,
        "early_arrival_penalty": 1,
        "late_arrival_penalty": 1,
        "min_stops": 1,
        "stop_balance": 0,
        "travel_duration": 0,
        "unplanned_penalty": 1,
        "vehicle_activation_penalty": 1,
        "vehicles_duration": 1
      },
      "properties": {
        "disable": {
          "duration_groups": false,
          "durations": false,
          "initial_solution": false,
          "stop_duration_multipliers": false
        },
        "maximum_time_horizon": 15552000
      },
      "validate": {
        "disable": {
          "resources": false,
          "start_time": false
        },
        "enable": {
          "matrix": false,
          "matrix_asymmetry_tolerance": 20
        }
      }
    },
    "solve": {
      "duration": 10000000000,
      "iterations": 50,
      "parallel_runs": 1,
      "plateau": {
        "absolute_threshold": -1,
        "delay": 0,
        "duration": 0,
        "iterations": 0,
        "relative_threshold": 0
      },
      "run_deterministically": true,
      "solver": {
        "plan_group_size": {
          "delta": 0,
          "delta_after_iterations": 1000000000,
          "max_value": 2,
          "min_value": 2,
          "snap_back_after_improvement": true,
          "start_value": 2,
          "zigzag": true
        },
        "unplan_units": {
          "delta": 2,
          "delta_after_iterations": 125,
          "max_value": -1,
          "min_value": 2,
          "snap_back_after_improvement": true,
          "start_value": 2,
          "zigzag": true
        },
        "unplan_weights": "Vehicle:3,Island:1,Location:293"
      },
      "start_solutions": 1
    }
  },
  "solutions": [
    {
      "objective": {
        "name": "1 * vehicles_duration + 1 * unplanned_penalty + 1 * early_arrival_penalty",
        "objectives": [
          {
            "base": 1927.0009486675262,
            "factor": 1,
            "name": "vehicles_duration",
            "value": 1927.0009486675262
          },
          {
            "factor": 1,
            "name": "unplanned_penalty",
            "value": 0
          },
          {
            "base": 2753.8426129817963,
            "factor": 1,
            "name": "early_arrival_penalty",
            "value": 2753.8426129817963
          }
        ],
        "value": 4680.8435616493225
      },
      "unplanned": [],
      "vehicles": [
        {
          "id": "v1",
          "route": [
            {
              "arrival_time": "2023-01-01T12:00:00Z",
              "cumulative_travel_duration": 0,
              "early_arrival_duration": 900,
              "end_time": "2023-01-01T12:00:00Z",
              "start_time": "2023-01-01T12:00:00Z",
              "stop": {
                "id": "Kyoto Imperial Palace",
                "location": {
                  "lat": 35.025431,
                  "lon": 135.762057
                }
              },
              "target_arrival_time": "2023-01-01T12:15:00Z",
              "travel_duration": 0
            },
            {
              "arrival_time": "2023-01-01T12:05:27Z",
              "cumulative_travel_distance": 6553,
              "cumulative_travel_duration": 327,
              "end_time": "2023-01-01T12:05:27Z",
              "start_time": "2023-01-01T12:05:27Z",
              "stop": {
                "id": "Fushimi Inari Taisha",
                "location": {
                  "lat": 34.967146,
                  "lon": 135.772695
                }
              },
              "target_arrival_time": "2023-01-01T12:00:00Z",
              "travel_distance": 6553,
              "travel_duration": 327
            },
            {
              "arrival_time": "2023-01-01T12:14:24Z",
              "cumulative_travel_distance": 17282,
              "cumulative_travel_duration": 864,
              "early_arrival_duration": 936,
              "end_time": "2023-01-01T12:14:24Z",
              "start_time": "2023-01-01T12:14:24Z",
              "stop": {
                "id": "Arashiyama Bamboo Forest",
                "location": {
                  "lat": 35.017209,
                  "lon": 135.672009
                }
              },
              "target_arrival_time": "2023-01-01T12:30:00Z",
              "travel_distance": 10729,
              "travel_duration": 536
            },
            {
              "arrival_time": "2023-01-01T12:22:23Z",
              "cumulative_travel_distance": 26865,
              "cumulative_travel_duration": 1343,
              "end_time": "2023-01-01T12:22:23Z",
              "start_time": "2023-01-01T12:22:23Z",
              "stop": {
                "id": "Gionmachi",
                "location": {
                  "lat": 35.002457,
                  "lon": 135.775682
                }
              },
              "target_arrival_time": "2023-01-01T12:20:00Z",
              "travel_distance": 9583,
              "travel_duration": 479
            },
            {
              "arrival_time": "2023-01-01T12:23:23Z",
              "cumulative_travel_distance": 28066,
              "cumulative_travel_duration": 1403,
              "end_time": "2023-01-01T12:23:23Z",
              "start_time": "2023-01-01T12:23:23Z",
              "stop": {
                "id": "Kiyomizu-dera",
                "location": {
                  "lat": 34.994857,
                  "lon": 135.78506
                }
              },
              "target_arrival_time": "2023-01-01T12:05:00Z",
              "travel_distance": 1201,
              "travel_duration": 60
            },
            {
              "arrival_time": "2023-01-01T12:29:20Z",
              "cumulative_travel_distance": 35209,
              "cumulative_travel_duration": 1760,
              "end_time": "2023-01-01T12:29:20Z",
              "start_time": "2023-01-01T12:29:20Z",
              "stop": {
                "id": "Kinkaku-ji",
                "location": {
                  "lat": 35.039705,
                  "lon": 135.728898
                }
              },
              "target_arrival_time": "2023-01-01T12:25:00Z",
              "travel_distance": 7143,
              "travel_duration": 357
            },
            {
              "arrival_time": "2023-01-01T12:32:07Z",
              "cumulative_travel_distance": 38538,
              "cumulative_travel_duration": 1927,
              "end_time": "2023-01-01T12:32:07Z",
              "start_time": "2023-01-01T12:32:07Z",
              "stop": {
                "id": "Nijō Castle",
                "location": {
                  "lat": 35.014239,
                  "lon": 135.748134
                }
              },
              "target_arrival_time": "2023-01-01T12:10:00Z",
              "travel_distance": 3329,
              "travel_duration": 166
            }
          ],
          "route_duration": 1927,
          "route_travel_distance": 38538,
          "route_travel_duration": 1927
        },
        {
          "id": "v2",
          "route": [],
          "route_duration": 0,
          "route_travel_duration": 0
        }
      ]
    }
  ],
  "statistics": {
    "result": {
      "custom": {
        "activated_vehicles": 1,
        "max_duration": 0.123,
        "max_stops_in_vehicle": 7,
        "max_travel_duration": 0.123,
        "min_duration": 0.123,
        "min_stops_in_vehicle": 7,
        "min_travel_duration": 0.123,
        "unplanned_stops": 0
      },
      "duration": 0.123,
      "value": 0.123
    },
    "run": {
      "duration": 0.123,
      "iterations": 50
    },
    "schema": "v1"
  },
  "version": {
    "sdk": "VERSION"
  }
}