这个问题本质上是选举制度中的分配问题,因此它已经被数学家和政治科学家广泛研究(不一定具有相同的标准)。
分配问题包括将议会席位分配给基于选举结果的政党或名单(例如西班牙或荷兰),以及将议会席位分配给基于人口(例如美国各州)、投票人口甚至前一次选举的总票数的地方选区。政治要求导致了对基本算法的各种调整,包括最小值和最大值(就像你的问题一样)和非线性。
除非极少数情况下,否则不可能实现完美的比例,使每个实体的分配与该实体的权重(选票/人口/等)完全成比例。分配算法通常被期望最小化不成比例性,但如何衡量不成比例性尚无共识,因此对于相同的权重,通常会有不同(但类似)的分配,每个分配都最小化不同的指标。
在很大程度上,我们可以将分配算法分为两大类:最大公约数(或最大平均数)和最大余数。
最大公约数方法
最大公约数方法试图找到某个“q”,使实体“i”的分配计算为:
A<sub>i</sub> = ⌊W<sub>i</sub>/q + α⌋
其中,Wi
是实体i
的权重,α是范围在[0,1)内的某个数字。几乎总会有这样一个q
,除非两个或更多实体并列,这种情况下可能需要任意选择一些并列实体的子集来奖励额外分配。常见的α值为0(“D'Hondt方法”)和0.5(“Sainte-Laguë方法”),这两种方法分别以开发相应算法并证明其最优性的数学家命名(显然使用略有不同的度量标准)。D'Hondt方法倾向于稍微偏向具有较大权重的实体,但在除斯堪的纳维亚以外的比例代表制系统中最常用的方法是该方法,而斯堪的纳维亚使用更类似于Sainte-Laguë的方法,这些方法对于权重更加中立。 (α大于0.5的值倾向于更小的权重。)(下面提供了找到商q
的算法。)
目前在美国各州之间分配国会席位的方法略有不同:亨廷顿-希尔方法(以数学家和统计学家命名)。 在此方法中,与其尝试线性般地舍入分配(如在Sainte-Laguë中),不如根据几何平均数舍入分配。
最大余额法
最大余额法通常被认为更易于理解,执行该方法的算法稍微简单,但结果的稳定性存在一些问题。 在这里,我们首先计算一个q
值,该值已知会导致使用相同公式(将α设置为0)分配正确或少一个实体。然后有必要为某些实体的子集分配高达一个以上的分配; 这是通过对由floor运算符丢弃的余数进行排序,并将额外的分配授予具有最大余数的实体来完成的(因此得名“最大余额”)。
有多种方式可以计算 q
以提供最大余额方法的起始点,并且最终结果取决于 q
的初始选择(有些难以预测)。正是这种不可预测性导致了对最大余额方法的批评:曾经在美国用于将国会席位分配给各州,但由于“阿拉巴马悖论”的结果而更改了算法;即一种特定人口分布,其中增加一个额外的国会席位将导致阿拉巴马州的分配变小。
尽管如此,最大余额机制仍在一些司法管辖区中使用,并且经常基于(可以认为是错误的)假设而提出,即理解数学比偶发的悖论结果更重要。 计算 q
的两个常见公式是(这里,N
是要分配的数量):
其中,德鲁普公式更为常见。
算法
采用最大余数法分配的O(N)算法非常简单。首先计算出q
(如上所述),然后通过将每个权重除以q
并取整来进行初始分配;这些初始分配值进行求和并从期望的总分配中减去。差值k
必须是0到N
之间的整数;随后找到最大的k
个余数,并将这些实体的分配增加。可以使用快速选择在O(N)时间内完成此操作,尽管很常见看到代码执行完整的O(N log N)排序。
最简单的最大约数算法公式为O(ΣA log N),其中N
是实体的数量(如上所述),而ΣA
是总分配量。对于最简单的情况——D'Hondt分配——我们从将每个实体分配为0开始,然后将N
个实体放入按比较计算比率Wi/(Ai+1)
排序的最大堆中。然后我们迭代地增加堆顶上的实体分配量,这会改变其比较值,从而强制进行下堆操作,直到分配总额达到所期望的总数。由于堆始终具有大小N
,因此每个ΣA
下堆操作需要时间log(N)。然而,我们可以通过构建商的初始估计值和基础分配(就像使用最大余数法一样),然后从该起点执行算法,从而显着提高此运行时间。如果初始猜测与正确的分配量相差不超过N
,则总时间为O(N log N)
。(例如,这种修改在巴西选举法律中得到描述。)
Sainte-Laguë机制将比较计算替换为Wi/(2×Ai+1)
,这有效地导致比较在分配范围[Ai, Ai+1)
的中间点处进行。类似地,Huntington-Hill几何平均算法使用基于Wi/√(Ai×(Ai+1))
的比较。这些修改都不影响渐近复杂度。
合并最小和最大分配
将这些算法调整为最小和最大分配可以通过多种方式完成,具体取决于希望优化的比例度量标准。我不知道有关最大值的真实世界示例,但当使用最小余数方法在子国家实体之间分配席位时,最小值非常常见,因为即使实体非常小,一般认为没有代表是不民主的。一个非常普遍的规则是将最小分配分离出来,并仅对剩余要分配的内容运行上述算法之一。(这就是美国和秘鲁在将席位分配给州/部门时使用的机制。)结果,当然会不成比例地惠及较小的子国家实体,因为对于只有两个席位的实体来说,“免费”的额外席位的价值比对于有36个席位的实体来说更大。
使用最大公约数方法,一个简单而明显更为比例的解决方案是预先分配最小值,然后从那个起点继续使用标准算法。如果一个实体达到其最大值,它将被从堆中移除而不是向下堆叠,从而使其无法用于未来的分配。
对于最大余数,可以做类似的事情。例如,可以根据公式执行初始分配,然后调整以符合最大值和最小值。如果调整减少了一个或多个达到其最大值的分配,则次要分配可能会超过实体数量,但这并不会使算法变得更加复杂(每个分配将增加k或k+1而不是0或1),除了需要注意避免次要分配超过最大值。另一方面,如果许多分配增加以符合最小值,那么可能会发现次要“分配”成为使用最小余数而不是最大余数的负分配(同样要注意不降低任何实体的最小值)。