Calcul De La “Kevin Bacon” Numéros
J'ai été jouer avec certaines choses et de la pensée, de l'idée d'essayer de comprendre Kevin Bacon numéros. J'ai des données pour un site qui pour cet effet, nous pouvons considérer un réseau social. Faisons semblant de croire que c'est Facebook (pour la simplification de la discussion). J'ai des gens et j'ai une liste de leurs amis, j'ai donc les connexions entre eux. Comment puis-je calculer la distance d'une personne à une autre (en gros, un Kevin Bacon nombre)?
Ma meilleure idée est un Bidirectionnel de recherche, avec une limite de profondeur (pour limiter la complexité de calcul et d'éviter le problème des personnes qui ne peuvent tout simplement pas être connecté sur le graphique), mais je me rends compte c'est plutôt la force brute.
Pourrait-il être mieux à faire peu de sous-graphes (dire quelque chose d'équivalent à des groupes sur Facebook), calculer les distances les plus courtes entre eux (à l'avance, peut-être) et puis essayez d'utiliser CELLES à trouver un lien? Tout cela nécessite des pré-calcul, il pourrait rendre possible la recherche de la diminution du nombre de nœuds (nœuds pourraient être des groupes plutôt que des individus, rendant le graphique beaucoup plus petit). Ce serait encore une bidirectionnel de recherche.
Je pourrais aussi pré-calculer le nombre de personnes d'un individu est connecté, la recherche de nœuds pour les "populaires" les gens d'abord, car ils pourraient avoir le plus de chance de se connecter à la destination de l'individu. Je me rends compte ce serait un compromis de vitesse pour le chemin le plus court possible. J'avais pense que je voudrais aussi souhaitez utiliser une profondeur d'abord de recherche au lieu de la largeur de la première recherche que j'avais l'intention d'utiliser dans les autres cas.
Quelqu'un peut penser à un système plus simple, plus rapide façon de faire cela? Je voudrais être en mesure de trouver la longueur la plus courte entre deux personnes, de sorte qu'il n'est pas aussi facile que d'avoir toujours le même point de fin (comme dans le Kevin Bacon problème).
Je me rends compte qu'il y a des problèmes comme j'ai pu obtenir des chaînes de 200 personnes et tels, mais qui peut être résolu mon avoir une limite à la profondeur, je suis prêt à rechercher.
J'ai vu qu'à terme tout en faisant un peu de recherche, mais en l'appelant un Kevin Bacon nombre tout le monde sait instantanément de quoi je parle. J'ai pensé que se serait abattu sur l'expliquant.
"degrés de séparation" prennent un sens
OriginalL'auteur MBCook | 2009-03-23
Vous devez vous connecter pour publier un commentaire.
C'est un standard le chemin le plus court problème. Il y a beaucoup de solutions, y compris L'algorithme de Dijkstra et Bellman-Ford. Vous pouvez être particulièrement intéressés par la recherche à la Algorithme A* et de voir comment il allait s'effectuer avec la fonction de coût par rapport à l'inverse d'un nœud donné. L'idée serait de visiter de plus en plus populaire nœuds (ceux avec le plus haut degré).
A* est probablement la pire des trois pour ce type de recherche, car il renvoie uniquement le nœud le plus proche de l'heuristique, tandis que l'algorithme de Dijkstra retourne tout de ganglions à proximité (le premier qu'il trouve). Et pourrait donc être fait plus tôt parce que vous n'êtes pas à la recherche de quelque chose de spécifique.
l'intuition serait que les chemins les plus courts ont tendance à aller à travers les nœuds connectés -- ce serait l'hypothèse à tester. Si la valeur est true, l'heuristique serait vous donner le chemin le plus court plus vite vous amener à être en mesure de mettre fin à d'autres (non-plus courte) chemins potentiels plus tôt.
en utilisant les degrés des sommets sonne comme une bonne idée, mais Un* ne peuvent trouver un chemin d'accès à un nœud. Vous ne pouvez pas dire "donnez-moi un chemin d'ici à quelques nœud qui a un degré élevé" parce que maintenant, vous êtes à la recherche pour un groupe de nœuds. De toute façon, c'est probablement quelque chose à l'indice de référence.
OriginalL'auteur tvanfosson
Sonne comme un travail pour
L'algorithme de Dijkstra.
ED: Eh, je ne devrais pas avoir la gâchette rapide. Dijkstra (et de Bellman-Ford) se réduit à une largeur de recherche lorsque les pondérations sont 1, donc ce n'est pas trop utile. Oh bien.
La Algorithme A* , mentionné par tvanfosson, peut être idéal pour cela. L'idée est qu'au lieu de la recherche et de recursing, dans l'ordre que les éléments se trouvent dans chaque niveau de l'arbre (ancrée sur votre de début ou de fin-point de), vous utilisez une heuristique pour déterminer quel élément vous allez essayer en premier. Dans votre cas, un bon pari serait probablement le degré d'un nœud (nombre d ' "amis"), mais vous pourriez peut-être souhaitez utiliser le nombre de personnes à l'intérieur de certains arbitraire nombre de degrés d'une personne donnée (c'est à dire, le gars qui a a trois amis qui ont chacun plus de 100 amis est susceptible d'être mieux nœud que le mec qui a 20 amis dans une clique qui évite les étrangers). Il y a toutes sortes d'autres choses que vous pourriez utiliser comme une heuristique (amis de 2 points, les amis de leurs amis obtenir 1 point; soit, à l'expérience).
Combiner cela avec une limite de profondeur (coupé au bout de 6 degrés de séparation, ou quoi que ce soit), et vous pouvez améliorer considérablement votre moyen de cas (cas le plus défavorable est toujours la même base BFS).
quel est le problème avec BFS? Je doute qu'il peut être fait plus vite...
Rien de mal à cela. Si vous voulez limiter la profondeur à, disons, des 6 degrés de séparation, même si, il est logique d'utiliser une sorte d'heuristique pour déterminer le nœud de regarder à côté de votre largeur d'abord la recherche (A*).
Il n'améliorera pas le pire des cas, mais il pourrait améliorer les cas moyen. Oui, c'est toujours BFS, mais "BFS" ne pas raconter toute l'histoire.
Surtout ce que je voulais dire à propos de "et non pas "utile", c'est que bog-standard BFS a déjà été mentionné, et je n'ai pas apporte rien de nouveau par ce qui suggère un algorithme qui est plus général, mais réduit à la même chose dans ce cas. J'ai ajouté plus d'idées pour ma réponse pour espérer faire mieux.
OriginalL'auteur Adam Jaskiewicz
exécuter une largeur tout d'abord de recherche (dans les deux sens à partir de chaque point de terminaison) et arrêtez-vous quand vous avez un lien ou d'atteindre votre limite de profondeur
OriginalL'auteur Steven A. Lowe
Celui-ci pourrait être mieux ensemble De Floyd-Warshall la toutes les paires de la plus courte distance.
OriginalL'auteur sfossen