我正在尝试使用 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
and S6
,以任何顺序..
如何确保有效的解决方案不包含此类路由:[X, S2, Y]
或[S2, X, S4]
..
谢谢,阿西姆