OptaPlanner约束流:限制为计划中的第一个分配



我正在设计一个OptaPlanner服务,该服务可以优化工业应用程序中机器人的调度和分配。计划是在线执行的,并且是在时间范围后退的情况下进行的。有两种类型的运输时间约束(约束机器人到机器的移动(:一种用于机器人到机器上的第一次分配,另一种用于随后的每一对分配(都在同一台机器上(。

总体而言,模拟中的规划看起来很棒,但当我有一个带有多个任务的机器人时,我强制执行两个不同的运输时间限制的方式有一个错误。根本原因是两个约束流的强制执行:

/**
* This constraint enforces a transit time model to keep us from assigning a task prior the earliest possible arrival
* time for the assigned bot.  In particular, this method is enforcing arrival time constraints for the very first
* assignment to a bot.
*/
protected Constraint violatingFirstArrivalTime(ConstraintFactory constraintFactory) {
return constraintFactory.forEach(CandidateAssignment.class)
.filter(CandidateAssignment::isAssigned)
.filter(assignment -> !assignment.isCommitted())
.penalizeConfigurable("Respect first arrival time", CandidateAssignment::firstAssignmentTimeliness);
}
/**
* This constraint enforces a transit time model to keep us from assigning a task prior the earliest possible arrival
* time for the assigned bot.  In particular, this method is enforcing arrival time constraints for the movement of a
* bot from one task to another.
*/
protected Constraint violatingArrivalTime(ConstraintFactory constraintFactory) {
return constraintFactory.forEach(CandidateAssignment.class)
.filter(CandidateAssignment::isAssigned)
.join(CandidateAssignment.class, equal(CandidateAssignment::getBot))
.penalizeConfigurable("Respect arrival time", CandidateAssignment::taskToTaskTimeliness);
}

特别是,对于针对单个机器人的两个任务的情况,我错误地应用了";违反第一到达时间";每个赋值的约束(而不仅仅是第一个赋值(。有什么建议吗?当我立即看到如何实现约束时,我发现约束流非常棒,否则会令人难以置信地困惑。。

我认为ifNotExists(...)就是您的答案。修改约束,使其仅在该机器人没有早期分配的情况下惩罚分配。

return constraintFactory.forEach(CandidateAssignment.class)
.filter(CandidateAssignment::isAssigned)
.filter(assignment -> !assignment.isCommitted())
.ifNotExists(CandidateAssignment.class,
equal(CandidateAssignment::getBot),
Joiners.filtering((a1, a2) -> {
// Here go all the filters that specify the "comes before" relationship.
// If you can replace filtering() with an actual joiner, even better for performance.
}))
.penalize(...);

最新更新