繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM