倒置在向非循环图(DAG)的关系,以避免循环关系

问题描述 投票:4回答:1

在一个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内方向并不重要用户的这种关系。

ruby-on-rails ruby algorithm graph-algorithm
1个回答
5
投票

您的解决方案似乎工作。边缘C -> AA -> C不能同时造成一个循环。

证明:

如果添加C -> A会导致一个周期,那么已经有一个路径A ↝ C。如果添加A -> C会导致一个周期,那么已经有一个路径C ↝ A。如果两个以上的分别为真,则组合所述两个路径将提供一个已经存在的循环,因此,在初始图表不会是一个DAG。

© www.soinside.com 2019 - 2024. All rights reserved.