jsprit начало работы: концептуальные советы

Извините, это не конкретный вопрос. Поскольку я новичок в Jsprit, мне нужна концептуальная помощь в том, как начать решать проблему.

Мой пример:

Я начал с того, что у меня было только одно транспортное средство с начальной и конечной позициями. Есть несколько позиций самовывоза с приоритетами и только одна позиция склада для доставки. Транспортное средство должно двигаться 1 день, затем 2 дня перерыва, чем еще один день с заданным временем начала/окончания для каждого дня. Начальная/конечная позиции определяются в день (1 и 4). Транспортное средство может вернуться в конечную позицию в 1-й день с грузом, но на 4-й день последней позицией должно быть депо для разгрузки (и возврата пустым).

Я хочу забрать как можно больше предметов, основываясь на приоритете и ограничении загрузки транспортных средств 2d, если будет слишком много пикапов, они будут проигнорированы. Транспортное средство может возвращаться в депо для разгрузки несколько раз в день. Я также подумал об изменении приоритетов подбора предметов перед началом 4-го дня.

  • Любые идеи?
  • Есть ли преимущество/разница между определением пунктов самовывоза и доставок по отдельности вместо использования отгрузок?
  • Думал определить 2 машины вместо определения перерыва, но не хочу выгружаться в первый день. Я читал это можно сделать с помощью 2-х драйверов, глядя на API и настройки драйверов не знаю как. https://discuss.graphhopper.com/t/3-questions-endlocation-and-multiple-vehicles/414/8 Класс Driver имеет свойство home, но это строка, разрывы могут быть определены только для транспортного средства.
  • Должен ли я запускать решатель дважды и удалять пикапы уже в моем первом маршруте, прежде чем запускать его на 4-й день? + объединить результаты потом?
  • Как реализовать ограничение на загрузку только в том случае, если нагрузка достигает 85%?
  • Как реализовать ограничение, согласно которому последней позицией на 4-й день должно быть депо перед возвратом в конечную позицию (даже ‹85%, если все пикапы сделаны)?

person Wolfgang    schedule 05.02.2020    source источник


Ответы (1)


Я бы запускал решение два раза в неделю и удалял все остановки, которые должны быть завершены в первый день, поскольку они больше не требуются для следующего решения. Если грузовик может стартовать где угодно на второй день, то начальное местоположение нужно будет обновить на второй день. В противном случае, если он начинается со склада в оба дня, начальное и конечное местоположение будут одинаковыми для обоих дней.

Сначала вы хотите определить тип вашего транспортного средства и транспортное средство:

// Vehicle Type
VehicleTypeImpl vehicleType = VehicleTypeImpl.Builder.newInstance("Your vehicle type")
    .addCapacityDimension(0, capacity)
    .setMaxVelocity(maxSpeed) // in meters per second
    .setCostPerDistance(value)
    .build();

VehicleImpl vehicle = VehicleImpl.Builder.newInstance(fleet[i])
    .setType(vehicleType)
    .setEarliestStart(start).setLatestArrival(end)
    .setStartLocation(location) // Warehouse location
    .setEndLocation(location) // warehouse location
    .build();

Затем создайте свои рабочие места. Задания по обслуживанию запускаются со склада, а задания по самовывозу могут начинаться из магазина и доставляться в целевое место. При этом я бы определил задания pickups и service, а затем добавил их в VRP:

// Service Jobs
Service.Builder.newInstance(instanceName)
    .setName("Unique Name").setLocation(
         new Location.Builder()
         .newInstance().setId("Unique ID")
         .setCoordinate(new Coordinate(x, y))
    )
    .addSizeDimension(0, 1) // accounts for vehicle capacity
    .build();

// Shipment Jobs
Shipment.Builder.newInstance(instanceName)
    .setName("Unique Name")
    .setPickupLocation(
         new Location.Builder()
         .newInstance().setId("Unique ID")
         .setCoordinate(new Coordinate(x, y))
    )
    .setDeliveryLocation(
         new Location.Builder()
         .newInstance().setId("Unique ID")
         .setCoordinate(new Coordinate(x, y))
    )
    .addSizeDimension(0, 1)
    .build();

// You can add priorities to jobs how you like with .setPriority()

Вы можете просмотреть свои задания и создать любое задание на основе типа и добавить его в файл VRP. Кроме того, изучение матрицы затрат может помочь с вашим решением. (Проверьте: Использование матрицы затрат)

После этого запустите свое решение.

Ваше здоровье!

person matt6frey    schedule 27.05.2020