【问题标题】:OptaPlanner, in VariableListener change shadow variable of other entityOptaPlanner,在 VariableListener 中改变其他实体的影子变量
【发布时间】:2021-07-26 15:03:50
【问题描述】:

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

【问题讨论】:

    标签: optaplanner


    【解决方案1】:

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


    跨不同的影子变量声明

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

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

    注意在调用E 的第一个之前如何调用C 的变量侦听器方法所有。他们被耽搁了。 OptaPlanner 在幕后为您提供这种保证。


    对于单个影子变量声明

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多