在一组频率值中,如何找到谐波相关频率值的一些最佳子集?

时间:2014-03-13 10:59:07

标签: algorithm

我有一组频率值,我想找到符合以下条件的最可能的值子集:

    每个子集中的
  • 值应与谐波相关(约为给定值的倍数)

  • 子集的数量应尽可能小

  • 每个子集的最小缺失次数应小于最高值

E.g。 [1,2,3,4,10,20,30]应该返回[1,2,3,4]和[10,20,30](所有值都不是最优的集合,因为即使它们是和谐相关,有许多缺失值)

蛮力方法可以计算集合中所有可能的值子集并计算一些成本值,但这需要花费太长时间。

是否有任何有效的算法来执行此任务(或类似的东西)?

1 个答案:

答案 0 :(得分:2)

我会将问题简化为minimum set cover,虽然NP-hard,但在实践中通常可以通过整数编程有效地解决。我假设将[1,2,3,4,8,12,16]分解为[1,2,3,4]和[4,8,12,16]是合理的, 4重复。

要解决集合覆盖(好吧,无论如何要使用股票整数程序求解器),我们需要枚举所有允许的最大子集。如果基本(即给定值)必须属于该集合,那么,对于每个频率,我们可以按顺序枚举其倍数,直到缺少连续的多个。如果没有,我们尝试所有频率对,假设它们的基频是approximate greatest common divisor,并向下和向上延伸子集,直到缺少太多频率。