Оптапланнер VRP с датчиками перед выпадением

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

  1. Пикапы только перед DropOffs
  2. Принять определенный путь на пути к клиентам.

Цель состоит в том, чтобы забрать группу клиентов, которые собираются в пункты назначения, которые находятся близко друг к другу, и поместить их в один и тот же автомобиль.

Заранее спасибо! Я ценю помощь!

Проблема очень похожа на пример VRW TimeWindow, но со следующими изменениями.

  • Клиенты будут забраны в фиксированных местах (в цепи)
  • У каждого покупателя будет пункт назначения (за пределами
    Circuit)
  • Транспортное средство не отправится в высадку, а затем снова вернется в пикап. (Как только транспортное средство покидает цепь, все, что он делает, это высылает своих клиентов в заданное место)
  • Транспортное средство, движущееся по кругу, должно двигаться по определенному пути (представьте улицу с односторонним движением)

Планирование использования расстояний между дорогами со счетом между пикапами известно. Pickup -> Drop-Off не известен (Планирование использования Air).

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

Моей главной идеей было сделать следующее.

  • Добавлен атрибут TYPE для клиента, чтобы различать пикап и клиента
  • В класс клиента добавлен переменный прослушиватель, который отслеживает все DropOffIds, когда транспортное средство прибывает к нему, так что он отправляется в dropOffLocation, только если пассажир направляется в это место. Когда транспортное средство прибывает в dropOff, оно удаляет этот элемент из списка. (По сути служит стеком).
  • Теоретически проблема в том, что это не остановка транспортного средства, подбирающего покупателя, а затем подбирающего другого, если места для покупателей находятся относительно близко.
  • Также, имея трудное время для обеспечения фиксированного маршрута, по которому транспортное средство должно идти по кругу, планировалось использовать матрицу затрат, чтобы использовать мягкое ограничение для обеспечения неявности маршрута (транспортное средство не пойдет назад или пропустит точку, поскольку стоимость будет слишком высокой высокий), но работает не так, как должно быть.

1 ответ

Я мог бы рассмотреть модель домена следующим образом:

@PlanningEntity
class Pickup implements PickupOrVehicle {
    Customer customer;

    @PlanningVariable
    PickupOrVehicle previousPickup;

    @PlanningVariable
    int dropOffPriority;

}
@PlanningEntity // Shadow entity
class Vehicle implements PickupOrVehicle {
    ...

    @ShadowVariable(based on dropOffPriority and previousPickup)
    List<Customer> dropOffOrderList;

    // For consistency we might also add pickUpOrderList
}

Тот dropOffPriority должен быть глобально уникальным (путем его уникальной инициализации и настройки только SwapMoves для этой переменной.

Или иначе, VariableListener должен просто заказать 2 назначения с одинаковыми dropOffPriority по идентификатору их клиента (потому что заказ должен быть детерминированным!).

Не уверен, что это будет хорошо работать. Если вы попробуете это, сообщите нам здесь, хорошо это работает или нет.

Другие вопросы по тегам