我正在寻找一种可以采用一组自然数的算法,例如:
S = {1, 3, 4, 2, 9, 34, 432, 43}
然后将它们分成尽可能相等的堆。桩的数量预定义为n。
目标是使每桩和最低桩之间的差值之和最小。
这是一个例子。
假设你有:
S = { 1, 2, 2, 3, 1, 2, 3 }
n = 3
然后解决方案可能
N1 = { 1, 2 }
N2 = { 2, 3 }
N3 = { 1, 2, 3 }
这些桩的总和将是3,5和6.错误将是:(5 - 3)+(6 - 3)= 5.
算法需要找到误差最小的解决方案。
感谢任何帮助。如果不清楚,请评论。
答案 0 :(得分:1)
这听起来像https://en.m.wikipedia.org/wiki/Bin_packing_problem的变体。然而,没有给出箱的尺寸,因此它至少与箱包装一样坚硬。因此,问题是NP难。
对于近似解决方案,您可以例如计算平均箱尺寸并执行首次拟合或最佳拟合的调整,以允许小的过度包装。
答案 1 :(得分:1)
我认为没有有效的方法来解决这个问题,因为它是一个NP难题。
证明:
让我们将您提出的问题表示为P *,
我们可以通过执行以下操作将分区问题(已知的NP-hard)减少为P * 给定任意分区问题P1,我们要求解决P *的黑盒子用N = 2来解决P1(即,将该组分成最小化不同的2堆)。
如果黑盒子返回的差值为零,则>有一个解决方案P1
如果黑盒子返回的差值不为零,则> P1没有解决方案
因此,P *是NP-hard