选择最佳的元素配对

时间:2016-07-29 23:16:07

标签: algorithm matching

我有以下问题,例如: 给出一个带符号的桶 1 1 2 3 3 4
还有创造配对的食谱书,例如: 12 13 24
从桶优化配对中选择,在桶中留下尽可能少的符号。因此,使用上面的示例性值,最佳配对将是:
13 13 24哪个会使用给定的所有符号 从桶中挑选天真可能会导致如下情况:
12 13离开34无法比拟。 34无法匹配,因为该书不包含该特定连接的配方

备注:
真正的问题平均包含: 500 元素,大约 30 种符号。

我们尝试使用强力算法来实施解决方案,但是我担心即使是我们的孙子也不会活得足够长,看不到结果:)。

食谱书的大小没有限制,甚至可以在桶中尽可能地使用。不允许两次由相同元素组成的对。

完全清空水桶不需要答案。它只是让大多数成对出局。可以把一些留在桶里。最好寻找最佳解决方案,但近似也足够好。

我将非常感谢提出/提示解决问题的算法的答案。

示例:
斗:
1 1 2 2 2 2 3 3 3 4 5 6 7 8 8
食谱书:
12 34 15 68
最佳结果(可能之一):
{1 2} {1 2} {3 4} {6 8}
剩余的:
2 2 3 3 5 7 8

2 个答案:

答案 0 :(得分:2)

这个问题基本上是maximum matching problem,只有小转折,你可以拥有重复的对象。假设您有一个最大匹配的求解器,这是解决此问题的一种方法:

  1. 为输入列表中的每个数字创建一个节点。

  2. 对于每个食谱,对于与该食谱匹配的每对数字,在这些数字的节点之间添加一条边。

  3. 运行最大匹配算法并返回以此方式报告的对。

  4. 您可以使用大量现成的最大匹配算法,如果您需要自己编写一个代码,请考虑Edmonds' Blossom Algorithm,这比其他代码效率更高,编码也更少。方法

答案 1 :(得分:1)

首先生成所有可能的符号对,并用每个符号的索引存储它们,所以如果你有n个符号,那么将生成n *(n + 1)/ 2对(最大情况n = 500然后将生成125250对。

Ex:带符号的桶1 1 3 然后生成的对是(11,1,2)(13,1,3)(13,2,3)。 一般格式(a [i] a [j],i,j)。

现在让我们循环生成的对并删除配方书中不存在的对,所以现在我们最多有30对。

接下来让我们构建一个图形,使得节点是我们生成的对,并且如果2对的索引不同(在我们的对上使用2个嵌套循环),则每个2个节点连接。

最后,我们可以执行 BFS DFS ,找到所有生成的图表之间的最长图表,这可以解决我们的问题。

如果您想要c ++ / Java实现,请不要犹豫。