2015-07-01 9 views
7

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ą.

Odpowiedz

1

Według realizacji funkcji on github, węzły są zbierane za pomocą ComponentTraverser który jest otrzymywany z

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

Następnie topologicalSort nazywa się na nim. Możesz zmusić sortowanie topologiczne do determinizmu, podając kolejność na wartości swoich węzłów, aby uzyskać ComponentTraverser, a następnie wywołaj funkcję sortowania samodzielnie. Rozwiązanie nie testowane jednak.

+0

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ą" –

Powiązane problemy