【发布时间】:2013-04-09 12:58:34
【问题描述】:
假设您有一堆集合,而每个集合都有几个子集。
Set1 = {(香蕉、菠萝、橙子)、(苹果、羽衣甘蓝、黄瓜)、(洋葱、大蒜)}
Set2 = {(香蕉、黄瓜、大蒜)、(鳄梨、番茄)}
...
SetN = { ... }
现在的目标是从每个集合中选择一个子集,而每个子集必须与任何其他选定的子集没有冲突。对于这个玩具大小的示例,一个可能的解决方案是选择(香蕉、菠萝、橙子)(来自 Set1)和(鳄梨、番茄)(来自 Set2)。
如果选择 Set1 和 Set2 的第一个子集,则会发生冲突,因为香蕉将包含在两个子集中(这是不可能的,因为它只存在一次)。
即使有很多算法,我也无法选择合适的算法。我不知何故陷入困境,希望针对以下问题提供答案:
1) 如何找到合适的算法,并以算法可以处理的方式表示这个问题?
2) 这个玩具大小示例的可能解决方案可能是什么样的(任何语言都可以,我只是想了解一下)。
Edit1:我也在考虑模拟退火(返回一个可能的解决方案)。这对于最小化例如选择集合的总成本可能是有意义的。但是,我不知道如何做出适当的问题描述,将“冲突”考虑在内。
【问题讨论】:
-
我不太确定第二个答案如何无法解决 (1)。它将输入表示为一组字符串。作者提到它效率低下,因为字符串比较很慢。要回答您关于 100 个集合和每个集合 30 个集合的问题……我认为回溯算法(据我所知,所提出的两种解决方案都是相同的)运行速度不够快。在输入该大小时,您可能会考虑使用机器学习算法
-
基于这两个建议,我现在能够使用算法 X 和主要/次要列来实现这一点。基于此,鉴于无论如何它是投票率最高的答案,我已经接受了这个解决方案。 Haskell 中的解决方案是正确的,但对我来说并不那么容易获得。