问题在于:给定4组大小为A,B,C和D的学生,以及总共k个伴侣,设计一种算法,以近乎相等的比例为学生分配伴侣。
您不能只给组k * A / N,k * B / N,k * C / N,k * D / N伴侣,因为伴侣的数量必须是正整数。你不能只是圆,因为那时你可能得不到合适数量的伴侣。所以我的想法是你扔出小数部分,并给每个组赋予整数部分,所以做整数除法。然后你可能会留下一些陪伴者,但最多只有3个,所以把它们交给剩下最多的群体。
然后,采访者指出这是一个问题。如果你添加另一个伴侣,所以将k增加到k + 1,那么可能会发生其中一个组实际上以这种方式失去伴侣。她给了我一个例子,但我不记得了。
有人能想出一种避免这个问题的算法吗?
答案 0 :(得分:9)
您尝试解决的问题通常被称为 分配问题或投票分配问题。这是一样的 分配美国众议院席位数量的问题 每个州的代表。
你的方法(称为汉密尔顿的方法)的稳健性问题 方法或最大余数的方法)没有被称为 Alabama Paradox。来自 维基百科的文章,“阿拉巴马州悖论发现于1880年,当时 结果发现增加座位总数会减少 阿拉巴马州的份额从8到7。“
历史上,美国至少使用了四种不同的方法: 杰斐逊的方法,汉密尔顿的方法,韦伯斯特的方法和 当前Huntington-Hill's method 自1941年以来一直使用。
后面这些方法背后的想法如下。让D = N/k
,
总人口除以座位/监护人的数量。然后
允许d = D
,并修改d
直到四舍五入k_i = round(G_i/d)
加起来正确的座位数,即
回合(G_1 / d)+回合(G_2 / d)+ ... +回合(G_m / d)= k
问题在于round
函数的工作原理。韦伯斯特的方法
通常意义上的回合:弱于.5上升,严格低于.5
下来,这很像使用算术平均值。该
亨廷顿 - 希尔方法基于使用几何平均值的想法
代替。这些方法有一个很好的总结
here。注意
所有这些除数算法都有缺陷,因为它们违反了
配额规则:不保证至少获得一个州
floor(G_m/D)
代表。
如果你想更多地玩这个,有一个很好的 关于Cut The Knot完成的关于此的文章 历史,方程和有趣的小程序。
答案 1 :(得分:1)
鉴于4组学生的大小为A,B,C和D,以及总共k个伴侣,设计一种算法,为学生分配近乎相等比例的伴侣。
这是一个非常简单地解决问题的算法:
从每组0个伴侣的分配开始。如果任何小组中没有学生,那么就扔掉那个小组,因为不会有任何小组分配给这样的小组。
如果分配的伴侣总数等于k,那么我们就完成了。
将一个伴侣分配给一个组。接收伴侣的小组是每个学生比率最低的伴侣。在平局的情况下,选择学生人数最多的学生群体中每个学生比例最低的学生群体。如果仍然存在平局,那么从所选择的那些中选择按字母顺序排列的第一组。
转到第2步。
它做出明确的确定性任务。比例将与值允许的几乎相等。增加k不会减少任何组的赋值,因为它实际上只会导致额外的迭代发生,并且没有迭代会减少任何组的赋值。
相同大小的两个组可能具有不同数量的伴侣,但如果不重述问题以允许修改k,则无法纠正此问题。在任何情况下,相同大小的两个组的任务在任何情况下都不会超过1个。
另一个用于将表示分配给状态的答案中的所有算法都是不必要的复杂,并且旨在最小化执行的计算步骤的数量(通过进行数值计算而不是增量赋值)。在计算机上运行时,我给出的算法非常简单。