我有 N 根大金条和 1 根小金条,其重量相当于一根大金条的 x 的一部分。例如,N = 10 且 x = 0.5,那么我有 10.5 块大金条,其中 10 块大金条和 1 块小金条
我想在一群 T 盗贼之间分配这个,其中盗贼 i (T_i) 拥有他或她应该有权获得的一份 (s_i) 黄金。例如。对于 T = 3,则小偷 1 拥有 40% 份额,小偷 2 拥有 50% 份额,小偷 3 拥有 10% 份额
我可以运行什么算法将金条分配给小偷,以便总黄金的最终份额(按重量)最接近他们想要的份额?金条不能被切割或分割,它们必须保持完整。
我的想法示例,每个小偷都会获得 NearestInteger((Tot Gold) * s_i) 金币,其中 Tot Gold = N + x = 10.5
使用上面的数字执行此方法
小偷 | 分享s_i | 10.5 *分享 | 圆形 |
---|---|---|---|
1 | 40% | 4.2 | 4 |
2 | 50% | 5.25 | 5 |
3 | 10% | 1.05 | 1 |
有几个问题
一种扩展是将剩余的黄金分配给小偷 N(最后一个人),但这会使他们倾向于总是获得剩余的黄金。
定义什么是“最好”;我认为一种措施是找到一种算法,该算法可以最小化所需份额(s1,s2,...sn)与运行算法后的结果份额(r1,r2,...rn)之间的毕达哥拉斯距离。如果几个分配同样接近(比如 3 个小偷平均分配 4 个金条,谁得到第 4 个),那么我不在乎算法选择哪一个。
适用于您选择的指标的简单算法是:
这将最大限度地减少平方误差,但可能会留下一些未分配的黄金。
如果您想施加额外的限制,即所有黄金都必须分配,那么您可以这样做:
如果你想证明分配是最优的,那么不难证明将任何整个金条移给其他小偷都会产生更糟糕的分配。