![](/img/trans.png)
[英]Testing 'DAG' aka acyclic graphs properties in Haskell QuickCheck
[英]Haskell Generating graphs with QuickCheck properties
图形具有以下属性:
类型“边缘”表示两个节点之间的边缘。
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
功能“ isDAG”测试图是否为非循环图。
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)
功能“ isForest”测试有效的DAG是否为森林(一组树木)
isForest :: Ord v => DAG v -> Bool
isForest g = isDAG g && all (\v -> length (adj g v) <= 1) (nodes g)
生成器代码为:
DAG发生器
dag :: (Ord v, Arbitrary v) => Gen (DAG v)
dag = arbitrary `suchThat` isDAG
森林发电机
forest :: (Ord v, Arbitrary v) => Gen (Forest v)
forest = arbitrary `suchThat` isForest
我想改进生成器Dag和Forest,因此它们是基于其属性而不是“ suchThat”定义的。 我该怎么做?
先感谢您。
我认为核心问题是如何生成DAG和森林。
什么是森林? 森林是树木的集合。 什么是树? 树是一个图,其中除根以外的每个节点都只有一个父节点。 我们如何将其转化为算法? 生成节点列表。 对于列表中从左到右的每个节点,随机选择一个位于其右侧的元素作为其父元素,并为其创建边。
什么是DAG? DAG是有向无环图。 我们可以用DAG做什么? 我们可以在拓扑上订购它们。 这意味着什么? 这意味着我们可以将它们按顺序排列,每个边缘从左到右。 我们如何将其转化为算法? 生成节点列表。 对于列表中从左到右的每个节点,随机选择一个在其右侧的元素子集并为其创建边。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.