Algorithm 在加权项之间分配点的算法?

Algorithm 在加权项之间分配点的算法?,algorithm,Algorithm,我有100分要分给一组物品。每个项目必须获得与其他项目成比例的点数(权重)。某些项目的权重可能为0,但它们必须获得一些分数 我试着给每个项目5分,然后按比例分配剩余的分数,但是当我有21个项目时,算法会给一个项目分配0分。当然,一开始我可以给出1分,但问题仍然是101项或更多。通常,这个算法应该处理少于20个项目,但我希望算法在面对更多项目时具有鲁棒性 我知道使用浮点数/分数是完美的,但是底层系统必须接收整数,总数必须是100 这与框架/语言无关,尽管我将用Ruby实现 目前,我有以下代码(伪代

我有100分要分给一组物品。每个项目必须获得与其他项目成比例的点数(权重)。某些项目的权重可能为0,但它们必须获得一些分数

我试着给每个项目5分,然后按比例分配剩余的分数,但是当我有21个项目时,算法会给一个项目分配0分。当然,一开始我可以给出1分,但问题仍然是101项或更多。通常,这个算法应该处理少于20个项目,但我希望算法在面对更多项目时具有鲁棒性

我知道使用浮点数/分数是完美的,但是底层系统必须接收整数,总数必须是100

这与框架/语言无关,尽管我将用Ruby实现

目前,我有以下代码(伪代码):


首先,给每个项目一分。这是为了满足您的要求,即所有项目都获得分数。然后获得每个物品总重量的%,并奖励剩余分数的%(四舍五入)

将有一部分积分剩余。按项目小数部分的大小对项目集进行排序,然后按从最大小数部分到最小小数部分的顺序一次分配一个剩余的点


因此,如果一件物品的重量为12,而所有物品的总重量为115,那么你首先会给它1分。如果还有4个项目,在最低分数发放后,还剩下110分。然后,您将奖励该物品10分,因为其占总重量的百分比为110的9.58%和10.538 9.58%。然后,您将根据.538对其进行排序,如果它接近顶端,它可能会撞到11。

鉴于两个约束条件{total==100}{each item>0},101情况无法解决,因此为了保持健壮性,您必须找到一个解决方案。这是一个商业问题,不是技术问题


最低分数案例实际上也是一个商业问题。很明显,如果你给每个项目5分的话,你的结果的意义与1分的结果是完全不同的——低分、非零分和低分之间的差距可能会被压缩。因此,你真的应该从系统的用户那里得到清晰的信息,而不是仅仅选择一个数字:他们将如何使用这些数据?

在从剩余分数中分配额外的分数之前,你还需要确保每个人都至少得到1分。打得好,我错过了这个要求。编辑谢谢你的想法。这太棒了!
total_weight = sum_of(items.weight)
if total_weight == 0 then
  # Distribute all points equally between each item
  items.points = 100 / number_of_items
  # Apply remaining points in case of rounding errors (100 / 3 == [33, 33, 34])
else
  items.points = 5
  points_to_dole_out = 100 - number_of_items * 5
  for(item in items)
    item.points += item.weight * total_weight / 100
  end
end