时间折叠:具有多个规划变量的规划实体不会永远尝试某些场景

问题描述 投票:0回答:1

一个计划实体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,但它仍然不适用于上述场景。

对于这个问题有什么建议吗?

java optaplanner timefold
1个回答
0
投票

Timefold Solver 提供的通用移动不知道这两个变量只能一起更改这一事实。那么正确的分配是不可能的。

在这种情况下,我建议实现一个自定义移动,其中包含正确分配两个变量的逻辑。

为了获得最佳结果,自定义移动应仅分配不打破硬约束的值。

© www.soinside.com 2019 - 2024. All rights reserved.