我这里有一个场景。让我举个小例子来解释。
我有10支钢笔,我得给3个人。这些人的比例大约是6:6:1,意思是如果我给C人1支笔,我必须给A人和B人6-6支笔。
我试图用下面所述的简单计算来解决这个问题。
PerPersonPen = (TotalCountofPens * PerPersonRatio)/(SumofAllPersonsRatio)
Person A =(Int) (10*6)/13 = 4
Person B = (Int) (10*6)/13 = 4
Person C = (Int) (10*1)/13 = 0在这里,C人会得到0支钢笔,但这不应该发生。我希望那个人A&B得到4支钢笔,这是对的。但人C也应该得到一支剩下的笔。
这种情况发生在一个人与其他人相比有一个比率计数的情况下。
有人能帮我解决这个问题吗?或者我怎样才能做到呢?
发布于 2017-03-31 10:55:57
洛朗G在注释部分如何公平地舍入数字中给出了一个非常有用的Math链接
这篇文章暗示了以下算法:
x_i ) (x_i = her share/sum of shares)C_min = numberOfPens和C_max设置得足够大,以便sum_i (floor(x_i*C_max)) > numberOfPens (C_max = numberOfPens + 1/(min x_i)应该工作)C_min和C_max之间进行二分法搜索,直到找到一个C,比如sum_i (floor(x_i*C)) = numberOfPens然而,当存在联系时,这可能不起作用(就像在您的示例中,其中两个比率为6/13)。但是,你可以做的是添加一个非常小的随机噪声(你加或减去你原来比率之间最小的非零间隙的一半)来打破你的比率,得到一个总体上的结果,这将是“几乎公平的”。
编辑:我注意到我最初选择的C_max是错误的,所以我把它修正到了一些有用的东西上。不过,我认为仍有改善的余地。在满足标准( C_max )之前,还可以通过在2^k numberOfPens中增加k来找到初始2^k numberOfPens。
发布于 2017-03-31 10:07:49
在查看您的示例时,很明显,每个参与者至少应该得到您计算出来的结果。只有一些人会得到更多。
我建议采取以下措施:
Math.Ceiling(assigned value),其中k是我们在示例的步骤2.10-8中计算出来的期望值和。(int) (assigned value) )。发布于 2017-03-31 08:17:25
有点像
int_weights = [6, 6, 1]
total_weights = sum(int_weights)
to_share = 10
still_to_share = to_share
left_weight_total = total_weights
shares = []
for weight in int_weights:
s = int(0.5 + (float(still_to_share) * weight / left_weight_total))
still_left -= s
left_weight_total -= weight
shares.append(s)这给了相当但不是绝对的公平(这是不可能通过联系实现的,参见我在问题评论中的链接)。
shares5、4、1
sum(shares)如果您想实现公平的关系,最好的结果将是[4, 4, 2] (或[5, 5, 0] :auto_censored_but_not_totally:;-)?您可以通过排序和考虑以前的分配达到。直到我有了一个很好的理由来证明我是那么挑剔,我才会坚持这样的解决方案,如上面所示。
https://stackoverflow.com/questions/43134511
复制相似问题