ruby-on-rails – 有向无环图(DAG)中的反转关系,以避免循环关系
题
在directed acyclic graph (DAG)中,通过反转要添加的关系,总是会阻止通过添加关系引起的循环传递关系吗? 例: >现有关系:A – > B,B – > C,并且通过该传递关系A – > C,因此它可以被视为A – > B – > C 背景 为了对实体之间的定向关系(例如“跟随”,“前”,“父”,“子”)进行建模,OpenProject应用程序将其关系信息存储在directed acyclic graph (DAG)中.实体/节点具有日期信息并且可以由用户重新安排.如果用户更改日期值,则可能需要自动重新安排其他实体,例如,当前任转移到未来两天时,它的继任者也需要转移. 因为大多数关系用于调度,并且由于这个原因它是非循环图,所以可以防止循环.它们会导致无限的调度循环. 虽然大多数关系从语义的角度来看也有一个方向,但也存在通用的“关联”关系,这种关系对用户来说是无向的,并且简单地传达了存在各种关系的关系.由于其性质,DAG中存在的“涉及”关系的方向方面对于前端中的用户是不可见的. 当用户试图创建“涉及”关系时,他当前可能遇到警告反对循环关系的错误消息,这对用户来说是不可理解的,因为他对关系的感知是无向的. 对于该问题存在几种可能的解决方案,并且最简单的可能是在这种情况下简单地反转关系,因为DAG内的方向对于这种关系对用户而言无关紧要. 解决方法
您的解决方案似乎有效.边缘C – > A和A – > C不能同时造成循环.
证明: 如果添加C – > A会导致一个循环,然后已经存在路径A?C.如果添加A – > C将导致一个循环,然后已经存在路径C?A.如果上述两个都是真的,那么组合这两个路径将提供已经存在的循环,因此初始图形将不是DAG. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |