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

时间:2019-02-11 09:10:59

标签: ruby-on-rails ruby algorithm graph-algorithm

问题

directed acyclic graph (DAG)中,是否总是通过反转要添加的关系来防止由于添加关系而导致的循环传递关系?

示例:

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

这里给出的示例当然很简单,所以我想知道这种方法在所有情况下是否可行。

背景

为建模实体之间的定向关系(例如,“跟随”,“先行”,“父”,“子”),OpenProject应用程序将其关系信息存储在directed acyclic graph (DAG)中。实体/节点具有日期信息,并且可以由用户重新安排。如果用户更改日期值,则可能需要自动重新安排其他实体的日期,例如当前任者转移到未来两天时,其后任者也需要转移。

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

尽管大多数关系也从语义的角度来看都有方向,但也存在通用的“相对于”关系,该关系相对于用户是无向的,并简单地传达出存在某种关系。由于其性质,DAG中存在的“依赖于”关系的方向方面对于前端用户而言是不可见的。

当用户尝试创建“与...相关”关系时,他当前可能会遇到错误消息,以警告周期性关系,这对于用户来说是不可理解的,因为他认为这种关系是无方向性的。

有两个可能的解决方案,最简单的方法是在DAG内的方向对用户而言无关紧要的情况下简单地逆转这种关系。

1 个答案:

答案 0 :(得分:5)

您的解决方案似乎有效。边缘C -> AA -> C不能同时引起循环。

证明:

如果添加C -> A会导致循环,则说明路径A ↝ C已经存在。如果添加A -> C会导致循环,则说明路径C ↝ A已经存在。如果以上两个条件都成立,那么将两个路径组合起来将提供一个已经存在的循环,因此初始图形将不是DAG。