В сценарии повторного решения ранее решенной проблемы (конечно, с некоторыми новыми данными), как правило, невозможно переназначить самое первое назначение транспортного средства после того, как оно было дано. Драйвер уже в пути, и любое новое решение должно учитывать следующее:
- работа должна оставаться его (не может быть назначена на другой автомобиль)
- деятельность, которая была назначена ему как самая первая, должна оставаться таковой в будущих решениях
Для простоты я использую сценарий с одним транспортным средством и пытаюсь применить только вторую пулю (т.е. гарантировать, что определенное действие будет первым в решении).
Вот как я определил ограничение:
new HardActivityConstraint()
{
@Override
public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct,
double prevActDepTime)
{
String locationId = newAct.getLocation().getId();
// we want to make sure that any solution will have "C1" as its first activity
boolean activityShouldBeFirst = locationId.equals("C1");
boolean attemptingToInsertFirst = (prevAct instanceof Start);
if (activityShouldBeFirst && !attemptingToInsertFirst)
return ConstraintsStatus.NOT_FULFILLED_BREAK;
if (!activityShouldBeFirst && attemptingToInsertFirst)
return ConstraintsStatus.NOT_FULFILLED;
return ConstraintsStatus.FULFILLED;
}
}
Вот как я строю алгоритм:
VehicleRoutingAlgorithmBuilder vraBuilder;
vraBuilder = new VehicleRoutingAlgorithmBuilder(vrpProblem, "schrimpf.xml");
vraBuilder.addCoreConstraints();
vraBuilder.addDefaultCostCalculators();
StateManager stateManager = new StateManager(vrpProblem);
ConstraintManager constraintManager = new ConstraintManager(vrpProblem, stateManager);
constraintManager.addConstraint(new HardActivityConstraint() { ... }, Priority.HIGH);
vraBuilder.setStateAndConstraintManager(stateManager, constraintManager);
VehicleRoutingAlgorithm algorithm = vraBuilder.build();
Результаты не очень хорошие. Я получаю решения только с одной назначенной работой (той, которая требует активности). При отладке ясно, что итерации вставки заданий учитывают множество жизнеспособных вариантов, которые, по-видимому, полностью решают проблему, но в конечном итоге лучшее решение, возвращаемое алгоритмом, не включает другие задания.
ОБНОВЛЕНИЕ: еще более удивительно то, что когда я использую ограничение в сценариях с более чем 5 транспортными средствами, оно работает нормально (худшие результаты - с 1 транспортным средством).
При необходимости я с удовольствием приложу дополнительную информацию.
Спасибо Зак