用于优化分组值列表的算法

时间:2011-07-25 13:49:12

标签: algorithm

我有几个号码。我需要将它们分成几组,以便一组中所有数字的总和在预定义的最小值和最大值之间。关键在于尽可能少地编号。

Input:
    min, max: range for sum of numbers
    N1, N2, N3 ... Ni: numbers to group
Output:
    [N1,N3,N5],[Ni,Nj,Nk,Nm...]...: groups where sum of numbers is between min and max
    Na,Nb,Nc...: numbers, left ingrouped.

2 个答案:

答案 0 :(得分:1)

这个问题可以看作是装箱大小max的箱子,有一个有趣的目标:尽量减少未装入至少min的箱子的物品数量。从装箱文件中得出的一个想法是,“小”物品(在这种情况下,相对于max - min较小的物品)易于包装,但对大多数可能性的组合爆炸负责。因此,一些用于装箱的近似算法为大件物品做了一些巧妙的事情,然后填写了小件。减少可能性数量的另一种方法是将数字四舍五入以属于较小的集合。对于bin pack(圆形)来说,如何做到这一点有点明显,但目前还不清楚该怎么办。


好的,我将举例说明如何实例化这些想法。假设max = 1且min = 1/2。让我们试着找到一个与max = 2和min = 1/2时的最优匹配的解决方案。 (这可能听起来很糟糕,但这种近似保证了OPT在更高标准下的使用有时会在文献中使用。)

首先将每个项目的大小调整为2的幂。非常大的项目,大小为4或更大,无法打包。尺寸为2或1或1/2的大件物品都有自己的箱子。尺寸为1/4或更小的小件物品按如下方式处理。每当尺寸为1/4或更小的两件物品具有相同的尺寸时,将它们组合成一个超级物品。将所有1/2尺寸的新物品装入自己的垃圾箱。其余的总大小不到1/2。如果另一个垃圾箱中有空间,请将它们放在那里。否则,给他们自己的垃圾箱。

max = 2的最终解决方案的质量至少与最大值为1的OPT质量一样好。采用max = 1的最优解决方案并围绕项目大小。坏箱的集合保持不变,因为没有物品更小,每个箱子存储少于2,因为每个物品的数量不到以前的两倍。现在足以证明我给出2的幂的打包算法是最优的。我会把它留作练习。

我不认为这会立即推广到一个完整的算法。我必须重新开始工作,但我采取的方法是强制OPT处理max = 1而ALG在舍入步骤中使用max = 1 + epsilon,将(1 + epsilon)的幂替换为2的幂,然后找出如何打包小项,可能使用动态程序,因为贪婪可能不起作用

答案 1 :(得分:0)

如果您不担心效率,只需生成每个可能的分组,并选择在您描述的意义上正确和最佳的分组。显然,这适用于任何有限的数字列表(并且根据定义,是最佳的)。

如果需要效率,问题似乎变得更加困难。 :D我会继续思考。

编辑:想想看,这个问题似乎至少和“子集和”一样困难,因此,我认为没有一个解决方案明显优于我给出的解决方案(即,没有已知的多项式)如果是NP-Hard,时间算法可以解决它。