Optaplanning / 时间折叠约束工厂列表选择器而不是 foreach

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

我目前面临一个问题,我有一个约束,其中我必须计算孔解决方案的一个值,但它取决于 A 类型的所有规划实体。因此,如果其中一个发生更改,我必须为整个解决方案重新计算它实体。 所以选择一次计划实体列表并进行一次计算会更高效。

而不是 foreach 并将它们分组并针对每个实体之外的所有其他实体进行计算..

我查看了约束工厂和流,但没有找到解决方案。我尝试 foreach(ClassA.class).map(...) 并尝试使用 forEach(PlanningSolution) 并获取规划实体 A 的列表 - 但它不起作用。

有我可以使用的选择器或技巧吗?例如。

constraintFactory.forAll(PlanningEntityA.class).penalizeConfigurable(Calculation)

optaplanner timefold
1个回答
0
投票

考虑使用

groupBy()

forEach(MyClass.class)
    .groupBy(MyCustomCollector.class)
    .penalize(...)
在这种情况下,

MyCustomCollector
需要是
UniConstraintCollector
的实现;希望界面是自我描述的。

还有一个预构建的收集器

ConstraintCollectors.toList()
,它将所有实例收集到一个列表中并将其传递给
penalize
。但是,我强烈建议不要使用它,因为这将导致每次任何实体更改时都会处理整个列表,因此随着数据集大小的增加,求解器的扩展性会很差。

UniConstraintCollector
的要点是让您能够增量地实现计算 - 仅根据一个实体的变化增量地更改结果,而不是每次发生任何变化时重新计算整个数据集。

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