簡體   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