用户提交了排名

时间:2010-12-29 19:40:59

标签: algorithm ranking

我希望让会员提交他们的前10名列表,或者他们的前10名排名,然后将一些算法结合起来。那里有什么东西吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

啊,啊,这是开放式的好吧。让我们考虑一个只有两个人投票的简单案例:

1  ALPHA
2  BRAVO
3  CHARLIE

1  ALPHA
2  DELTA
3  BRAVO

我们不能完全依靠伯爵......阿尔法显然应该获胜,尽管它与BRAVO拥有相同的选票。然而,我们必须避免只有少数第一名选票占据大量第10名选票的情况。为此,我建议如下:

$score = log($num_of_answers - $rank + 2)

第一名的价值可能会超过一分,而第十名则会获得0.3分。这种对数缩放可以防止荒谬的统治,但仍然会给排名带来分量。从这些示例投票(并假设它们是10个列表中的前3个),您将得到:

ALPHA: 2.08
BRAVO: 1.95
DELTA: .1
CHARLIE: .95

为什么呢?嗯,这是主观的。我觉得从一个很长的名单中可以看出,4,000张第10位的选票值超过1,000张第一名。您可以通过更改日志的基数(自然,2等)来扩展它,或者选择其他系统。

答案 1 :(得分:0)

您只需将用户提供的每个排名项目的总和相加,然后对其进行排序。

即:

A = (a,b,c)
B = (a,c,b)
C = (b,a,c)
D = (c,b,a)
E = (a,c,b)
F = (c,a,b)

a = 1 + 1 + 2 + 3 + 1 + 2 = 10
b = 2 + 3 + 1 + 2 + 3 + 3 = 14
c = 3 + 2 + 3 + 1 + 2 + 1 = 12

因此,

  1. 一个
  2. C
  3. B'/ LI>

答案 2 :(得分:-1)

我认为您可以使用max flow algorithm解决此问题,以创建聚合排名,假设如下:

  1. 项目列表中的每个唯一项目都是图表中的节点。例如。如果有10件事要投票,则有10个节点。
  2. 如果* a *位于_single用户submitted_ ranking中的* b *之前,则边缘从节点* a *转到节点* b *。
  3. 从_single用户submitted_ ranking创建的最后一个节点的边缘指向* sink *
  4. 从_single用户submitted_ ranking创建的第一个节点将具有来自* source *
  5. 的传入边缘

    这应该会为您提供聚合前10名列表。