Skip to content

Stop Mixing

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.

Field name Required Data type SI Unit Defined on Example Configurable via defaults
mixing_items No map of string to mix_item NA stop {"mixing_items": {"hazchem": {"name": "F-A-W-E","quantity": 1}}
  • mix_item

    Field name Required Data type Description Example
    name Yes string Name of the "ingredient" to avoid mixing. {"id": "vegan"}
    quantity Yes int Quantity the stop adds / removes of the "ingredient" {"quantity": 1}

In vehicle routing problems, sometimes stops can not be on a vehicle at the same time if they have a conflict. We refer to this as a mixing, or rather no-mixing, constraint. For example, some countries may require that vegan food is never in a vehicle at the same time as meat products. The vehicle can service both vegan and meat products in the route, but they can never be in the vehicle at the same time.

The no mix feature allows you to define mixing items and quantities on stops, and the engine will avoid routes which mix items of different types at the same time on the vehicle.

Here is an example that defines mixing items on stops. A sample output obtained after solving the problem is also shown.

{
  "stops": [
    {
      "id": "Fushimi Inari Taisha",
      "location": { "lon": 135.772695, "lat": 34.967146 },
      "precedes": "Kiyomizu-dera",
      "mixing_items": {
        "hazchem": {
          "name": "F-A-W-E",
          "quantity": 1
        }
      }
    },
    {
      "id": "Kiyomizu-dera",
      "location": { "lon": 135.78506, "lat": 34.994857 },
      "mixing_items": {
        "hazchem": {
          "name": "F-A-W-E",
          "quantity": -1
        }
      }
    },
    {
      "id": "Nijō Castle",
      "location": { "lon": 135.748134, "lat": 35.014239 },
      "precedes": "Kyoto Imperial Palace",
      "mixing_items": {
        "hazchem": {
          "name": "S-P-W-E",
          "quantity": 1
        }
      }
    },
    {
      "id": "Kyoto Imperial Palace",
      "location": { "lon": 135.762057, "lat": 35.025431 },
      "mixing_items": {
        "hazchem": {
          "name": "S-P-W-E",
          "quantity": -1
        }
      }
    },
    {
      "id": "Gionmachi",
      "location": { "lon": 135.775682, "lat": 35.002457 },
      "precedes": "Kinkaku-ji",
      "mixing_items": {
        "hazchem": {
          "name": "S-P-W-E",
          "quantity": 1
        }
      }
    },
    {
      "id": "Kinkaku-ji",
      "location": { "lon": 135.728898, "lat": 35.039705 },
      "mixing_items": {
        "hazchem": {
          "name": "S-P-W-E",
          "quantity": -1
        }
      }
    },
    {
      "id": "Arashiyama Bamboo Forest",
      "location": { "lon": 135.672009, "lat": 35.017209 }
    }
  ],
  "vehicles": [
    {
      "id": "v1",
      "speed": 20
    }
  ]
}
{
  "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",
        "objectives": [
          {
            "base": 912.631200191493,
            "factor": 1,
            "name": "vehicles_duration",
            "value": 912.631200191493
          },
          {
            "factor": 1,
            "name": "unplanned_penalty",
            "value": 0
          }
        ],
        "value": 912.631200191493
      },
      "unplanned": [],
      "vehicles": [
        {
          "id": "v1",
          "route": [
            {
              "cumulative_travel_duration": 0,
              "mix_items": {
                "hazchem": {
                  "name": "F-A-W-E",
                  "quantity": 1
                }
              },
              "stop": {
                "id": "Fushimi Inari Taisha",
                "location": {
                  "lat": 34.967146,
                  "lon": 135.772695
                }
              },
              "travel_duration": 0
            },
            {
              "cumulative_travel_distance": 3280,
              "cumulative_travel_duration": 164,
              "mix_items": {
                "hazchem": {
                  "name": "F-A-W-E",
                  "quantity": 0
                }
              },
              "stop": {
                "id": "Kiyomizu-dera",
                "location": {
                  "lat": 34.994857,
                  "lon": 135.78506
                }
              },
              "travel_distance": 3280,
              "travel_duration": 164
            },
            {
              "cumulative_travel_distance": 4481,
              "cumulative_travel_duration": 224,
              "mix_items": {
                "hazchem": {
                  "name": "S-P-W-E",
                  "quantity": 1
                }
              },
              "stop": {
                "id": "Gionmachi",
                "location": {
                  "lat": 35.002457,
                  "lon": 135.775682
                }
              },
              "travel_distance": 1201,
              "travel_duration": 60
            },
            {
              "cumulative_travel_distance": 7311,
              "cumulative_travel_duration": 365,
              "mix_items": {
                "hazchem": {
                  "name": "S-P-W-E",
                  "quantity": 2
                }
              },
              "stop": {
                "id": "Nijō Castle",
                "location": {
                  "lat": 35.014239,
                  "lon": 135.748134
                }
              },
              "travel_distance": 2830,
              "travel_duration": 141
            },
            {
              "cumulative_travel_distance": 9087,
              "cumulative_travel_duration": 454,
              "mix_items": {
                "hazchem": {
                  "name": "S-P-W-E",
                  "quantity": 1
                }
              },
              "stop": {
                "id": "Kyoto Imperial Palace",
                "location": {
                  "lat": 35.025431,
                  "lon": 135.762057
                }
              },
              "travel_distance": 1776,
              "travel_duration": 88
            },
            {
              "cumulative_travel_distance": 12497,
              "cumulative_travel_duration": 625,
              "mix_items": {
                "hazchem": {
                  "name": "S-P-W-E",
                  "quantity": 0
                }
              },
              "stop": {
                "id": "Kinkaku-ji",
                "location": {
                  "lat": 35.039705,
                  "lon": 135.728898
                }
              },
              "travel_distance": 3410,
              "travel_duration": 170
            },
            {
              "cumulative_travel_distance": 18249,
              "cumulative_travel_duration": 912,
              "mix_items": {
                "hazchem": {
                  "name": "",
                  "quantity": 0
                }
              },
              "stop": {
                "id": "Arashiyama Bamboo Forest",
                "location": {
                  "lat": 35.017209,
                  "lon": 135.672009
                }
              },
              "travel_distance": 5752,
              "travel_duration": 287
            }
          ],
          "route_duration": 912,
          "route_travel_distance": 18249,
          "route_travel_duration": 912
        }
      ]
    }
  ],
  "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"
  }
}