【发布时间】:2015-01-26 08:13:47
【问题描述】:
让A 成为向量单元。为方便起见,将这些向量表示为V1、V2、...
我想找到没有“巧合”的最大向量集。当满足以下任一条件时,两个向量 Vn 和 Vm 之间会发生重合:
- 这两个向量有一些共同的值,即
Vn(i)==Vm(j)对应一些i,j。 - 这两个向量有两个在
100中不同的值,即abs(Vn(i)-Vm(j))==100对于某些i、j。
例子:
A = {[2 5],[8 9 2],[33 77 4],[102 6],[10 66 17 7],[110 99],[1 4 3],[15 41 88]}
Possible_Result = {[2 5],[33 77 4],[10 66 17 7],[15 41 88]}
为了不使我的问题复杂化,在几个可能的结果之间选择一个结果并不重要。
【问题讨论】:
-
非常有趣的问题。我能看到你这样做的唯一方法是蛮力(à la Luis Mendo)。顺便说一句,这是knapsack problem 的重新表述,它是NP-complete problem。目前没有多项式时间算法可以有效地解决这个问题,所以解决这个问题最直观的方法是蛮力。我希望你的数据集不是很大,因为随着数据集变大,这类问题会以指数级增长!
-
@rayryeng 非常有见地的评论让我觉得我的代码实际上可能没有找到最大集合。也许最好的方法是“蛮力”:测试所有个可能的子集,看看它们是否满足你的条件。我的方法只是在进行所有成对比较的意义上“粗暴”,而不是测试所有可能的子集
-
@rayryeng 我确实知道背包问题,但我没有看到这是它的一个实例。无论如何,我认为我的答案现在找到了一个最大子集;但当然是在非多项式(实际上是指数)时间内。有时使用蛮力会产生一种奇怪的内在满足感:-D
-
@rayryeng 直觉好!
-
@LuisMendo - 我还是会这么说。最终,您将根据查看一对项目来选择单个项目。成本将是成对的,而不是单独的。
标签: matlab cell knapsack-problem