Optimization Julia-生成2-匹配奇数集
在Julia中,给定一个长度大于3的名为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
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
,这意味着,当存在多个时,返回任何符合条件的。然而,尽管我不确定,我仍在努力,我猜想最小的会是最好的:)首先,返回任何一个存在的就足够了,而且很好:)