首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用test.check生成随机图?

如何用test.check生成随机图?
EN

Stack Overflow用户
提问于 2018-10-31 12:49:51
回答 1查看 151关注 0票数 2

为了生成测试,我试图以邻接列表的形式生成一个随机图。一个例子图是:

代码语言:javascript
复制
{:a #{:a :b}, :b #{:a :b}}

(邻接列表以集的形式实现。)

我的第一个想法是:

代码语言:javascript
复制
(def vertex-gen (tcgen/fmap (comp keyword str) tcgen/char-alpha-numeric))

(def random-graph-gen-1
  (tcgen/let [vertices (tcgen/set vertex-gen {:min-elements 1})]
             (tcgen/map (tcgen/elements vertices)
                        (tcgen/set (tcgen/elements vertices)))))

(之所以需要{min-elements 1},是因为tcgen/elements不适用于空集。)

但是,这样做可能会生成图,例如

代码语言:javascript
复制
{:a #{:a :b}}

其中,:b是随机为:a的邻接列表选择的,而不是为图本身选择的,因此:a有一个不存在的邻域。

另一个选择是

代码语言:javascript
复制
(def random-graph-gen-2
  (tcgen/let [vertices (tcgen/set vertex-gen)]
             (->> vertices
                  (map #(->> vertices
                             (tcgen/elements)
                             (tcgen/set)
                             (tcgen/generate)
                             (vector %)))
                  (into {}))))

它遍历所有顶点并显式地为每个顶点生成一个随机邻接列表。这保证了所有的顶点都会出现在图中,但缺点是test.check没有看到生成的邻接列表。所以我担心这会破坏缩小的逻辑。

是否有一种解决方案可以避免这两种缺陷?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-31 14:29:11

另一种方法是:

代码语言:javascript
复制
(def graph-gen
  (gen/let [vertices (gen/set vertex-gen {:min-elements 1})
            edges (-> vertices
                      (gen/elements)
                      (gen/set)
                      (gen/vector (count vertices)))]
    (zipmap vertices edges)))

这引入了第二个生成器,它为每个顶点生成一组边,然后将顶点和边压缩到一个映射中。

在第二个例子中使用generate将引入不受整个生成器大小约束的随机性。来自generate docstring:

请注意,此函数是一个dev助手,不打算用于构建其他生成器。

但是您可以使用generate从不同大小的生成器中进行采样:

代码语言:javascript
复制
(gen/generate graph-gen 2)
=> {:F #{}, :e #{}, :S #{:e}}
(gen/generate graph-gen 10)
=>
{:L #{:n :7 :8 :H},
 :n #{:L :n :7 :C :8 :b :H :V},
 :7 #{:L :7 :C :8 :9 :b},
 :C #{:L :9 :V},
 :8 #{:L :n :7 :C :8 :9 :b :V},
 :9 #{:L :b :a},
 :b #{:n :V},
 :H #{:a},
 :V #{:n :C :b :H},
 :a #{}}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53083757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档