是否可以通过硬限制在同一路线中进行两次或多次装运。
如果没有,你知道其他可以处理这种限制的java库吗?
谢谢!
答案 0 :(得分:0)
确保货件处于相同路线的最简单方法是使用技能标记这些货件
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)
确保insertContext.getJob()[要插入的作业]可以插入到insertContext.getRoute()中。此时你需要知道两件事:
对于后面的信息,您需要定义为您提供工作路线分配的状态。我会定义一个problemState及其相应的更新程序,如下所示:
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,您就完成了。