Aléatoire simple graphe connexe génération avec sobriété
J'essaie de trouver un algorithme efficace pour générer un simple graphe connexe avec sobriété. Quelque chose comme:
Input:
N - size of generated graph
S - sparseness (numer of edges actually; from N-1 to N(N-1)/2)
Output:
simple connected graph G(v,e) with N vertices and S edges
Ce document prétend fournir un algorithme efficace pour la génération aléatoire d'connecté graphiques. Je n'ai pas passé à travers les détails, mais ils revendiquent de meilleures performances, en particulier pour les grands réseaux. complexnetworks.fr/wp-content/uploads/2011/01/random.pdf
OriginalL'auteur F0RR | 2010-01-11
Vous devez vous connecter pour publier un commentaire.
Pour chaque nœud vous avez besoin d'au moins une arête.
De commencer avec un seul nœud.
À chaque itération, de créer un nouveau nœud et un nouveau bord. Le bord est de connecter le nouveau nœud avec un nœud aléatoire à partir du nœud précédent jeu.
Après tous les nœuds sont créés, créer aléatoire bords jusqu'à ce que S est remplie. Assurez-vous de ne pas créer de double bords (pour cela vous pouvez utiliser une matrice de contiguïté).
Aléatoire graphique se fait en O(S).
C'est simple et bon, mais il n'est pas O(S) si le graphe est dense, en raison de la double bords vérifier. Je veux dire, dans le pire des cas (presque) jamais O(S), mais si le graphe est dense, même le temps prévu de la complexité si pas d'O(S).
OriginalL'auteur
De Haut Niveau De L'Idée
De la création de la Spanning Tree
La partition de réponse par ypnos est un bon début, mais le biais est introduit par la sélection d'un nœud visité pour une fin d'un nouveau bord. Par la sélection aléatoire d'un nœud visité à chaque itération, les nœuds qui sont visités vers le début, ont plus d'itérations à partir de laquelle ils ont une chance d'être sélectionné. Donc, plus tôt les nœuds sont plus susceptibles d'avoir un degré élevé (nombre d'arêtes) que ceux repris plus tard.
Exemple de Partialité
Titre d'exemple, pour un 4 nœud connecté graphique plutôt que de générer un linéaire chemin graphique, qui est ce que 75% de la possible arbres de recouvrement sont, ce type de biais sera la cause de la star graphique être généré avec plus de 25% de probabilité qu'il devrait être.
Biais n'est pas toujours une mauvaise chose. Il s'avère que ce type de biais est bon pour générer des arbres de recouvrement qui sont similaire à la vraie monde des réseaux informatiques. Toutefois, afin de créer une véritable aléatoire graphe connexe la première spanning tree doit être choisi de manière uniforme dans les arbres de recouvrement (voir Wikipedia Uniforme Spanning Tree article).
Marche Aléatoire Approche
Une approche pour la génération d'un uniforme spanning tree est par une marche aléatoire. Ci-dessous est une citation du livre La génération Aléatoire d'Arbres de recouvrement Plus Rapidement que le Couvercle du Temps par Wilson décrivant simple marche aléatoire algorithme.
Cela fonctionne bien pour un simple graphe connexe, cependant si vous avez besoin d'un algorithme pour un graphe orienté, puis lire le papier mesure où elle décrit l'Algorithme de Wilson. Voici une autre ressource pour aléatoire arbres stp et Wilson Algorithme.
Mise en œuvre
Comme je l'ai été aussi intéressés à ce problème, j'ai codé en Python implémentations de diverses approches, y compris la marche aléatoire approche. N'hésitez pas à jeter un coup d'oeil à la L'essentiel du code sur GitHub.
Ci-dessous est un extrait du code de la marche aléatoire approche:
Quelle est la complexité de la marche aléatoire approche? N'a pas la "choisissez un noeud au hasard; l'ignorer si elle avait déjà été utilisée" modèle potentiellement être indépendant des temps d'exécution?
Comme le papier par Wilson discute, le Andrei Broder algorithme s'exécute à l'intérieur de la housse temps d'un graphe non-dirigé, qui est délimitée par des
O(n^3)
pour le pire des graphiques, mais aussi faible queO(n lg n)
pour presque tous les graphes---oùn
est le nombre de sommets.Qu'est-ce que l'utilisation de graphique.add_random_edges(num_edges)? Parce que dans la pointe est déjà ajouté dans le graphique.add_edge(edge).
Le code antérieur poignées partie 1 de l'idée de la création d'un graphique avec N-1 bords. La deuxième partie de la question d'origine demande comment créer un graphique d'une sobriété c'est à dire, un nombre spécifique de bords. Si l' ` |E| < (|S| - 1)` puis d'autres arêtes devront être ajoutées (point 2 de l'idée). La valeur de
num_edges
dans le code d'exemple est ambigu sur son propre. Il dépend de la mise en œuvre deadd_random_edged()
quant à savoir si ou de ne pas l'argument spécifie le nombre total d'arêtes demandé ou le nombre de nouveaux bords qui devrait être ajouté.OriginalL'auteur
Basé sur Wesley Baugh's réponse, je suis venu avec le code javascript suivant la mise en œuvre avec cytoscape.js à manipuler des graphiques:
Pour exemple complet de code source, visitez mon dépôt github 🙂
OriginalL'auteur
Générer un minimum spanning tree en utilisant quelque chose comme L'algorithme de Prim, et à partir de là, au hasard de générer des liens supplémentaires vers le selon le caractère que vous voulez.
OriginalL'auteur