Algorithme de classement basé sur la comparaison
Je voudrais classer ou trier une collection d'éléments (avec une taille potentiellement supérieure à 100 000) où les éléments de la collection n'ont pas de valeur intrinsèque (comparable), à la place Tout ce que j'ai est les comparaisons entre deux éléments qui ont été fournis par les utilisateurs de manière subjective.
Exemple: Considérons une collection avec des éléments de [a, b, c, d]
et les comparaisons par les utilisateurs b > a
, a > d
, d > c
. L'ordre correct de cette collection serait [b, a, d, c]
.
Cet exemple est simple, mais il pourrait y avoir des cas plus compliqués:
- , Puisque les comparaisons sont subjectifs, un utilisateur pourrait aussi dire que
c > b
. Dans ce cas, cela provoquerait un conflit avec l'ordre ci-dessus. - Vous ne pouvez pas non plus avoir de comparaisons qui "connectent" tous les éléments, c'est-à-dire
b > a
,d > c
. Auquel cas la commande est ambigu. Il pourrait être[b, a, d, c]
ou[d, c, b, a]
. Dans ce cas, l'une ou l'autre commande est acceptable.
Si possible, il serait bon de prendre en tenez compte de plusieurs instances de la même comparaison et donnez plus de poids à celles ayant des occurrences plus élevées. Mais une solution sans cette condition serait toujours acceptable.
Une application similaire de cet algorithme a été utilisée par L'application FaceMash de Zuckerberg où il a classé les gens en fonction des comparaisons (si je l'ai bien compris), mais je n'ai pas été en mesure de trouver ce que cet algorithme était réellement.
Est-il un algorithme qui existe déjà et peut résoudre le problème ci-dessus? Je ne voudrais pas dépenser des efforts pour essayer d'en trouver un si tel est le cas. Si il n'y a pas d'algorithme spécifique, est-il peut-être certains types d'algorithmes ou les techniques que vous pouvez m'indiquer?
3 réponses
C'est un problème qui s'est déjà produit dans une autre arène: les jeux compétitifs! Ici aussi, l'objectif est d'attribuer à chaque joueur mondial "rang" sur la base d'une série de 1 vs 1 comparaisons. La difficulté, bien sûr, est que les comparaisons ne sont pas transitives (je prends "subjectif" pour signifier "fourni par un être humain" dans votre question). Kasparov Bat Fischer beats (Je ne connais pas un autre joueur d'Échecs!) Bob Bat Kasparov, potentiellement.
Cela rend les algorithmes inutiles qui reposent sur transitivité (c'est à dire a > b and b > c => a > c
) que vous vous retrouvez avec (probablement) un très cyclique graphique.
Plusieurs systèmes de notation ont été conçus pour s'attaquer à ce problème.
Le système le plus connu est probablement l'algorithme ELO / score pour les joueurs d'Échecs compétitifs. Ses descendants (par exemple, le système de notation Glicko) sont plus sophistiqués et prennent en compte les propriétés statistiques du record de victoires/défaites - - - en d'autres termes, quelle est la fiabilité d'une notation? Ceci est similaire à votre idée de pondérer plus fortement les enregistrements avec plus de "jeux" joués. Glicko constitue également la base du système TrueSkill utilisé sur Xbox Live pour les jeux vidéo multijoueurs.
Vous pourriez être intéressé par le problème de jeu d'arc de rétroaction minimum. Essentiellement, le problème est de trouver le nombre minimum de comparaisons qui "vont dans le mauvais sens" si les éléments sont ordonnés linéairement dans un certain ordre. C'est la même chose que de trouver le nombre minimum d'arêtes qui doivent être supprimées pour rendre le graphe acyclique. Malheureusement, résoudre le problème est exactement NP-difficile.
Un couple de liens qui discutent de la problème:
Http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.86.8157&rep=rep1&type=pdf
J'ai googlé ceci, recherchez le chapitre 12.3, le tri topologique et la recherche en profondeur
Http://www.cs.cmu.edu/~avrim/451f09/conférences/lect1006.pdf
Votre ensemble de relations décrit un graphe acyclique dirigé (espérons-le acyclique) et donc le tri topologique du graphe est exactement ce dont vous avez besoin.