← 首页 / 把整数名额按比例分下去 待审核
apportionment

把整数名额按比例分下去

一个看似无害的问题:把一组带小数的比例,四舍五入成整数,结果加起来不等于该有的总数。饼图的三块写 20% / 30% / 49%,合计只有 99%;议会按得票分席位,floor 之后总有几席没分出去。根因是取整不守恒——本页从「饼图百分比凑不齐 100」这个具体 bug 出发,引出 apportionment(配额分配)这一整类问题:最大余额法如何补齐总数、它隐藏的 Alabama 悖论,以及除数法如何从根上绕开悖论。每个 demo 都可拖动参数,实时看分配结果怎么变。

1 · 饼图百分比:四舍五入为什么凑不齐 100%

三块占比 20.3% / 30.4% / 49.3%,精确值合计正好是 100%。可一旦各自四舍五入成整数——20 / 30 / 49——合计只剩 99%。问题不在某一次 round,而在独立取整本身不守恒:各项的小数被各自截断,丢掉的零头并不会自动补回到总数上。最大余额法把取整拆成两步:先取 floor,再把差额名额按小数余数从大到小补回,从而让整数合计精确等于 100。

拖三个滑块改变三块的原始权重,饼图与下方表格实时更新。先看 naïve round 那行的合计——它常常是 99 或 101;再看最大余额法怎样把缺/超的名额,精确地补到余数最大(或扣自余数最小)的那几块上。

1.1 · 为什么是「余数最大」优先

floor 之后每一块都了自己的小数余数 frac=exactfloorfrac = exact - floor。总共欠出的名额 k=100Σfloork = 100 - Σfloor 必须补回 k 个整数,补给谁最公平?——补给欠得最多(余数最大)的那 k 块,使每块最终值与精确值的偏差最小。这等价于最小化 ΣseatiexactiΣ|seat_i - exact_i|,所以最大余额法又称 Hamilton 法,是「在守恒约束下最贴近精确比例」的取整。

1.2 · 它真实跑在哪里

图表库的百分比标签(ECharts / Highcharts 都处理过这个 bug)、预算 / 成本按比例摊到整数单位问卷结果的整数百分比展示、以及一切「把连续比例落成整数又要求合计守恒」的场景。把总名额从 100 换成议会席位数,它就是选举里的 Hare quota + 最大余额——但那里它会暴露出一个麻烦:Alabama 悖论。

2 · Alabama 悖论:总名额变多,有人却分得更少

最大余额法在「凑齐总数」上无懈可击,却藏着一个反直觉的毛病:把各方的份额原封不动,只把要分配的总名额 H 调大一个,某一方的名额竟会不增反降。这不是 bug,而是「按余数补齐」这一步的数学必然——1880 年美国众议院按各州人口重分席位时,Alabama 州就因总席位从 299 增到 300 反而少了一席,故得名。

下面固定一组人口,拖动总席位 H。折线是各方席位随 H 的变化;当某条线在 H 增大时向下拐(出现红圈),就是一次 Alabama 悖论。默认人口 6 : 6 : 2,在 H=1011H=10\to 11 处第三方从 2 席跌到 1 席。

2.1 · 悖论从哪来

席位增加时,每一方的精确配额 exact=pop/ΣpopHexact = pop/Σpop \cdot H 都按同一比例放大,小数余数却各涨各的。总名额 +1 时,大方的余数可能刚好越过进位线、把那一席「抢」过去,小方原本靠余数勉强拿到的 +1 反而被挤掉。根子在于:最大余额法用「余数排名」分配缺口,而排名是非单调的——全局加一个名额,不保证每个人都不变差。

2.2 · 怎么绕开

除数法 (D'Hondt / Sainte-Laguë) 不算余数,而是一席一席地分给「平均数最高」的一方。席位增加只是多分一席,已分出的从不收回,因此单调、无 Alabama 悖论——代价是放弃了「配额约束」(某方席位可能偏离其精确配额超过 1)。鱼与熊掌不可兼得,这正是 Balinski–Young 定理

3 · 除数法:逐席分给「平均数最高」的一方

Alabama 悖论的病根,是最大余额法靠「余数排名」一次性补齐缺口。除数法换一条思路:一席一席地分,每一席都交给当前平均数最高的一方,平均数 = 票数÷除数票数 \div 除数,而除数随该方已得席数递增。D'Hondt (Jefferson) 用除数序列 1,2,3,{1, 2, 3, \dots},Sainte-Laguë (Webster)1,3,5,{1, 3, 5, \dots}——前者让大党更容易连拿、偏向大党,后者对中小党更友好。

下表每个格子是该方除以对应除数后的。把所有商从大到小取前 H=10 名,就是 10 个席位的归属。点下一席 ▸ 单步看每一席被谁抢走(橙框 = 这一步选中的最大商),切换两种除数序列,对比同一组票数下大党拿到的席位差异。

3.1 · D'Hondt 为什么偏向大党

D'Hondt 的除数 1,2,3{1,2,3\dots} 增长慢,大党即使连拿几席,平均数下降也不快,容易继续压过小党;Sainte-Laguë 的除数 1,3,5{1,3,5\dots} 一上来就跳到 3,大党拿第二席后平均数近乎腰斩,机会更快让给小党。本例 47 : 16 : 15 : 12 共 10 席:D'Hondt 给最大党 6 席,Sainte-Laguë 只给 5 席——后者与最大余额法结果一致。

3.2 · 为什么没有 Alabama 悖论

除数法把分配看成一串从大到小取商的过程:总席位从 H 增到 H+1,只是再取下一个商、多发一席,前 H 个归属原封不动。因此席位关于 H 单调不减,根除了 Alabama 悖论。代价是它不保证配额约束——某方席位可能比其精确配额多/少超过 1 席。守恒、单调、配额三者不可兼得(Balinski–Young 定理)。

一条主线:比例是连续的,名额是整数,两者之间总要取整,而取整不保证守恒、也不保证单调。最大余额法从「凑齐总数」入手却带来悖论;除数法放弃「精确配额」、改保「单调与无悖论」。没有一种分配能同时满足所有公平性公理——这是 Balinski–Young 定理,本页三节就是它的三个侧面。

相关链接

  • 饼图百分比 zhangwenli.com 本系列的缘起:修 ECharts 饼图标签「整数百分比合计不为 100」的 bug,正是最大余额法的应用。
  • Largest remainder method Wikipedia 最大余额法 (Hare / Hamilton) 的定义、配额取法 (Hare / Droop) 与它的几种悖论。
  • Apportionment paradox Wikipedia Alabama / Population / New-states 三大悖论,以及它们的历史背景。
  • Highest averages method Wikipedia 除数法家族:D'Hondt / Sainte-Laguë / Huntington–Hill 各自的除数序列与偏向。
  • Balinski–Young theorem Wikipedia 不可能定理:没有分配法能同时满足配额约束、且免于 population / Alabama 悖论。