Używam biblioteki scala-graph do budowania wykresu kierunkowego i do pobierania jego węzłów w porządku topologicznym. Ponieważ może istnieć wiele możliwości dla kolejności topologicznej wykresu, muszę mieć deterministyczny wynik dla porządku topologicznego dla wykresów, które są równe i zbudowane w ten sam sposób.Deterministyczny porządek topologiczny w scala graph
Ta niewielka aplikacja podkreśla problem
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))
}
Ta aplikacja drukuje fałszywe.
Czy istnieje sposób na zbudowanie deterministycznego topologicznego rodzaju wykresu przy użyciu api biblioteki scala-graph? Pisanie algorytmu od zera byłoby ostatnią opcją.
Próbowałem tego podejścia przed opublikowaniem pytania i nie działa. Jak wspomniał Peter Empen tutaj https://github.com/scala-graph/scala-graph/issues/41, coś podobnego powinno zadziałać jak tylko sortowanie topologiczne jest "w pełni zintegrowane z biblioteką" –