Drools 在optaplanner中每次移动后如何最好地触发代码?

Drools 在optaplanner中每次移动后如何最好地触发代码?,drools,optaplanner,Drools,Optaplanner,我需要在每次移动结束时在内存中运行一个计算,然后根据此更新分数。计算结果需要是有状态的,因为它在其他地方被引用(存储在解决方案中) 文档建议这应该是一个PlanningEntity,更新为ShadowVariable,在主实体上有一个VariableListener,但这自然会触发每个实体的更改,不必要地重新计算 如何在移动结束时触发,而不是按变量触发?流口水?那不是黑客吗 如果不使用VariableListener,它将不再是PlanningEntity。这难道不是一个与文档相反的问题吗?缺点

我需要在每次移动结束时在内存中运行一个计算,然后根据此更新分数。计算结果需要是有状态的,因为它在其他地方被引用(存储在解决方案中)

文档建议这应该是一个PlanningEntity,更新为ShadowVariable,在主实体上有一个VariableListener,但这自然会触发每个实体的更改,不必要地重新计算

  • 如何在移动结束时触发,而不是按变量触发?流口水?那不是黑客吗
  • 如果不使用VariableListener,它将不再是PlanningEntity。这难道不是一个与文档相反的问题吗?缺点是什么
  • 进一步资料:

    • “计算”是计划期内流量网络值的预测,其中流量水平取决于任务的当前位置
    • 我们使用的是实时计划,因此计划周期窗口会根据任务集大小进行调整,并随时间变化
    1)听起来应该使用阴影变量。请注意,您还需要一个普通约束,并根据阴影变量的状态更新分数

    请注意,您可以有一个单独的shadow entity类(每个问题解决方案),该类有一个单独的shadow变量,该变量在任何规划实体更改时更新。在
    @PlanningSolution
    类的字段上使用
    @PlanningEntityProperty
    (不含
    集合

    在移动结束时,每次移动都调用<代码> TrutGeStudioValueLabelistNEs()/<代码>,而不是在中间。所以,如果你担心性能,你不应该担心。 如果您担心正确性-因为调用的数量会影响您的计算-那么不要以这种方式设计/实现它

    2) 问题事实在解决过程中不会改变(不包括实时规划)。他们没有一个领域。否则它就是一个计划实体


    0)MoveListener不存在,故意的(出于充分的理由),甚至内部也不存在(即使是非常内部的PhaseLifeCycleStener也只侦听步骤,而不侦听移动)。

    计算代表什么?如果我更好地理解用例,我可能会建议最好的方法,或者同意optaplanner中的API差距。@GeoffreyDeSmet it预测计划期间的流网络值,其中流级别取决于影响流的任务的位置。我将把这个添加到问题中。您可能需要保留一组影响流程的任务。仅计数++和计数-,并不总是正确的,例如在与自身交换某物时。@GeoffreyDeSmet任务有一个属性,用于确定是否需要重新计算流,该属性在变量侦听器中检查。因此,它只是为其所依赖的实体而被解雇。谢谢杰弗里。这很好,因为它证实了我所做的决定。我有一个singleton PlanningEntityProperty,在调用triggerShadowVariableListeners后更新了一个阴影变量。但是,如果移动更改了多个计划变量(例如,交换移动或影响多个实体的自定义移动),afterVariableChanged是否不会运行多次?它可以工作,并且使用该方法执行得更好。感谢您的帮助和时间Geoffrey。终于完成了这项工作,需要更加小心地确保任何变量侦听器正确地更新相对于触发它的实体的阴影变量。但我仍然设法通过检查影子实体上的状态变量来减少复杂性,每次移动只运行一次计算。谢谢你的帮助和耐心@GeoffreyDeSmet!阴影变量有很好的文档记录,并且对于典型用例有很好的示例;在这一点上进行扩展时,尝试创意的学习曲线是陡峭的。很难知道该向谁寻求帮助,而且不知道自己已经走上了正确的道路会耗费大量的时间。像定制动作一样,全面坚持并逐步重建理念是关键。错误消息非常详细,但需要了解基本行为才能理解。只是观察,而不是批评。Optaplanner的核心功能和初始设置非常快速直观。我能想到的唯一建议是:1)更明确地强调“影子实体”的概念,鼓励作为可接受的实践使用。2) 在定制移动、阴影变量等的开发过程中,以某种方式鼓励/强制使用FULL_ASSERT?从长远来看可以节省时间。也许您应该在每个自定义移动/变量侦听器正常工作后覆盖完整断言?