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

2022-04-14 00:00:00 java drools optaplanner

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

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

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


解决方案

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

我认为flattenLast()在这方面不会做任何事情。您对其执行from(...)操作的实体在每次更改时仍将被重新计算,然后所有拼合的数据也将被重新计算。也就是说,可能我误解了您的意图,如果您使用其他信息更新您的原始问题,我将重新考虑。

相关文章