【问题标题】:Deterministic topological order in scala graphscala图中的确定性拓扑顺序
【发布时间】:2015-07-30 15:18:28
【问题描述】:

我正在使用scala-graph 库来构建有向图并按拓扑顺序检索其节点。由于图的拓扑顺序可能有很多可能性,因此我需要对相等且以相同方式构建的图的拓扑顺序具有确定性结果。

这个小应用突出了问题

import scalax.collection.Graph
import scalax.collection.GraphEdge.DiEdge
import scalax.collection.GraphPredef._

object MainApp extends App {

  // Creates new graph for every call
  // val is not an option
  def graph: Graph[String, DiEdge] = Graph(
    "A" ~> "B",
    "A" ~> "C",
    "A" ~> "D",
    "B" ~> "E",
    "B" ~> "F",
    "C" ~> "G",
    "C" ~> "H",
    "D" ~> "F",
    "D" ~> "G"
  )

  val results = 1 to 20 map { _ =>
    graph.topologicalSort.mkString("")
  }

  println(results.tail.forall(_ == results.head))
}

这个应用程序打印错误。

有没有办法使用 scala-graph 库的 api 构建确定性拓扑排序的图?从头开始编写算法将是我的最后选择。

【问题讨论】:

    标签: scala sorting graph-algorithm


    【解决方案1】:

    根据函数on github的实现,使用ComponentTraverser收集节点,该ComponentTraverser通过

    def componentTraverser(parameters: Parameters = Parameters(), subgraphNodes: (NodeT) ⇒ Boolean = anyNode, subgraphEdges: (EdgeT) ⇒ Boolean = anyEdge, ordering: ElemOrdering = noOrdering): ComponentTraverser
    

    然后在它上面调用topologicalSort。您可以通过对节点的值进行排序以获得ComponentTraverser 来强制拓扑排序是确定性的,然后自己调用排序函数。 虽然没有测试解决方案。

    【讨论】:

    • 我在发布问题之前尝试了这种方法,但它不起作用。正如 Peter Empen 在这里github.com/scala-graph/scala-graph/issues/41 所提到的,只要拓扑排序为fully integrated into the library,类似的东西就应该起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2019-03-07
    • 2020-09-18
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多