OptaPlanner,在VariableListener中改变其他实体的影子变量

OptaPlanner, in VariableListener change shadow variable of other entity

基于 optaplanner 示例任务分配处理我的项目。在示例中,StartTimeUpdatingVariableListener updateStartTime() 更改源任务的时间。会不会就OK了,就在函数里,把上一个任务的shadow变量改成源任务不改?因为在我的场景中,每个任务都有一个等待时间(影子变量),只有在添加新任务时,才能计算出前一个任务的等待时间。不同的源任务会为其前一个任务带来不同的等待时间。最终所有员工等待时间的总和将按规则最小化。看例子,在监听器中,只有源任务时间被更新,并且被beforeVariableChanged和afterVariableChanged包围。更新其他任务的影子变量会不会有问题?

您不能创建会导致无限循环的循环。


跨越不同的影子变量声明

自定义阴影变量(VariableListener)可以触发另一个自定义阴影变量(VariableListener),例如下图中C触发E。因此,改变变量 C 的 C 的 VariableListener 会触发 E 的 VariableListener 上的(延迟)事件。

但是依赖树不能包含循环,OptaPlanner通过sources属性验证这一点。

注意 all C 的变量侦听器方法是如何在调用 E 的第一个方法之前调用的。他们被耽搁了。 OptaPlanner在幕后给你这个保障


对于单个影子变量声明

当 A 或 B 改变时触发 C 的 VariableListener。因此,当它更改 C 变量时,不会为该 VariableListeners 创建新的触发事件。

当单个 A 变量更改时,会在 C 的 VariableListener 上触发一个事件,该事件可以更改 多个 个 C 变量。改变那些多个 C 变量的循环 不能是无限循环 .

在实践中,通过 VRP 和任务分配调度,我发现它们保证不存在无限循环的唯一方法是仅及时向前进行更改。所以在链式模型中,遵循 next 变量,而不是 previous.