Мы используем настраиваемый учебный пример VRP , чтобы оптимизировать ежедневные маршруты для сервисных инженеров, которые едут к клиентам, чтобы выполнить определенные задачи по ремонту и установке. У нас есть время windows, и мы оптимизируем более 1000 задач на несколько недель в будущем.
Наша (упрощенная) модель предметной области состоит из:
- Инженер - парень, выполняющий всю работу
- Задание - одно рабочее задание в определенном месте
- DailyRoute - маршрут Инженера на данный день, состоит из связанного списка задач
В качестве нового требования теперь мы должны поддерживать двух инженеров , работающих в параллельно над одной и той же задачей.
Наш текущий план заключается в реализации этого путем создать подзадач для второго инженера и внедрить правило, согласно которому время их прибытия должно быть идентично основной задаче. Однако это проблематично c, поскольку перемещение одной из взаимозависимых задач в другое время (например, в другой DailyRoute) будет в основном нарушать вышеуказанное ограничение.
Пока что мы пришли со следующими идеями:
- Разрешить одиночное задание перемещается только в DailyRoute в в тот же день , как и маршрут, назначенный другим заданием
- может быть сделано с помощью SelectionFilter
- Используйте CompositeMoves для одновременного перемещения обеих параллельных задач на разные дни
- Нужен ли нам собственный MoveIteratorFactory для выбора подключенных задач?
- Или это можно сделать с помощью CartesianProductMoveSelector вместо этого?
- Можем ли мы использовать соседний выбор для второго перемещения, предпочитая тот же день, что и первый назначенный день первого хода (уже сделан ли ход в то время)?