在重新解决以前解决的问题的场景中(当然,使用一些新数据),通常不可能重新分配车辆的第一个任务。驱动程序已经在路上,任何新的解决方案都必须考虑到:
- 工作必须是他的(不能分配给另一辆车)
- 最初分配给他的活动在未来的解决方案中必须保持不变
为简单起见,我使用的是单个车辆场景,并且只尝试强加第二个项目符号(即确保某个活动将成为解决方案中的第一个)。
这就是我定义约束的方式:
new HardActivityConstraint()
{
@Override
public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct,
double prevActDepTime)
{
String locationId = newAct.getLocation().getId();
// we want to make sure that any solution will have "C1" as its first activity
boolean activityShouldBeFirst = locationId.equals("C1");
boolean attemptingToInsertFirst = (prevAct instanceof Start);
if (activityShouldBeFirst && !attemptingToInsertFirst)
return ConstraintsStatus.NOT_FULFILLED_BREAK;
if (!activityShouldBeFirst && attemptingToInsertFirst)
return ConstraintsStatus.NOT_FULFILLED;
return ConstraintsStatus.FULFILLED;
}
}
这就是我构建算法的方式:
VehicleRoutingAlgorithmBuilder vraBuilder;
vraBuilder = new VehicleRoutingAlgorithmBuilder(vrpProblem, "schrimpf.xml");
vraBuilder.addCoreConstraints();
vraBuilder.addDefaultCostCalculators();
StateManager stateManager = new StateManager(vrpProblem);
ConstraintManager constraintManager = new ConstraintManager(vrpProblem, stateManager);
constraintManager.addConstraint(new HardActivityConstraint() { ... }, Priority.HIGH);
vraBuilder.setStateAndConstraintManager(stateManager, constraintManager);
VehicleRoutingAlgorithm algorithm = vraBuilder.build();
结果并不好。我只获得分配了一项工作的解决方案(具有所需活动的工作)。在调试中很明显,作业插入迭代考虑了许多似乎可以完全解决问题的可行选项,但归根结底,算法返回的最佳解决方案不包括其他作业。
更新:更令人惊讶的是,当我在超过 5 辆车的情况下使用约束时,它可以正常工作(最差的结果是 1 辆车)。
如果需要,我很乐意附上更多信息。
谢谢扎克