一个计划实体C中有两个计划变量A和B,A和B之间存在一些关系: 关系 1:当 A 在范围 (A1 ... A10) 内时,B 必须在范围 (B1 ... B3) 内。 关系2:当A在范围(A11 ... A15)中时,B必须在范围(B4)中。
现在我们在 C: 中使用值范围提供者
class C{
@PlanningVariable private A a;
@ValueRangeProvider private List<A> aScope; //A1 ... A15
@PlanningVariable
private B b;
@ValueRangeProvider private List<B> bScope; // B1 ... B4
}
我们使用hardConstraint约束D来约束上述关系。 但我们在调试日志中发现: 如果有一个规划实体c,c.a==A1,c.b==B1: 当timefold进行移动时,它会尝试改变c.a = A11,但c.b仍然是B1,这样就会破坏硬约束D,所以这次移动不会被接受。 如此这般,它不会尝试将c从relationship1更改为relationship2。
我们尝试使用 unionMoveSelector,但它仍然不适用于上述场景。
对于这个问题有什么建议吗?
Timefold Solver 提供的通用移动不知道这两个变量只能一起更改这一事实。那么正确的分配是不可能的。
在这种情况下,我建议实现一个自定义移动,其中包含正确分配两个变量的逻辑。
为了获得最佳结果,自定义移动应仅分配不打破硬约束的值。