You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Timefold规划任务求助:依赖进程未按约束规则启动

问题排查与修复

核心问题:约束逻辑错误

你的需求是消费进程(Link.target)启动时间不得早于生产进程(Link.source),即必须满足 targetStartDate >= sourceStartDate。但当前约束的判断逻辑存在两个关键问题:

  1. 错误地将sourceStartDate >= targetStartDate(即targetStartDate <= sourceStartDate)判定为违反约束,把允许的“启动时间相等”情况也纳入了惩罚范围。
  2. 权重函数返回0/1的写法不够直观,容易引发逻辑混淆。

修复步骤

1. 修正约束逻辑

修改TimetableConstraintProvider中的processOrderConstraint方法,仅对消费进程启动时间早于生产进程的违规情况进行惩罚,同时用filter简化逻辑:

private Constraint processOrderConstraint(ConstraintFactory constraintFactory) {
    return constraintFactory.forEach(Link.class)
            .filter(link -> {
                Integer sourceStart = link.getSource().getStartDate();
                Integer targetStart = link.getTarget().getStartDate();
                // 仅当消费进程启动时间早于生产进程时,判定为违反约束
                return sourceStart != null && targetStart != null && targetStart < sourceStart;
            })
            .penalize("Process order constraint", HardSoftScore.ONE_HARD);
}

2. (可选但推荐)显式声明规划变量可空

由于初始化时Process.startDate为null,在@PlanningVariable注解中显式添加nullable=true,符合Timefold的最佳实践:

@PlanningVariable(valueRangeProviderRefs = "startDateRange", nullable = true)
public Integer getStartDate() {
    return startDate;
}

修复后效果

修改完成后,求解器会生成符合约束的解:生产进程(p1)可在0启动,消费进程(p2)会在0或之后的时间点启动(例如Process 1 starts at 0,Process 2 starts at 0或Process 2 starts at 1等),满足“消费进程不早于生产进程”的需求。

内容的提问来源于stack exchange,提问作者Andrew Samokish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:45:54