2016-04-23 11 views
1
data Edge v = Edge {source :: v, target :: v} 
      deriving (Show,Eq,Ord) 

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


instance Arbitrary v => Arbitrary (Edge v) where 
    arbitrary = do s <- arbitrary 
        t <- arbitrary 
        return $ Edge {source = s, target = t} 

instance (Ord v, Arbitrary v) => Arbitrary (Graph v) where 
    arbitrary = aux `suchThat` validGraph 
     where aux = do lNodes <- arbitrary 
         lEdges <- arbitrary 
         return $ Graph {nodes = fromList lNodes, edges = fromList lEdges} 

Ich habe dies derzeit, um meine Graphen zu generieren. Allerdings habe ich bei der Verwendung von Sample auf ghci festgestellt, dass es entweder keine Kanten erzeugt oder nur eine erzeugt. Ist es möglich, die Anzahl der erzeugten Kanten zu steuern? Wie würde ich es tun?Erzeuge Kanten aus einer beliebigen Liste von Knoten

BEARBEITEN: Ein Graph wird als gültig betrachtet, wenn: 1-Die Quell- und Zielknoten einer Kante existieren. 2-A-Knoten kann nicht die Quelle für mehr als eine Kante sein.

+1

scannen muss, es ist wahrscheinlich wirklich schwer (man könnte sagen, es ist sehr * lucky *) zu erzeuge ein 'validGraph' wie dieses (besonders wenn es mehr Kanten gibt) - es ist wahrscheinlich besser, Knoten zu generieren und dann Paare von Knoten daraus zu zeichnen, um Kanten zu erzeugen – Carsten

+0

Die Sache ist, dass diese Paare willkürlich erzeugt werden müssen. Wie sage ich Haskell, zufällige Paare zu bilden? – ohiohai

Antwort

3

Ein arbitrary Wert ist ein Wert in der Gen Monade. Sie können mehr in dieser Monade als nur kombinieren arbitrary Werte zusammen.

choose :: Random a => (a, a) -> Gen a 

Generieren ein zufälliges Element in dem gegebenen inklusiven Bereich: Sie können mit choose keines der anderen Gen Operationen ausführen.

können Sie choose verwenden als nur arbitrary diejenigen andere Zufallswerte zu erzeugen.

Diese naive Implementierung ist nicht sehr effizient beim Generieren großer Graphen. Es könnte ein Faktor der Anzahl von Knoten in der Grafik schneller sein, wenn es nicht die Liste für die generierten Werte jedes Mal, wenn es elements

+0

Ich sehe. Allerdings bringt mich das zum selben Problem .. Entweder erzeugt es keine Kanten oder, wenn ich es mit etwas vergleiche, was du mir geschickt hast, tut es das aber nicht so, dass mein Graph als gültig betrachtet würde ... – ohiohai

+0

BTW, weiter mit dem, was ich zuvor kommentiert: Wenn ich es mit dem, was Sie mir gesendet haben, erzeugt es keine gültigen Graphen, weil es wiederholt Knoten als "Quelle" zu mehreren Kanten verwendet. Ein gültiges Diagramm kann keinen Knoten haben, der Quelle für mehr als eine Kante ist. – ohiohai

+0

@ohiohai Das sind nicht die Kriterien für die Gültigkeit, die Sie in der Frage angegeben haben. Wenn ein Knoten nicht die Quelle für mehr als eine Kante sein kann, können Sie für jeden Knoten 0 oder 1 Kanten generieren, anstatt eine Menge beliebiger Kanten zu erzeugen. Es schlägt auch vor, dass der Graph-Datentyp falsch ist, da Sie das Diagramm als "Map k (Maybe k)" darstellen können und jeder Graph immer gültig ist. – Cirdec

Verwandte Themen