代码之家  ›  专栏  ›  技术社区  ›  ulferts

有向无环图(DAG)中的逆关系以避免循环关系

  •  3
  • ulferts  · 技术社区  · 6 年前

    问题

    在一个 directed acyclic graph (DAG) ,是否总是通过反转要添加的关系来阻止由添加关系引起的循环传递关系?

    例子:

    • 现有关系: A -> B , B -> C 通过这个传递关系 A -> C ,因此可以将其视为 A -> B -> C
    • 要添加的关系: C -> A 这会导致 A -> B -> C -> A 并且是循环的
    • 想法 :反转要添加到的关系 C <- A 会导致 A -> B -> C <- A 因此仍然是非循环的

    这里给出的例子当然相当简单,所以我想知道这种方法是否适用于所有场景。

    背景

    要对实体之间的定向关系(例如“follows”、“precess”、“parent”、“child”)建模,请 OpenProject 应用程序将其关系信息存储在 有向无环图 . 实体/节点具有日期信息,用户可以重新安排。如果用户更改日期值,则可能需要自动重新安排其他实体的日程,例如,当前置任务移到未来两天时,其后续任务也需要移动。

    因为大多数关系都用于调度,而且由于这个原因,它是一个非循环图,所以循环是被阻止的。它们将导致无限的调度循环。

    虽然大多数关系也有一个语义上的方向,但也有一个通用的“关系到”关系,它对用户是无向的,只是简单地表示存在某种关系。由于其性质,DAG中存在的“相关”关系的方向方面对前端的用户不可见。

    当用户试图创建一个“相关”关系时,他可能会遇到错误消息警告循环关系,这对用户来说是不可理解的,因为他对关系的感知是无方向的。

    对于这个问题,有两种可能的解决方案,最简单的可能是简单地反转关系,在这种情况下,DAG中的方向对于用户来说并不重要。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Cătălin Frâncu    6 年前

    你的解决方案似乎有效。边 C -> A A -> C 不能同时导致循环。

    证明:

    如果加入 C & GT;A 会导致一个循环,那么已经存在一个路径 A ↝ C . 如果加入 A & GT;C 会导致一个循环,那么已经存在一个路径 C ↝ A . 如果上述两个都是真的,那么结合这两个路径将提供一个已经存在的循环,因此初始图将不是DAG。