如果它不依赖于规划变量,我可以告诉 Optaplanner(带有约束流)不要重新计算连接吗?

Can I tell Optaplanner (with constraint streams) not to recalculate join if it doesn't depend on planning variable?

我在约束流的开头使用 fromUniquePair​(Class<A> fromClass, BiJoiner<A,​A> joiner)。 fromClass 是一个规划实体,代表一个时间段。我需要所有重叠的时隙对的流,以便稍后检查它们的计划变量是否不冲突。时隙不会根据任何计划变量及时移动,因此这个 fromUniquePair 连接的结果在优化时不会改变。

但是,每当计划变量发生变化时,该时隙就会与所有其他时隙进行比较,以查看是否需要在流中添加或删除一对。这是不必要的,因为这个连接器的结果不以任何方式依赖于规划变量。我认为大部分时间都花在做这件事上,因为每次更改计划变量时它都需要检查数千个其他时间段,而它只需要对计划变量本身进行一些快速检查。

有没有办法告诉 Optaplanner 不要这样做?

您在这里要求的可以与 Drools 中的 属性 反应功能进行比较。不幸的是,Constraint Streams 不支持它,也没有办法做到这一点——Constraint Streams 看不到过滤器 lambda 或方法引用的内部,因此它不知道您访问了哪些字段。这是我们为更好的抽象付出的代价。

我认为flattenLast()不会在这方面做任何事情。您在 from(...) 上执行的实体每次更改时仍会重新评估,然后所有扁平化数据也会重新评估。也就是说,也许我误解了你的意图,如果你用其他信息更新你原来的问题,我会重新考虑。

在某些情况下,将实体 class 拆分为仅包含问题事实的 class 和仅包含规划变量的 class 也可行:

例如分手

@PlanningEntity
class Foo {
   Bar bar1;
   Ber ber1;
   Bur bur1;
   @PlanningVariable Bor bor1;
}

进入

class Foo {
   Bar bar1;
   Ber ber1;
   Bur bur1;
}
@PlanningEntity
class FooAssignment {
   Foo foo;
   @PlanningVariable Bor bor1;
}

这对计划克隆也更友好。但它并不适合所有情况。