为员工调度添加班次间最小间隔时长约束参数遇问题
员工调度约束参数不生效的问题排查与修复
核心问题:你的代码里用
join(ConstraintParameters.class)关联全局参数是错误的。ConstraintParameters是全局单例配置,不需要和Shift做笛卡尔积关联,应该用from(ConstraintParameters.class)来获取这个单例对象。修正后的代码:
Constraint atLeast10HoursBetweenTwoShifts(ConstraintFactory constraintFactory) { return constraintFactory.forEach(Shift.class) .join(Shift.class, equal(Shift::getEmployee), lessThanOrEqual(Shift::getEnd, Shift::getStart)) .from(ConstraintParameters.class) // 替换join为from .filter((firstShift, secondShift, constraintParameters) -> Duration.between(firstShift.getEnd(), secondShift.getStart()).toHours() < constraintParameters.minRestHours() ) .penalize(HardSoftBigDecimalScore.ONE_HARD, (firstShift, secondShift, constraintParameters) -> { int breakLength = (int) Duration.between(firstShift.getEnd(), secondShift.getStart()).toMinutes(); return (constraintParameters.minRestHours() * 60) - breakLength; }) .asConstraint("At least X hours between 2 shifts"); }
- 额外检查点:
- 确保
ConstraintParameters类添加了@ConstraintParameters注解:@ConstraintParameters public class ConstraintParameters { private int minRestHours; // 对应的getter、setter或构造方法 } - 确保Solver配置中正确加载参数,比如通过代码设置:
ConstraintParameters params = new ConstraintParameters(); params.setMinRestHours(10); solverFactory.getSolverConfig().setConstraintParameters(params);
- 确保
内容的提问来源于stack exchange,提问作者Urezo
相关产品推荐
相关产品推荐

