2016-04-27 20 views
0

Graphen haben folgende Eigenschaften:Haskell Generieren von Graphen mit QuickCheck-Eigenschaften

Der Typ 'Kante' repräsentiert eine Kante zwischen zwei Knoten.

data Edge v = Edge {source :: v, target :: v} 
      deriving (Show,Eq,Ord) 

Der Typ "Graph" repräsentiert einen gerichteten Graphen.

data Graph v = Graph {nodes :: Set v, edges :: Set (Edge v)} 
      deriving Show 

Die Funktion 'isDAG' testet, ob eine Grafik azyklisch ist.

isDAG :: Ord v => Graph v -> Bool 
isDAG g = isValid g && all nocycle (nodes g) 
where nocycle v = all (\a -> v `notMember` reachable g a) $ Set.map target (adj g v) 

Die fuction Tests 'isForest', wenn eine gültige DAG ein Wald (eine Reihe von Bäumen) ist

isForest :: Ord v => DAG v -> Bool 
isForest g = isDAG g && all (\v -> length (adj g v) <= 1) (nodes g) 

Die Generatoren Code ist:

DAGs Generator

dag :: (Ord v, Arbitrary v) => Gen (DAG v) 
dag = arbitrary `suchThat` isDAG 

Wälder Generator

forest :: (Ord v, Arbitrary v) => Gen (Forest v) 
forest = arbitrary `suchThat` isForest 

Ich möchte die Generatoren Dag und Forest verbessern, so dass sie auf ihren Eigenschaften und nicht mit "solchem ​​That" definiert sind. Wie kann ich es tun?

Vielen Dank im Voraus.

+2

Mögliche Duplikat [Arbitrary-Instanz für unvoreingenommene Graphen für Quick Check Erzeugen] (http://stackoverflow.com/questions/36398392/arbitrary-instance-for-generating-unbiased-graphs-for-quickcheck) – user2407038

+0

Es ist nicht Ich habe das überprüft und es beantwortet meine Frage nicht. Was ich verbessern möchte, sind diese Generatoren und nicht die Instanz. Kannst du helfen? – Anonymous

+1

Ich bin mir nicht sicher, was Sie meinen, indem Sie die Generatoren "verbessern". So wie es aussieht, fragt diese Frage nicht mehr als das Duplikat - beide Fragen fragen nach dem Schreiben von "weniger voreingenommenen" Generatoren. – user2407038

Antwort

2

Ich glaube, die Frage im Kern ist, wie DAGs und Wälder zu generieren.

Was ist ein Wald? Der Wald ist eine Sammlung von Bäumen. Was ist ein Baum? Baum ist ein Diagramm, in dem jeder Knoten außer dem Stamm genau ein Elternteil hat. Wie machen wir daraus einen Algorithmus? Erzeuge eine Liste von Knoten. Für jeden Knoten in der Liste, der von links nach dem Zufallsprinzip geht, wählen Sie ein Element rechts von ihm als sein Elternelement aus und erstellen Sie eine Kante.

Was ist ein DAG? DAG ist ein gerichteter azyklischer Graph. Was können wir mit DAGs machen? Wir können sie topologisch ordnen. Was bedeutet das? Es bedeutet, dass wir sie in eine Reihenfolge bringen können, in der jede Kante von links nach rechts verläuft. Wie machen wir daraus einen Algorithmus? Erzeuge eine Liste von Knoten. Für jeden Knoten in der Liste, der von links geht, wählen Sie zufällig eine Teilmenge von Elementen rechts davon aus und erstellen Sie eine Kante für sie.

+0

Vielen Dank für Ihre Antwort. Aber haben Sie eine Idee, was ich tun sollte, um Grafiken zu generieren, die die DAG-Eigenschaft erfüllen? Statt "so that"? Vielen Dank im Voraus. – Anonymous

+1

Der zweite Teil meiner Antwort beantwortet diese Frage. – niteria