我尝试使用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
是解决方案的一部分,它们会出现在一条路线中,并且不会在不同的路线之间分开。< / p>
问题在于,如果我的车辆容量有限(例如3),Jsprit可能会返回如下解决方案:
Routes: [
[S1, S2, S3]
[S5, S7, S8]
[S9, S10]
]
Unassigned Jobs: [S4, S6]
这是可以理解的,但不是我想要的..我希望如果路线包含S2
,它还应该包括S4
和S6
,任何顺序..
如何确保有效的解决方案不包含此类路由:[X, S2, Y]
或[S2, X, S4]
..
谢谢, 阿西