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.
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
Die Sache ist, dass diese Paare willkürlich erzeugt werden müssen. Wie sage ich Haskell, zufällige Paare zu bilden? – ohiohai