访问节点具有可选输出的图的算法

问题描述

我确信一定有一些现有的图形算法可以用于我想要做的事情,但我只是不知道正确的搜索词。

该算法将执行我将称之为“图形评估”的操作。我有一个 DAG 图,每个节点都有一个关联的布尔函数。大体上:

  • 我们总是先评估根节点的功能
  • 一个节点至少有一个直接父节点返回 true 时,它​​必须运行。
  • 如果一个节点没有直接的父节点返回 true,它不得运行。
  • 但是,每个节点应该最多运行一次(所以如果同一个子节点的两个父节点返回 true,子节点仍然只运行一次)。
  • 此外,一个节点应该只在在其所有父节点都运行后,或者在我们确定在此图评估期间任何剩余的父节点永远不会运行之后运行

注意,当我们说一个函数必须运行时,我们的意思是它,因为函数是有状态的,所以之前的图评估会影响后面的。

问题是,实现这一点的最有效算法是什么,它可以最大限度地减少我们在评估时需要做的簿记工作以满足约束条件?

如果它有助于使问题更具体,您可以将这个 DAG 视为需要使用父项计算的输入完成的工作——返回 true 表示计算了新输出,返回 false 表示继续使用最后一个保存的值。你不想开始工作,直到你确定你知道你所有的输入,如果你的输入没有改变,你想避免一起工作,你不想做两次同样的工作,你想要以避免不会被使用的工作(如果您在一个输入更改后立即重新计算,如果在同一个图形评估期间发现您的其他输入也更改了,它将被丢弃,因此现在您需要再次重新计算)。

考虑下面附上的示例图:

  • 4 应该只计算一次,即使 2 和 3 都返回 true。
  • 理想情况下,我们只检查是否需要运行 4 一次,而不是在运行 2 后和运行 3 后一次。
  • 如果 2 和 3 都返回 false,理想情况下,我们会以某种方式直接跳到计算 7,因为 4、5 和 6 都同时变得无法访问。

总的来说,我们有时间分析图并构建辅助结构,目标是尽可能快地多次重复评估同一个图。

我想到的但我怀疑不是最有效的方法

  • 准备一个拓扑排序的节点数组。我们每次都可以迭代整个数组。我们有一个并行位集,其中 1 表示“应该评估”(根从 1 开始,所有其他节点都是 0)。当我们执行一个节点时,如果它返回 true,我们将它的每个子节点的位设置为 1。这还要求我们为每个节点存储其子节点。
  • 开始评估根。每次运行一个节点时,如果它为真,则在子节点中设置一点,然后不管真/假如何递减与每个子节点关联的计数器。当我们迭代子节点并递减时,如果计数器达到 0,则检查子节点的位,如果为真则评估子节点,则无论真/假,都开始递归递减它的子节点。这有一个缺点,如果一个孩子有 9999 个父母,我们将做 9999 次递减并检查 0,而不是在评估所有父母后只做一次检查。似乎我们应该能够在图评估之前分析图并想出避免这种情况的方法

Graph to evaluate

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...