不完整排名的模糊比较算法

3

摘要

我正在寻找一种排列对象的算法。两个对象可以进行比较,但是这些比较可能存在缺陷。另外,我更关心找到最好的对象,而不是哪些是最差的。

激励:

想象一下,我正在科学地评估材料。我将两种材料组合在一起。我想找到最适合深入测试的最佳工作材料。因此,我不关心那些没有前途的材料。但是,每个测试都可能是假阳性或在那两种特定材料之间存在异常。

明确问题:

  1. 有一个无限的对象池。
  2. 两个对象可以相互比较。比较两个对象的成本很高。
  3. 考虑额外的对象会消耗资源。因此,只有当一个对象可以完全排名时,才应将其纳入评估范围内。
  4. 在被测试对象的池中找到最好的对象非常重要。如果一个对象处于底部一半,那么找出它在底部一半的位置并不重要。确定精确排名的重要性是一个梯度,其中顶部更为重要。
  5. 大多数情况下,如果A>B且B>C,则可以安全地假设A>C。有时会出现假阳性。有时A>B且B>C且C>A。这不是一个抽象的数学空间,而是实际测量。
  6. 一开始不知道允许进行多少次比较。直到不能再进行比较为止,算法才被授权进行另一次比较。因此,必须做出关于包括其他对象或测试更多已经测试过的对象的决定。

更深入的激励:

想象一下,你的任务是雇用一支拳击手队伍。你对评估拳击手一无所知,但可以让两个拳击手相互搏斗。世界上有无限多的拳击手。但是将他们飞来非常昂贵。理想情况下,您希望雇用n个最佳的拳击手。实际上,您不知道拳击手是否会接受您的报价。此外,您不知道其他拳击俱乐部的竞标情况。您只会向最好的n个拳击手提供报价,但必须准备好知道向哪些下一个n个拳击手发送报价。这只得到最差的拳击手是非常不可能的。

一些方法

我想到了以下方法。但是,它们都有缺点。我觉得应该有更好的方法。

  1. 使用传统的排序算法

可以使用传统的排序算法。

缺点: - 误判会严重影响算法的正确性。 - 排序算法会花费一半的时间来排序不重要的下半部分。 - 排序算法从所有项开始。对于这个问题,我们只能做第一次测试,不知道是否允许进行第二次测试。我们可能最终只能进行两次测试。或者我们可以进行一百万次测试。

  1. 使用锦标赛算法 有锦标赛算法。例如,每个人都有第一场比赛。第一场比赛的胜者进入下一轮。有各种各样的锦标赛策略,考虑到人们可能有一天状态不佳或在第一场比赛中与冠军配对。

缺点: - 这看起来非常有前途。难点在于找到一种允许每次比较添加一个更多玩家的算法。似乎应该有一种高度专业化的解决方案比标准锦标赛算法更好。

  1. 二分查找 我们可以从两个对象开始。每次添加一个对象时,我们可以使用二分查找找到它在排名中的位置。因为顶部更重要,所以我们可以使用加权二分查找。例如,它不会测试中点,而是测试顶部1/3的点。

缺点: - 该算法不纠正误判。如果在前面的顶部出现误判,它可能会扭曲整个其余的测试结果。

  1. 计算胜利和失败 可以计算胜利和失败。算法将通过最少损失和最多胜利的优先级选择测试对象。这将专注于测试最好的对象。如果一个对象没有损失,它将成为测试的重点。它要么很快获得失利并降低优先级,要么会获得更多的测试,因为它是最有可能的顶级候选人。

缺点: - 这种方法非常好,因为它纠正了误判。它还可以轻松地将更多对象添加到测试池中。但是,它并没有考虑到对顶级对象的胜利比对底部对象的胜利重要得多。因此,比较是浪费的。

  1. 图形 所有对象都可以添加到图形中。可以将图形展平。

缺点: - 我不知道如何展平这样一个混乱的图形,它可能具有循环和模糊的终节点。可能有多个不败的对象。在这样一个混乱的图形中如何选择赢家?如何知道哪个比较最有价值?

  1. 评分 由于胜利取决于失败者的排名,因此可以给胜利打分。例如,A>B表示A得到1分。如果C>A,则C得到2分,因为A有1分。最终,对象按其得分排名。

缺点 - 这种方法看起来很有前途,因为可以轻松地将新对象添加到测试对象池中。它还考虑到了对顶级对象的胜利应该计算更多分的情况。我想不出一个好办法来确定积分。第一次比较获得了1分。一旦池子里有10,000个对象,平均赢得会价值5,000分。两次测试的奖励应该大致相等。后续的比较会压倒之前的比较,在不应该被忽略的情况下使其被忽略。

有没有人对解决这个问题有好的想法?


比较操作有固定的失败概率吗?或者说排名靠前的拳击手比较起来更有优势,特别是与最弱的拳击手相比较的时候? - Tally
我不太确定你的问题。最高排名的拳击手更有可能赢得比最低排名的拳击手更弱的比赛。但目前最高排名的拳击手可能并不是实际上最高排名的拳击手。这位拳击手可能运气好或者在上一场比赛中具有特定的优势。 - Thomas Fischer
2个回答

0
我会寻找一个易于计算的值,用于对象之间的比较,以给出足够好的排序近似值。您可以将每个新对象与当前最佳对象进行准确比较,然后使用其计算出的值将失败者插入到其余列表中的插入排序中。
最佳值始终是准确的。其余对象的排序取决于您的“值”。

我没有一个“对象的易于计算值”。这不是一个简单在芯片上运行的算法。每个比较都需要在计算机外进行科学采样。 - Thomas Fischer
也许我应该说得更清楚一些,更容易计算的值。我的回答是因为我遇到了一个类似的问题,即获取完整数据进行比较的成本是我必须使用的估计值的10万倍。我们不断尝试思考改进我们估计值准确性的方法。 - Paddy3118

0
我建议您研究Elo评分系统及其衍生物(如Glicko、BayesElo、WHR、TrueSkill等)。
您可以为每个对象分配一个初步评分,然后根据您进行的比赛/比较更新该值。(对于结果更加意外的情况,评分变化会更大)
这仍然存在一个问题,即如何决定将哪个对象与其他对象进行比较以获得最多信息。为此,我建议您研究锦标赛系统和季后赛格式。虽然我怀疑最优解决方案肯定比那更加临时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接