Algorithm 集S到k个划分的公平划分

Algorithm 集S到k个划分的公平划分,algorithm,set,heuristics,data-partitioning,np-hard,Algorithm,Set,Heuristics,Data Partitioning,Np Hard,有一个集合S包含N个整数,每个整数的值为1一个启发式方法是将较大的权重尽可能均匀地分布在行李之间,留下足够小的权重,这样您现在就剩下一个具有大量自由度的子问题。如有必要,重复子问题。此启发式假设您的分布不是太几何,例如,{1000}和{100,10,1},并稍微假设您的惩罚函数将惩罚零赋值或非常大的异常值 例如: distributeFairly(numbers, bins): distributeFairlySubproblem(numbers, bins): n =

有一个集合S包含N个整数,每个整数的值为1一个启发式方法是将较大的权重尽可能均匀地分布在行李之间,留下足够小的权重,这样您现在就剩下一个具有大量自由度的子问题。如有必要,重复子问题。此启发式假设您的分布不是太几何,例如,
{1000}和{100,10,1}
,并稍微假设您的惩罚函数将惩罚零赋值或非常大的异常值

例如:

distributeFairly(numbers, bins):
    distributeFairlySubproblem(numbers, bins):
        n = len(numbers)
        numElementsToDefer = min(-n//3,20*k)  # modify as appropriate, e.g. to avoid len(toPlace)<len(toDefer)

        toDefer = numbers[-numElementsToDefer:]
        toPlace = numbers[:-numElementsToDefer]

        newBins = shoveThemIn(toPlace, copy(bins))
        return distributeFairlySubproblem(toDefer, newBins)

    initialGuess = distributeFairlySubproblem(sorted(numbers,reverse=True), [[]]*k)
    return anneal(initialGuess)
distributeFairly(数字、箱子):
distributeFairlySubproblem(编号、箱子):
n=len(数字)

numElementsToDefer=min(-n//3,20*k)#根据需要进行修改,例如,为了避免len(toPlace)我认为一个好的指标是:

let the result set be s1,s2,...,sk
let MAX be max{sum(si) for each i}
f({s1,...,sk}) = Sigma(MAX-sum(si)) for each i)
好处:一个完美的分布将永远产生0!
缺点:如果没有perperct解决方案,那么最佳结果不会产生0

该问题的贪婪启发式算法为:

sorted<-sort(S) (let's say sorted[0] is the highest)
s1=s2=...=sk= {}
for each x in sorted:
   s <- find_min() (*)
   s.add(x)

sorted让度量最小化max(sum(si)-sum(sj)),其中si和sj是集合S的结果分区中的任意两个子集

假设我们有一个分布D,我们需要在分布D中包含另一个元素x。将它添加到子集s中,以使上述度量最小化


无法证明任何界限,但直觉告诉我们,它能很好地逼近最优值?有谁擅长证明边界吗?

请记录在案,
N完全相同的问题,这里有一个非常好的答案。几乎是一样的。我找到了答案,我已经贴出来了。@Corey-他们的回答是两个问题之间的一个巨大差异。在我的问题中,重排是允许的,而在所提到的问题中,数字不应该被重排rearranged@stOle-您的解决方案需要更多解释,因为这两个问题是如何相同的。您能将一个问题简化为另一个问题吗?我们还需要提供一个好的比较函数来比较两个分区。请详细说明您的heuristic@amit:简洁的解决方案和非常好的努力。我把另一个贪婪的方法作为下面的答案。我试了几次,但没能证明有任何约束力。你能试一试吗?@amit:为了完整性/清晰性,你能在回答中定义“x”和“y”轴吗?@Akhil:它有标签:对于两个直方图,x轴都是度量值(对于每个图形,不同的度量值),而y轴是frequency@amit:图形??度量应该是连续的(作为目标值)。另外,频率代表什么(什么的频率?)@Akhil这是一个直方图,我产生了150个随机样本,并在每个样本上运行了这两种算法。然后,我为每个指标生成了20个箱子的柱状图,以尝试显示哪个更好。这是比较两种启发式算法的标准…请注意,这个度量将是O(n^2),因此算法将是O(n^3)。我认为,对于这个度量,我的答案中的相同断言应该适用,并且有类似的证明,因此界限将是f(sol)@amit:k(分区数)将是一个小数字(从2到10)。因此,复杂性变为(n*k^2)。对于我试图解决的问题,n的最大值是(klogN)^2,在这里我有一些空闲时间,因此我为两种算法和两种启发式编写了Python代码,将很快编辑我的答案并给出结果。看一看,我编辑了我的答案:根据其他算法的度量,每种算法的得分都较高,这是令人惊讶的-因为你建议的算法在它试图最小化的相同度量中得分更低。
base: the set of subsets at start is {},{},.. MAX=sum(si)=0 for each si. 
step: assume the assumption is true for iteration i, we'll show it is also true for iteration i+1:
let s be the set that x was added to, then MAX-sum(s) <= max{S} (induction assumption).
if sum(s) + x <= MAX: we are done, MAX was not changed.
else: we sorted the elements at start, so x <= max{S}, and thus if s was chosen
   (sum(si) >= sum(s) for each si) and sum(s) + x > MAX then: for each si, sum(si) + x >=
   sum(s) + x, so sum(s)+x - sum(si) <= x <= max{S}. since sum(s)+x will be the MAX next 
   iteration, we are done.