Erzeugen eines Graphen mit bestimmter Gradverteilung?

8

Ich versuche, einen zufälligen Graphen zu erzeugen, der kleine Welteigenschaften hat (weist eine Potenzgesetzverteilung auf). Ich habe gerade begonnen, das networkx-Paket zu verwenden und entdeckte, dass es eine Vielzahl von zufälligen Graphengenerierung bietet. Kann mir jemand sagen, ob es möglich ist, ein Diagramm zu generieren, in dem der Grad eines bestimmten Knotens einer Gamma-Verteilung folgt (entweder in R oder mit dem Paket networkx von Python)?

    
Legend 01.12.2010, 20:33
quelle

4 Antworten

7

Wenn Sie das Konfigurationsmodell verwenden möchten, sollte so etwas in NetworkX funktionieren:

%Vor%

Sie müssen möglicherweise den Mittelwert der Sequenz z abhängig von Parametern in der Gammaverteilung anpassen. Auch muss z nicht grafisch sein (du bekommst ein Multigraph), aber es braucht eine gerade Summe, also musst du vielleicht ein paar zufällige Sequenzen ausprobieren (oder 1 hinzufügen) ...

Die NetworkX Dokumentationsnotizen für configuration_model geben ein anderes Beispiel, eine Referenz und wie man parallele Kanten und Selbstschleifen entfernt:

%Vor%

Hier ist ein Beispiel ähnlich dem in Ссылка , das eine Zeichnung einschließlich eines Diagrammlayouts erstellt die größte zusammenhängende Komponente:

%Vor%     
Aric 01.12.2010, 21:32
quelle
2

Ich habe das vor einer Weile in der Basis Python ... IIRC, habe ich die folgende Methode verwendet. Aus dem Gedächtnis, also ist das vielleicht nicht ganz genau, aber hoffentlich ist es etwas wert:

  1. Wählen Sie die Anzahl der Knoten, N, in Ihrem Diagramm und die Dichte (vorhandene Kanten über mögliche Kanten), D. Dies impliziert die Anzahl der Kanten, E.
  2. Ordnen Sie für jeden Knoten seinen Grad zu, indem Sie zuerst eine zufällige positive Zahl x auswählen und P (x) finden, wobei P Ihre PDF ist. Der Grad des Knotens ist (P (x) * E / 2) -1.
  3. Wählen Sie einen Knoten zufällig und verbinden Sie ihn mit einem anderen zufälligen Knoten. Wenn einer der Knoten seinen zugewiesenen Grad erreicht hat, eliminiere ihn aus der weiteren Auswahl. Wiederhole E mal.

N.B. dass dies im Allgemeinen keinen verbundenen Graphen erzeugt.

    
JonC 01.12.2010 20:58
quelle
1

Ich weiß, dass es sehr spät ist, aber Sie können dasselbe, wenn auch ein wenig direkter, mit Mathematica machen.

RandomGraph [DegreeGraphDistribution [{3, 3, 3, 3, 3, 3, 3, 3}], 4]

Dies erzeugt 4 zufällige Graphen, wobei jeder Knoten einen vorgeschriebenen Grad aufweist.

    
Workhorse 06.10.2013 04:35
quelle
0

Einschließlich der oben genannten, bietet networkx 4 Algorithmen, die die grad_distribution als Eingabe erhält:

  • configuration_model : Erklären Sie mit @eric
  • expected_degree_graph : Verwenden Sie einen probabilistischen Ansatz basierend auf dem erwarteten Grad jedes Knotens. Es gibt Ihnen nicht die genauen Grade, sondern eine Annäherung.
  • havel_hakimi_graph : dieser versucht zuerst die Knoten mit dem höchsten Grad zu verbinden
  • random_degree_sequence_graph : Soweit ich sehen kann, ist dies ähnlich dem, was @ JonC vorgeschlagen hat; Es hat einen trials -Parameter, da es keine Garantie gibt, eine geeignete Konfiguration zu finden.

Die vollständige Liste (einschließlich einiger Versionen der Algorithmen für gerichtete Graphen) ist hier .

Ich habe auch ein paar Papiere gefunden:

toto_tico 25.07.2017 17:24
quelle

Tags und Links