【问题标题】:Comparison-based ranking algorithm基于比较的排名算法
【发布时间】:2010-10-14 20:21:38
【问题描述】:

我想对一个项目集合(大小可能大于 100,000)进行排名或排序,其中集合中的项目没有内在(可比)价值,而是 我所拥有的只是任何两个项目之间的比较 由用户以主观方式提供。

示例:考虑一个包含元素[a, b, c, d] 和用户比较b > aa > dd > c 的集合。这个集合的正确顺序是[b, a, d, c]

这个例子很简单,但可能有更复杂的情况:

  • 由于比较是主观的,用户也可以说c > b。在这种情况下,这会导致与上述顺序发生冲突。
  • 此外,您可能没有“连接”所有项目的比较,即b > ad > c。在这种情况下,排序是不明确的。可能是[b, a, d, c][d, c, b, a]。在这种情况下,任何一种排序都是可以接受的。

如果可能,最好以某种方式考虑相同比较的多个实例,并为出现次数较多的实例赋予更多权重。但是没有这种条件的解决方案仍然可以接受。

扎克伯格的 FaceMash 应用程序使用了该算法的一个类似应用程序,他根据比较对人进行排名(如果我理解正确的话),但我无法找到该算法实际上是什么。

是否已经存在可以解决上述问题的算法?如果是这样的话,我不想花精力去想出一个。如果没有特定的算法,是否有某些类型的算法或技术可以指点我?

【问题讨论】:

    标签: algorithm sorting comparison ranking


    【解决方案1】:

    这是另一个领域已经出现的问题:竞技游戏!在这里,目标也是基于一系列 1 对 1 比较为每个玩家分配一个全局“排名”。当然,困难在于比较不是传递性的(在您的问题中,我将“主观”表示为“由人类提供”)。 Kasparov 击败 Fischer 击败(不认识其他棋手!)Bob 有可能击败 Kasparov。

    这会呈现依赖传递性(即a > b and b > c => a > c)的无用算法,因为您最终(可能)得到一个高度循环的图。

    已经设计了几个评级系统来解决这个问题。

    最著名的系统可能是用于竞技棋手的Elo algorithm/score。它的后代(例如,Glicko rating system)更加复杂,并考虑了赢/输记录的统计属性——换句话说,评级的可靠性如何?这类似于您在玩更多“游戏”时对更多记录加权的想法。 Glicko 还构成了 Xbox Live 上用于多人视频游戏的 TrueSkill system 的基础。

    【讨论】:

    • 如果您对使用(而不是开发)感兴趣,您应该尝试我们的排名系统 rankade。它与 Elo 和 Glicko 排名系统(这里是 comparison)不同,因为它可以管理与 2 个以上派系的匹配(即项目,在您的场景中)。与 TrueSkill 不同,rankade 是免费且易于使用的。
    【解决方案2】:

    您可能对最小反馈弧集问题感兴趣。本质上,问题是如果元素以某种顺序线性排序,则要找到“走错路”的最小比较次数。这与找到必须删除以使图无环的最小边数相同。不幸的是,准确地解决这个问题是 NP 难的。

    几个讨论问题的链接:

    http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.86.8157&rep=rep1&type=pdf

    http://en.wikipedia.org/wiki/Feedback_arc_set

    【讨论】:

    • 几个月来我一直在寻找类似第一个链接的东西,谢谢!可能值得将文档的标题直接包含在您的评论中,以便其他人更容易找到
    【解决方案3】:

    我用谷歌搜索了这个,寻找第 12.3 章,拓扑排序和深度优先搜索

    http://www.cs.cmu.edu/~avrim/451f09/lectures/lect1006.pdf

    您的关系集描述了一个有向无环图(希望是无环图),因此图拓扑排序正是您所需要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多