代码之家  ›  专栏  ›  技术社区  ›  François Beausoleil

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

  •  2
  • François Beausoleil  · 技术社区  · 15 年前

    我有100分可以发放到一套物品上。每个项目必须获得与其他项目(重量)成比例的点数。有些项目的权重可能为0,但它们必须获得一些分数。

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

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

    这是框架/语言不可知论,尽管我将在Ruby中实现。

    目前,我有这个(伪代码):

    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
    
    2 回复  |  直到 12 年前
        1
  •  5
  •   Brienne Schroth    15 年前

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

    会有一部分点遗留下来。按项目的小数部分大小对项目集进行排序,然后按从最大小数部分到最小小数部分的顺序一次分配剩余的点。

    所以,如果一个项目的权重为12,而所有项目的总权重为115,你首先会给它1分。如果还有4个项目的话,那么在发放完最低分后还有110分。然后你会给这个项目10分,因为它占总重量的百分比是110的9.58%和10.538的9.58%。然后你会根据.538进行分类,如果它靠近顶端,可能会被撞到11。

        2
  •  3
  •   djna    15 年前

    考虑到两个约束total==100每个项目>0无法解决101个案例,因此,为了保持稳健,您必须获得解决方案。这是业务问题,不是技术问题。

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