Optaplanner:动态添加/删除约束

Pra*_*ant 5 optaplanner

我们可以使用 Java 动态添加/删除 optaplanner 中的约束吗?有没有例子。我希望允许用户使用某些 UI 在运行时添加或删除此约束。

下面的链接使用口水讲述了一些关于它的内容。可以用java来完成吗? 如何在 optaplanner 中动态添加/删除约束

Geo*_*met 4

1)通常非硬编码约束就足够了。例如,不要有这样的约束:

  • “当安周五工作时,惩罚”

有:

  • 包含 Employee 和 DayOfWeek 的 DayOfWeekDislike 数据类。** 输入数据有一个实例,其中包含员工 Ann 和 dayOfWeek Friday。
  • 有一个约束说:“当存在 DayOfWeekDislike 且该员工对该 DayOfWeek 进行 ShiftAssignment 时,将受到惩罚”

这种方法足以在大多数用例中避免动态约束。请注意,您可以使用 实时添加/删除 DayOfWeekDislike 数据Solver.addProblemFactChange()

2) 接下来,@ConstraintConfiguration可以使用@ConstraintWeight实时禁用/启用约束Solver.addProblemFactChange()。将约束权重设置为零分以禁用它。

3) 如果 1) 和 2) 都失败,那么你确实需要动态约束。我还没有看到任何需要走到这一步的用例,但我们可以支持它。如果您确实需要这种方法,您的用例是什么?

  • 在 ConstraintStreams 中,OptaPlanner 不会浪费时间对权重为零的约束进行连接。对于scoreDRL(较旧的),这是一个悬而未决的问题,也不浪费时间。 (2认同)