Как я могу гарантировать, что сервисы будут находиться на одном и том же маршруте с использованием ограничений?

Я пытаюсь использовать ограничения 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]..

Спасибо асим

0 ответов

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