ruby-on-rails - 反转有向无环图 (DAG) 中的关系以避免循环关系

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

问题

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因此仍然是非循环的

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

背景

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

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

虽然从语义的角度来看,大多数关系也有方向,但也有一般的“关联”关系,对用户来说是无向的,只是传达存在某种关系。由于其性质,DAG 中存在的“关联”关系的方向方面对于前端用户是不可见的。

当用户尝试创建“关联到”关系时,他目前可能会遇到警告循环关系的错误消息,这对用户来说是不可理解的,因为他认为关系是无向的。

这个问题有几个可能的解决方案,最简单的可能是在 DAG 内的方向对这种关系的用户来说无关紧要的情况下简单地反转关系。

最佳答案

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

证明:

如果添加 C -> A 会导致循环,则已经存在路径 A ↝ C。如果添加 A -> C 会导致循环,则已经存在路径 C ↝ A。如果以上两种情况都为真,那么组合这两条路径将提供一个已经存在的循环,因此初始图将不是 DAG。

关于ruby-on-rails - 反转有向无环图 (DAG) 中的关系以避免循环关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54627134/

相关文章:

ruby - 填充 Ruby 哈希的更好方法?

c# - 根据当前位置和总项目获取当前页面上的项目数

ruby - 在 Ruby 中比较数组的最有效方法

ruby-on-rails - 设计 - 如何更改设置以便电子邮件地址不需要是唯一的

ruby-on-rails - 将变量传递到部分,rails 3?

ruby - 在不丢失 Ruby 中的引号或注释的情况下加载和保存 YAML 文件

ruby - 动态地将命令行参数传递给 RSpec RakeTask

algorithm - GJK 中的碰撞点

ruby-on-rails - Ruby on Rails 类型错误

ruby-on-rails - 如何在 select 标签中硬编码键值选项对