Как я могу гарантировать, что сервисы будут находиться на одном и том же маршруте с использованием ограничений?
Я пытаюсь использовать ограничения Jsprit, чтобы маршрут решения имел определенный набор сервисов. Учитывая сервисы [S1, S2, S3, ..., S10]
Я хочу убедиться, что услуги [S2, S4, S6]
происходят по тому же маршруту..
Для этого я использую HardRouteConstraint
..
@Override
public boolean fulfilled(JobInsertionContext context) {
// jobIds = [S2, S4, S6]
Job thisJob = context.getJob();
if (jobIds.contains(thisJob.getId())) {
for (String jobId : jobIds) {
VehicleRoute route = stateManager.getProblemState(stateManager.createStateId(jobId), VehicleRoute.class);
// if the jobs are assigned to a different route, reject this route
if (route != null && route != context.getRoute()) return false;
}
}
return true;
}
Это работает частично нормально.. Если S2
, S4
а также S6
являются частью решения, они появляются в одном маршруте и не разделяются на разные маршруты.
Проблема в том, что если у меня ограниченная вместимость автомобиля (скажем, 3), Jsprit может вернуть решение, подобное:
Routes: [
[S1, S2, S3]
[S5, S7, S8]
[S9, S10]
]
Unassigned Jobs: [S4, S6]
Это понятно, но не то, что я хочу.. Я хочу, чтобы, если маршрут включает S2
, это также должно включать S4
а также S6
, в любом порядке..
Как я могу убедиться, что действительное решение не содержит такие маршруты: [X, S2, Y]
или же [S2, X, S4]
..
Спасибо асим