如何在 Julia 中创建具有特定条件的 n 个数组的 0-1 组合



我正在为 Julia 中的 n 个数组设置我巨大的 0-1 组合矩阵。但是,我不想要所有的组合,因为它会产生内存使用问题。我只想有一个与某些特定条件匹配的合法组合,条件是如果 I 列和 J 列为 1,那么此行不应在组合中。

我已经尝试了一些代码 https://discourse.julialang.org/t/cleanest-way-to-generate-all-combinations-of-n-arrays/20127/6 然后删除了不需要的行,但是当涉及到 2^34 组合时,这失败了。

假设我们有 n=6,总共有 64 个 0-1 组合 当元素 1 和 4 的值为 1,2 和 5 为 1,3 和 6 为 1 时,我想排除组合。矩阵应包含 28 行而不是 64 行,如下所示:

0 00 0 0 1

0 0 00 1 0

0 00 0 1 1

0 0 01 0 0

0 0 01 0 1

0 0 0 11 0

0 00 1 1 1

0 01 0 0 0

0 01 0 1 0

0 0 11 0 0

00 1 1 1 0

01 0 0 0 0

01 0 0 0 1

0 1 01 0 0

0 1 0 10 1

01 1 0 0 0

0 1 1 00 1

01 1 1 0 0

1 0 0

0 0 0 0 1 0 00 0 1

1 0 00 1 0

1 00 0 1 1

1 01 0 0 0

1 0 1 01 0

1 1 0 00 0

1 1 0 00 1

11 1 0 0 0

0 0 0 0 00

为什么需要具体化整个数组?最好在需要时动态创建每个组合,或者创建一个迭代器,一次提供一个允许的行。在您链接的话语帖子中,Stefan 对此的描述太 https://discourse.julialang.org/t/cleanest-way-to-generate-all-combinations-of-n-arrays/20127/17,正如他还所说,在不知道您将使用它做什么的情况下,很难提供更多建议。

你可以做一个迭代器,给你大部分你想要的东西

iter = (x for x in Iterators.product(0:1, 0:1, 0:1, 0:1, 0:1, 0:1) if max(x[2] + x[5],x[1] + x[4], x[3] + x[6]) != 2)

您可以在for循环中迭代iter或任何您需要它的内容:

collect(iter)
27-element Array{NTuple{6,Int64},1}:
(0, 0, 0, 0, 0, 0)
(1, 0, 0, 0, 0, 0)
(0, 1, 0, 0, 0, 0)
(1, 1, 0, 0, 0, 0)
(0, 0, 1, 0, 0, 0)
⋮
(0, 0, 0, 0, 1, 1)
(1, 0, 0, 0, 1, 1)
(0, 0, 0, 1, 1, 1)

最新更新