我正在研究任务调度程序并面临以下问题(处理器之间的任务分配):
有一组N个整数。如何将它们划分为K个不相交的子集,这些子集的总和差别很小?
我正在寻找一种简单的启发式方法,它具有合理的计算复杂度,N = 100-500和K = 10-20。在最优解中不需要(即最小可能的和差),粗略近似就足够了。
提前致谢。
答案 0 :(得分:2)
构建启发式First Fit或First Fit Decreasing效果很好。
对于First fit Decreasing,首先对尺寸逐渐减小的部件进行排序(在下面的示例中:A,B,C,D),然后将它们逐个放入最佳剩余点(X或Y)。在下面的示例中,忽略2个维度中的1个(例如,忽略CPU)。
答案 1 :(得分:1)
这是你正在寻找的论文,我想:
多路编号分区
Richard E. Korf
计算机科学系
加州大学洛杉矶分校
洛杉矶,加利福尼亚州90095 korf@cs.ucla.edu
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.150.2326&rep=rep1&type=pdf
答案 2 :(得分:1)
即使分成2也是NP完全的。虽然你可以使用伪多项式时间算法。提到on Wikipedia,假设你有数字总和的上限。
答案 3 :(得分:0)
事实证明,简单的greedy algorithm在这种情况下效果很好。