Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何使用test.check生成随机图?_Clojure_Test.check - Fatal编程技术网

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

Clojure 如何使用test.check生成随机图?,clojure,test.check,Clojure,Test.check,为了进行生成性测试,我正在尝试以邻接列表的形式生成一个随机图。一个示例图是: {:a #{:a :b}, :b #{:a :b}} (邻接列表以集合的形式实现。) 我的第一个想法是: (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-element

为了进行生成性测试,我正在尝试以邻接列表的形式生成一个随机图。一个示例图是:

{:a #{:a :b}, :b #{:a :b}}
(邻接列表以集合的形式实现。)

我的第一个想法是:

(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
在空集上不起作用。)

但是,这会有生成以下图形的风险:

{:a #{:a :b}}
其中,
:b
是为
:a
的邻接列表随机选择的,但不是为图形本身选择的。所以
:a
有一个不存在的邻居

另一个选择是

(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不会看到生成的邻接列表。所以我担心这会破坏缩小的逻辑


有没有一种解决方案可以避免这两个陷阱?

这里有另一种方法:

(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
引入了不受整个生成器大小限制的随机性。从
生成
文档字符串:

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

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

(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 #{}}