Можно ли иметь два или несколько отправлений по одному и тому же маршруту с помощью жесткого ограничения.
Если нет, знаете ли вы другие библиотеки Java, которые могут обрабатывать такие ограничения?
Благодарю вас!
Можно ли иметь два или несколько отправлений по одному и тому же маршруту с помощью жесткого ограничения.
Если нет, знаете ли вы другие библиотеки Java, которые могут обрабатывать такие ограничения?
Благодарю вас!
Самый простой способ убедиться, что грузы находятся на одном и том же маршруте, — это пометить эти грузы с помощью навыка
shipmentBuilder.addRequiredSkill("tag")
но тогда вам нужно пометить и конкретное транспортное средство:
vehicleBuilder.addSkill("tag")
И убедитесь, что алгоритм учитывает навыки/эти теги (см. https://github.com/jsprit/jsprit/blob/master/WHATS_NEW.md — нужно использовать 1.3.2-SNAPSHOT).
Если вы не хотите назначать конкретному транспортному средству тег, вам необходимо реализовать core.problem.constraint.HardRouteStateLevelConstraint, который в основном представляет собой этот метод.
public boolean fulfilled(JobInsertionContext insertionContext)
Убедитесь, что insertionContext.getJob() [которое является вставляемым заданием] может быть вставлено в insertionContext.getRoute(). На этом этапе вам нужно знать две вещи:
Для последней информации вам необходимо определить состояния, которые предоставляют вам назначение рабочего маршрута. Я бы определил состояние проблемы и соответствующий ему модуль обновления следующим образом:
static class UpdateJobRouteAssignment implements StateUpdater,JobInsertedListener,InsertionStartsListener {
StateManager stateManager;
UpdateJobRouteAssignment(StateManager stateManager) {
this.stateManager = stateManager;
}
@Override
public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
stateManager.putProblemState(stateManager.createStateId(job2insert.getId()), VehicleRoute.class, inRoute);
}
@Override
public void informInsertionStarts(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) {
for(VehicleRoute r : vehicleRoutes){
for(Job j : r.getTourActivities().getJobs()){
informJobInserted(j,r,0.,0.);
}
}
}
}
Добавьте средство обновления состояния и ограничение в свой State/ConstraintManager, и все готово.