OptaPlanner - 有没有办法在CH阶段的每个Move中触发代码?

时间:2017-11-20 14:40:55

标签: optaplanner

我目前正在使用OptaPlanner 6.2.0,但如果有帮助可以更新。

我需要在计划器之外保留变量和实体之间链接的一些数据,以及一些预先计算的数据,我需要一种方法来在每次移动之后但在规则被触发之前更新它。检查规则时我会使用该数据。我知道这是一种hacky方式,但有复杂的规则需要单独的数据存储,无法想到避免它的方法。此外,规划师也表现出良好的表现。

所以问题是我需要一种方法来触发每次移动时的一些代码,这些代码会在规则应用于此移动之前用当前移动的更改更新单独存储的数据,并决定移动的有效性(因为规则解决了这些数据),所以实际上在重新计算此移动的得分之前。在Local Search阶段,它非常简单,因为我的所有动作都是自定义的,所以我可以在doMove中完成。但我真的需要在CH阶段做同样的事情。

我知道我们无法在CH阶段将移动类型更改为自定义。我还发现在CustomPhaseCommand中实现CH阶段的完全模拟很难实现这一小改变。删除CH阶段并用简单的自定义阶段替换它会大​​大降低这个特定任务的分配质量,甚至认为我有一个例子,它在没有CH的情况下工作得更好。我也尝试将PhaseLifecycleListener添加到我的Solver中,但它只监听步骤和阶段,而不是分离移动。到目前为止,最接近的努力是实现一个VariableListener,它实际上恰好在每次移动之前,甚至在CH阶段之后,在变量变化之后触发。但是在beforeVariableChanged之前,我只能看到旧的变量,而不是新变量(我需要更新我的数据),而afterVariableChanged似乎在触发和检查的规则之后触发,因此更新此方法中的数据是无用的(通过那么影子变量如何得到更新然后通常在CH阶段?我认为它应该触发,更新那里的影子变量然后用更新的影子变量重新检查规则?)

我也试着查看链接,但我不确定它是否可以完全覆盖我的复杂情况,单独存储数据并在规则中使用它...

那么有没有办法在每次CH移动时正确更新我的结构?或者有一种简单的方法来处理复杂的数据依赖性,而不是将其移动到Planner之外的单独结构中吗?

提前致谢!

0 个答案:

没有答案