Optimization Julia-生成2-匹配奇数集

Optimization Julia-生成2-匹配奇数集,optimization,graph,set,julia,time-complexity,Optimization,Graph,Set,Julia,Time Complexity,在Julia中,给定一个长度大于3的名为S的Set{Tuple{Int,Int}},例如: julia> S = Set{Tuple{Int,Int}}([(1, 4), (2, 5), (2, 6), (3, 6)]) Set{Tuple{Int64,Int64}} with 4 elements: (2, 5) (3, 6) (2, 6) (1, 4) 我想返回长度大于3的S子集T,并返回奇数(3,5,7,…),这样元组的所有第一个值都是唯一的。例如,我不能有(2,5

在Julia中,给定一个长度大于3的名为
S
Set{Tuple{Int,Int}}
,例如:

julia> S = Set{Tuple{Int,Int}}([(1, 4), (2, 5), (2, 6), (3, 6)])
Set{Tuple{Int64,Int64}} with 4 elements:
  (2, 5)
  (3, 6)
  (2, 6)
  (1, 4)
我想返回长度大于
3
S
子集
T
,并返回奇数(3,5,7,…),这样元组的所有第一个值都是唯一的。例如,我不能有(2,5)和(2,6),因为第一个值2不是唯一的。这同样适用于第二个值,这意味着我不能有(2,6)和(3,6)

如果不可能,返回一个空的元组集就可以了

最后,对于上述最小示例,代码应返回:

julia> T = Set{Tuple{Int,Int}}([(1, 4), (2, 5), (3, 6)])
Set{Tuple{Int64,Int64}} with 3 elements:
  (2, 5)
  (3, 6)
  (1, 4)
如果你认为任何其他类型的结构都比
Set{Tuple{Int,Int}}
:)好,那么我真的愿意接受它


我知道如何用整数规划实现它。但是,我将在大型实例中多次运行此操作,我想知道是否有更好的方法,因为我深深认为它可以在多项式时间内完成,也许可以在Julia中使用聪明的
map
或其他有效函数

您需要的是一种过滤集合中可能的成员组合的方法。因此,创建一个过滤函数。如果您提到的关于奇数[3,5,7…]序列的部分在这里适用,您可能需要将其添加到下面的过滤器逻辑中:

using Combinatorics

allunique(a) = length(a) == length(unique(a))
slice(tuples, position) = [t[position] for t in tuples]
uniqueslice(tuples, position) = allunique(slice(tuples, position))
is_with_all_positions_unique(tuples) = all(n -> uniqueslice(tuples, n), 1:length(first(tuples)))
现在您可以找到组合。对于大型集合,这些集合的数量将爆炸式增长,因此确保在有足够数量时退出。您可以在此处使用Lazy.jl,也可以仅使用函数:

function tcombinations(tuples, len, needed)
    printed = 0
    for combo in combinations(collect(tuples), len)
        if is_with_all_positions_unique(combo)
            printed += 1
            println(combo)
            printed >= needed && break
        end
    end
end

tcombinations(tuples, 3, 4)

[(2, 5), (4, 8), (3, 6)]
[(2, 5), (4, 8), (1, 4)]
[(2, 5), (4, 8), (5, 6)]
[(2, 5), (3, 6), (1, 4)]

看来你的问题对我来说没有唯一的解决办法。(我的意思是,在你提供的例子中,它有,但我不认为它一般有。)。那么,如果有很多解决方案,该怎么办呢?它应该计算所有这些吗?@BenoitPasquier,是的,我写过我想返回
S
的子集
T
,这意味着,当存在多个时,返回任何符合条件的。然而,尽管我不确定,我仍在努力,我猜想最小的会是最好的:)首先,返回任何一个存在的就足够了,而且很好:)