如果它不依赖于规划变量,我可以告诉 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;
}
这对计划克隆也更友好。但它并不适合所有情况。
我在约束流的开头使用 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;
}
这对计划克隆也更友好。但它并不适合所有情况。