![](/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.