Slides Δικτυακών Υπολογισμών με την Python

89
Δικτυακο Υπολογισο ε την Python Μωυσ Α. Μπουντουρδη Τα Μαθηατικν Πανεπιστηου Πτρα [email protected] Οκτβριο–Δεκβριο 2014 Last update: 3–12–2014 Μωυσ Α. Μπουντουρδη Δικτυακο Υπολογισο ε την Python

description

Slides Επιστήμης Δικτύων για υπολογισμούς με την Python στα πλαίσια του μεταπτυχιακού μαθήματος των Ψηφιακών Τεχνολογιών στην Εκπαίδευση του Μαθηματικού Τμήματος του Πανεπιστημίου Πατρών κατά το χειμερινό εξάμηνο 2014-5. Τα slides αυτά θα γίνονται συνεχώς updated ως το τέλος του εξαμήνου (τέλη Δεκεμβρίου 2014). Η ημερομηνία του update γράφεται στην πρώτη σελίδα των slides.

Transcript of Slides Δικτυακών Υπολογισμών με την Python

Page 1: Slides Δικτυακών Υπολογισμών με την Python

∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης

Τμήμα Μαθηματικών Πανεπιστημίου Πάτρας

mboudourupatrasgr

Οκτώβριοςndash∆εκέμβριος 2014

Last update 3ndash12ndash2014

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Περιεχόμενα

1 Εισαγωγή Γράφων

2 Βασικοί Υπολογισμοί της Θεωρίας Γράφων

3 ∆ικτυακά Μέτρα

4 ∆ιαμερισμοί Γράφων

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Εισαγωγή ΓράφωνΕγκατάσταση του NetworkX

Εισαγωγή (Μη Κατευθυνόμενων) Γράφων

Απλοί Γράφοι

Πολλαπλοί Γράφοι

Εισαγωγή Κατευθυνόμενων Γράφων

Απλοί Κατευθυνόμενοι Γράφοι

Πολλαπλοί Κατευθυνόμενοι Γράφοι

Εισαγωγή Γράφων με Βάρη Ακμών

Εισαγωγή ∆ιμερών Γράφων

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Γεννήτορες Προκατασκευασμένων Γράφων

Οπτικοποίηση (Visualization) Γράφων με το Gephi

∆ιεπίπεδοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εγκατάσταση του NetworkX

Το NetworkX είναι ένα πακέτο της Python για τηνδημιουργία την διαχείριση και υλοποίησηυπολογισμών για γράφους και δίκτυαΤο NetworkX διατίθεται για κατέβασμα (μαζί μεοδηγίες εγκατάστασης) για όλα τα λειτουργικάσυστήματα από το Python Package Index (pypi)

στο httppypipythonorgpypinetworkx Εφόσονείναι εγκαταστημένος ο python package manager pipτότε το NetworkX μπορεί να εγκατασταθείαυτόματα μέσω της (εξωτερικής στην Python)εντολής

pip install networkx

Μέσα στο περιβάλλον της Python το NetworkX

καλείται (εισάγεται) ως εξής

import networkx as nx

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Απλού (Μη Κατευθυνόμενου) Γράφου

Πρώτα δίνονται οι εντολές για μη κατευθυνόμενουςγράφουςΑρχικά δημιουργείται ένας κενός γράφος

import networkx as nx

G = nxGraph()

Μετά εισάγονται αρχικά οι κόμβοι πχ οι 5κόμβοι ´1´ ´2´ ´3´ ´4´ και ´5´ μπαίνουν ως εξής

Gadd_nodes_from ([12345])

Βέβαια αντί για αριθμούς οι κόμβοι μπορούν ναεισάγονται ως ονόματα ή λέξεις πχ

Gadd_nodes_from ([John Mary])Gadd_node(London)

Gadd_nodes_from ([abcde])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για να δούμε όλους τους κόμβους που έχουν μπειως τώρα και να αφαιρέσουμε κάποιους ή όλους

Gnodes()

Gremove_nodes_from ([John Mary])Gclear()

Στη συνέχεια εισάγονται οι ακμές πχ για τους 5κόμβους 1ndash5 (που πρέπει να επαναndashεισαχθούν) να6 συνδέσεις

Gadd_nodes_from ([12345])

Gadd_edges_from ([(12)(14)(23)(34)(35)(45)])

Οι λίστες και το πλήθος των εισαχθέντων κόμβωνκαι ακμών δίνονται από τις εντολές

Gnodes()

Gnumber_of_nodes ()

Gedges()

Gnumber_of_edges ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για το σχεδιασμό του εισαχθέντος γράφου πχτου παραδείγματος αυτού του γράφου με 5κόμβους και 6 ακμές εκτελούνται οι εντολές

import matplotlibpyplot as plt

pltfigure ()

nxdraw(G with_labels=True)

pltshow()

Η τελευταία εντολή δέχεται διάφορες παραμέτρουςόπως πχ για διαφορετικό τύπο σχεδίου (layout)μέγεθος και χρώμα κόμβων και αφαίρεση τωνονομάτων (ids) των κόμβων

nxdraw_spring(G node_size=100 node_color=A0CBE2 with_labels=False)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Παραλείποντας τις προηγούμενες παραμετροποιήσεις ο σχεδιασμός

του γράφου του παραδείγματος δίνει το διάγραμμα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οι κόμβοι μπορούν να τοποτετηθούν σε σταθερές (προκαθορισμένες)

θέσεις εφόσον ο γράφος είχε εισαχθεί με τις συντεταγμένες τους που

μπορεί να γίνει πχ στο παράδειγμα αυτό ως εξής

pos=1(00)2(10)4(01)3(11)5(0520)

pltfigure ()

nxdraw(Gpos with_labels=True)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού (Μη Κατευθυνόμενου)Γράφου

´Ενας πολλαπλός γράφος (multigraph) είναι έναςγράφος με πολλαπλές (παράλληλες) ακμές και(ενδεχομένως) και αυτοndashβρόγχους (selfndashloops) Ναένα παράδειγμα πολλαπλού (μη κατευθυνόμενου)γράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(12)(13)(22)(23)(23)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Απλού Κατευθυνόμενου Γράφου

Γίνεται ως εξής πχ στο παράδειγμα αυτό

G=nxDiGraph ()

Gadd_nodes_from ([ABCD])

Gadd_edges_from ([(AB) (CA) (CB)

(BD)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού Κατευθυνόμενου Γράφου

Να ένα παράδειγμα πολλαπλού κατευθυνόμενουγράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiDiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(21)(13)(22)(23)(32)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Γράφων με Βάρη Ακμών

Γίνεται πχ στο παράδειγμα αυτό με τις εντολές

G=nxGraph()

Gadd_weighted_edges_from ([(ab4)(ac8)(ad5)(cd3)])

και ο σχεδιασμός ως εξής

pltfigure(facecolor=w)pos=nxspring_layout(G)

edge_labels=dict ([((uv)d[weight ])for uvd in Gedges(data=True )])

nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20)

nxdraw_networkx_edge_labels(Gpos

edge_labels=edge_labels font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 2: Slides Δικτυακών Υπολογισμών με την Python

Περιεχόμενα

1 Εισαγωγή Γράφων

2 Βασικοί Υπολογισμοί της Θεωρίας Γράφων

3 ∆ικτυακά Μέτρα

4 ∆ιαμερισμοί Γράφων

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Εισαγωγή ΓράφωνΕγκατάσταση του NetworkX

Εισαγωγή (Μη Κατευθυνόμενων) Γράφων

Απλοί Γράφοι

Πολλαπλοί Γράφοι

Εισαγωγή Κατευθυνόμενων Γράφων

Απλοί Κατευθυνόμενοι Γράφοι

Πολλαπλοί Κατευθυνόμενοι Γράφοι

Εισαγωγή Γράφων με Βάρη Ακμών

Εισαγωγή ∆ιμερών Γράφων

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Γεννήτορες Προκατασκευασμένων Γράφων

Οπτικοποίηση (Visualization) Γράφων με το Gephi

∆ιεπίπεδοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εγκατάσταση του NetworkX

Το NetworkX είναι ένα πακέτο της Python για τηνδημιουργία την διαχείριση και υλοποίησηυπολογισμών για γράφους και δίκτυαΤο NetworkX διατίθεται για κατέβασμα (μαζί μεοδηγίες εγκατάστασης) για όλα τα λειτουργικάσυστήματα από το Python Package Index (pypi)

στο httppypipythonorgpypinetworkx Εφόσονείναι εγκαταστημένος ο python package manager pipτότε το NetworkX μπορεί να εγκατασταθείαυτόματα μέσω της (εξωτερικής στην Python)εντολής

pip install networkx

Μέσα στο περιβάλλον της Python το NetworkX

καλείται (εισάγεται) ως εξής

import networkx as nx

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Απλού (Μη Κατευθυνόμενου) Γράφου

Πρώτα δίνονται οι εντολές για μη κατευθυνόμενουςγράφουςΑρχικά δημιουργείται ένας κενός γράφος

import networkx as nx

G = nxGraph()

Μετά εισάγονται αρχικά οι κόμβοι πχ οι 5κόμβοι ´1´ ´2´ ´3´ ´4´ και ´5´ μπαίνουν ως εξής

Gadd_nodes_from ([12345])

Βέβαια αντί για αριθμούς οι κόμβοι μπορούν ναεισάγονται ως ονόματα ή λέξεις πχ

Gadd_nodes_from ([John Mary])Gadd_node(London)

Gadd_nodes_from ([abcde])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για να δούμε όλους τους κόμβους που έχουν μπειως τώρα και να αφαιρέσουμε κάποιους ή όλους

Gnodes()

Gremove_nodes_from ([John Mary])Gclear()

Στη συνέχεια εισάγονται οι ακμές πχ για τους 5κόμβους 1ndash5 (που πρέπει να επαναndashεισαχθούν) να6 συνδέσεις

Gadd_nodes_from ([12345])

Gadd_edges_from ([(12)(14)(23)(34)(35)(45)])

Οι λίστες και το πλήθος των εισαχθέντων κόμβωνκαι ακμών δίνονται από τις εντολές

Gnodes()

Gnumber_of_nodes ()

Gedges()

Gnumber_of_edges ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για το σχεδιασμό του εισαχθέντος γράφου πχτου παραδείγματος αυτού του γράφου με 5κόμβους και 6 ακμές εκτελούνται οι εντολές

import matplotlibpyplot as plt

pltfigure ()

nxdraw(G with_labels=True)

pltshow()

Η τελευταία εντολή δέχεται διάφορες παραμέτρουςόπως πχ για διαφορετικό τύπο σχεδίου (layout)μέγεθος και χρώμα κόμβων και αφαίρεση τωνονομάτων (ids) των κόμβων

nxdraw_spring(G node_size=100 node_color=A0CBE2 with_labels=False)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Παραλείποντας τις προηγούμενες παραμετροποιήσεις ο σχεδιασμός

του γράφου του παραδείγματος δίνει το διάγραμμα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οι κόμβοι μπορούν να τοποτετηθούν σε σταθερές (προκαθορισμένες)

θέσεις εφόσον ο γράφος είχε εισαχθεί με τις συντεταγμένες τους που

μπορεί να γίνει πχ στο παράδειγμα αυτό ως εξής

pos=1(00)2(10)4(01)3(11)5(0520)

pltfigure ()

nxdraw(Gpos with_labels=True)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού (Μη Κατευθυνόμενου)Γράφου

´Ενας πολλαπλός γράφος (multigraph) είναι έναςγράφος με πολλαπλές (παράλληλες) ακμές και(ενδεχομένως) και αυτοndashβρόγχους (selfndashloops) Ναένα παράδειγμα πολλαπλού (μη κατευθυνόμενου)γράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(12)(13)(22)(23)(23)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Απλού Κατευθυνόμενου Γράφου

Γίνεται ως εξής πχ στο παράδειγμα αυτό

G=nxDiGraph ()

Gadd_nodes_from ([ABCD])

Gadd_edges_from ([(AB) (CA) (CB)

(BD)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού Κατευθυνόμενου Γράφου

Να ένα παράδειγμα πολλαπλού κατευθυνόμενουγράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiDiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(21)(13)(22)(23)(32)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Γράφων με Βάρη Ακμών

Γίνεται πχ στο παράδειγμα αυτό με τις εντολές

G=nxGraph()

Gadd_weighted_edges_from ([(ab4)(ac8)(ad5)(cd3)])

και ο σχεδιασμός ως εξής

pltfigure(facecolor=w)pos=nxspring_layout(G)

edge_labels=dict ([((uv)d[weight ])for uvd in Gedges(data=True )])

nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20)

nxdraw_networkx_edge_labels(Gpos

edge_labels=edge_labels font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 3: Slides Δικτυακών Υπολογισμών με την Python

1 Εισαγωγή ΓράφωνΕγκατάσταση του NetworkX

Εισαγωγή (Μη Κατευθυνόμενων) Γράφων

Απλοί Γράφοι

Πολλαπλοί Γράφοι

Εισαγωγή Κατευθυνόμενων Γράφων

Απλοί Κατευθυνόμενοι Γράφοι

Πολλαπλοί Κατευθυνόμενοι Γράφοι

Εισαγωγή Γράφων με Βάρη Ακμών

Εισαγωγή ∆ιμερών Γράφων

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Γεννήτορες Προκατασκευασμένων Γράφων

Οπτικοποίηση (Visualization) Γράφων με το Gephi

∆ιεπίπεδοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εγκατάσταση του NetworkX

Το NetworkX είναι ένα πακέτο της Python για τηνδημιουργία την διαχείριση και υλοποίησηυπολογισμών για γράφους και δίκτυαΤο NetworkX διατίθεται για κατέβασμα (μαζί μεοδηγίες εγκατάστασης) για όλα τα λειτουργικάσυστήματα από το Python Package Index (pypi)

στο httppypipythonorgpypinetworkx Εφόσονείναι εγκαταστημένος ο python package manager pipτότε το NetworkX μπορεί να εγκατασταθείαυτόματα μέσω της (εξωτερικής στην Python)εντολής

pip install networkx

Μέσα στο περιβάλλον της Python το NetworkX

καλείται (εισάγεται) ως εξής

import networkx as nx

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Απλού (Μη Κατευθυνόμενου) Γράφου

Πρώτα δίνονται οι εντολές για μη κατευθυνόμενουςγράφουςΑρχικά δημιουργείται ένας κενός γράφος

import networkx as nx

G = nxGraph()

Μετά εισάγονται αρχικά οι κόμβοι πχ οι 5κόμβοι ´1´ ´2´ ´3´ ´4´ και ´5´ μπαίνουν ως εξής

Gadd_nodes_from ([12345])

Βέβαια αντί για αριθμούς οι κόμβοι μπορούν ναεισάγονται ως ονόματα ή λέξεις πχ

Gadd_nodes_from ([John Mary])Gadd_node(London)

Gadd_nodes_from ([abcde])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για να δούμε όλους τους κόμβους που έχουν μπειως τώρα και να αφαιρέσουμε κάποιους ή όλους

Gnodes()

Gremove_nodes_from ([John Mary])Gclear()

Στη συνέχεια εισάγονται οι ακμές πχ για τους 5κόμβους 1ndash5 (που πρέπει να επαναndashεισαχθούν) να6 συνδέσεις

Gadd_nodes_from ([12345])

Gadd_edges_from ([(12)(14)(23)(34)(35)(45)])

Οι λίστες και το πλήθος των εισαχθέντων κόμβωνκαι ακμών δίνονται από τις εντολές

Gnodes()

Gnumber_of_nodes ()

Gedges()

Gnumber_of_edges ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για το σχεδιασμό του εισαχθέντος γράφου πχτου παραδείγματος αυτού του γράφου με 5κόμβους και 6 ακμές εκτελούνται οι εντολές

import matplotlibpyplot as plt

pltfigure ()

nxdraw(G with_labels=True)

pltshow()

Η τελευταία εντολή δέχεται διάφορες παραμέτρουςόπως πχ για διαφορετικό τύπο σχεδίου (layout)μέγεθος και χρώμα κόμβων και αφαίρεση τωνονομάτων (ids) των κόμβων

nxdraw_spring(G node_size=100 node_color=A0CBE2 with_labels=False)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Παραλείποντας τις προηγούμενες παραμετροποιήσεις ο σχεδιασμός

του γράφου του παραδείγματος δίνει το διάγραμμα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οι κόμβοι μπορούν να τοποτετηθούν σε σταθερές (προκαθορισμένες)

θέσεις εφόσον ο γράφος είχε εισαχθεί με τις συντεταγμένες τους που

μπορεί να γίνει πχ στο παράδειγμα αυτό ως εξής

pos=1(00)2(10)4(01)3(11)5(0520)

pltfigure ()

nxdraw(Gpos with_labels=True)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού (Μη Κατευθυνόμενου)Γράφου

´Ενας πολλαπλός γράφος (multigraph) είναι έναςγράφος με πολλαπλές (παράλληλες) ακμές και(ενδεχομένως) και αυτοndashβρόγχους (selfndashloops) Ναένα παράδειγμα πολλαπλού (μη κατευθυνόμενου)γράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(12)(13)(22)(23)(23)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Απλού Κατευθυνόμενου Γράφου

Γίνεται ως εξής πχ στο παράδειγμα αυτό

G=nxDiGraph ()

Gadd_nodes_from ([ABCD])

Gadd_edges_from ([(AB) (CA) (CB)

(BD)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού Κατευθυνόμενου Γράφου

Να ένα παράδειγμα πολλαπλού κατευθυνόμενουγράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiDiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(21)(13)(22)(23)(32)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Γράφων με Βάρη Ακμών

Γίνεται πχ στο παράδειγμα αυτό με τις εντολές

G=nxGraph()

Gadd_weighted_edges_from ([(ab4)(ac8)(ad5)(cd3)])

και ο σχεδιασμός ως εξής

pltfigure(facecolor=w)pos=nxspring_layout(G)

edge_labels=dict ([((uv)d[weight ])for uvd in Gedges(data=True )])

nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20)

nxdraw_networkx_edge_labels(Gpos

edge_labels=edge_labels font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 4: Slides Δικτυακών Υπολογισμών με την Python

Εγκατάσταση του NetworkX

Το NetworkX είναι ένα πακέτο της Python για τηνδημιουργία την διαχείριση και υλοποίησηυπολογισμών για γράφους και δίκτυαΤο NetworkX διατίθεται για κατέβασμα (μαζί μεοδηγίες εγκατάστασης) για όλα τα λειτουργικάσυστήματα από το Python Package Index (pypi)

στο httppypipythonorgpypinetworkx Εφόσονείναι εγκαταστημένος ο python package manager pipτότε το NetworkX μπορεί να εγκατασταθείαυτόματα μέσω της (εξωτερικής στην Python)εντολής

pip install networkx

Μέσα στο περιβάλλον της Python το NetworkX

καλείται (εισάγεται) ως εξής

import networkx as nx

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Απλού (Μη Κατευθυνόμενου) Γράφου

Πρώτα δίνονται οι εντολές για μη κατευθυνόμενουςγράφουςΑρχικά δημιουργείται ένας κενός γράφος

import networkx as nx

G = nxGraph()

Μετά εισάγονται αρχικά οι κόμβοι πχ οι 5κόμβοι ´1´ ´2´ ´3´ ´4´ και ´5´ μπαίνουν ως εξής

Gadd_nodes_from ([12345])

Βέβαια αντί για αριθμούς οι κόμβοι μπορούν ναεισάγονται ως ονόματα ή λέξεις πχ

Gadd_nodes_from ([John Mary])Gadd_node(London)

Gadd_nodes_from ([abcde])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για να δούμε όλους τους κόμβους που έχουν μπειως τώρα και να αφαιρέσουμε κάποιους ή όλους

Gnodes()

Gremove_nodes_from ([John Mary])Gclear()

Στη συνέχεια εισάγονται οι ακμές πχ για τους 5κόμβους 1ndash5 (που πρέπει να επαναndashεισαχθούν) να6 συνδέσεις

Gadd_nodes_from ([12345])

Gadd_edges_from ([(12)(14)(23)(34)(35)(45)])

Οι λίστες και το πλήθος των εισαχθέντων κόμβωνκαι ακμών δίνονται από τις εντολές

Gnodes()

Gnumber_of_nodes ()

Gedges()

Gnumber_of_edges ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για το σχεδιασμό του εισαχθέντος γράφου πχτου παραδείγματος αυτού του γράφου με 5κόμβους και 6 ακμές εκτελούνται οι εντολές

import matplotlibpyplot as plt

pltfigure ()

nxdraw(G with_labels=True)

pltshow()

Η τελευταία εντολή δέχεται διάφορες παραμέτρουςόπως πχ για διαφορετικό τύπο σχεδίου (layout)μέγεθος και χρώμα κόμβων και αφαίρεση τωνονομάτων (ids) των κόμβων

nxdraw_spring(G node_size=100 node_color=A0CBE2 with_labels=False)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Παραλείποντας τις προηγούμενες παραμετροποιήσεις ο σχεδιασμός

του γράφου του παραδείγματος δίνει το διάγραμμα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οι κόμβοι μπορούν να τοποτετηθούν σε σταθερές (προκαθορισμένες)

θέσεις εφόσον ο γράφος είχε εισαχθεί με τις συντεταγμένες τους που

μπορεί να γίνει πχ στο παράδειγμα αυτό ως εξής

pos=1(00)2(10)4(01)3(11)5(0520)

pltfigure ()

nxdraw(Gpos with_labels=True)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού (Μη Κατευθυνόμενου)Γράφου

´Ενας πολλαπλός γράφος (multigraph) είναι έναςγράφος με πολλαπλές (παράλληλες) ακμές και(ενδεχομένως) και αυτοndashβρόγχους (selfndashloops) Ναένα παράδειγμα πολλαπλού (μη κατευθυνόμενου)γράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(12)(13)(22)(23)(23)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Απλού Κατευθυνόμενου Γράφου

Γίνεται ως εξής πχ στο παράδειγμα αυτό

G=nxDiGraph ()

Gadd_nodes_from ([ABCD])

Gadd_edges_from ([(AB) (CA) (CB)

(BD)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού Κατευθυνόμενου Γράφου

Να ένα παράδειγμα πολλαπλού κατευθυνόμενουγράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiDiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(21)(13)(22)(23)(32)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Γράφων με Βάρη Ακμών

Γίνεται πχ στο παράδειγμα αυτό με τις εντολές

G=nxGraph()

Gadd_weighted_edges_from ([(ab4)(ac8)(ad5)(cd3)])

και ο σχεδιασμός ως εξής

pltfigure(facecolor=w)pos=nxspring_layout(G)

edge_labels=dict ([((uv)d[weight ])for uvd in Gedges(data=True )])

nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20)

nxdraw_networkx_edge_labels(Gpos

edge_labels=edge_labels font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 5: Slides Δικτυακών Υπολογισμών με την Python

Εισαγωγή Απλού (Μη Κατευθυνόμενου) Γράφου

Πρώτα δίνονται οι εντολές για μη κατευθυνόμενουςγράφουςΑρχικά δημιουργείται ένας κενός γράφος

import networkx as nx

G = nxGraph()

Μετά εισάγονται αρχικά οι κόμβοι πχ οι 5κόμβοι ´1´ ´2´ ´3´ ´4´ και ´5´ μπαίνουν ως εξής

Gadd_nodes_from ([12345])

Βέβαια αντί για αριθμούς οι κόμβοι μπορούν ναεισάγονται ως ονόματα ή λέξεις πχ

Gadd_nodes_from ([John Mary])Gadd_node(London)

Gadd_nodes_from ([abcde])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για να δούμε όλους τους κόμβους που έχουν μπειως τώρα και να αφαιρέσουμε κάποιους ή όλους

Gnodes()

Gremove_nodes_from ([John Mary])Gclear()

Στη συνέχεια εισάγονται οι ακμές πχ για τους 5κόμβους 1ndash5 (που πρέπει να επαναndashεισαχθούν) να6 συνδέσεις

Gadd_nodes_from ([12345])

Gadd_edges_from ([(12)(14)(23)(34)(35)(45)])

Οι λίστες και το πλήθος των εισαχθέντων κόμβωνκαι ακμών δίνονται από τις εντολές

Gnodes()

Gnumber_of_nodes ()

Gedges()

Gnumber_of_edges ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για το σχεδιασμό του εισαχθέντος γράφου πχτου παραδείγματος αυτού του γράφου με 5κόμβους και 6 ακμές εκτελούνται οι εντολές

import matplotlibpyplot as plt

pltfigure ()

nxdraw(G with_labels=True)

pltshow()

Η τελευταία εντολή δέχεται διάφορες παραμέτρουςόπως πχ για διαφορετικό τύπο σχεδίου (layout)μέγεθος και χρώμα κόμβων και αφαίρεση τωνονομάτων (ids) των κόμβων

nxdraw_spring(G node_size=100 node_color=A0CBE2 with_labels=False)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Παραλείποντας τις προηγούμενες παραμετροποιήσεις ο σχεδιασμός

του γράφου του παραδείγματος δίνει το διάγραμμα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οι κόμβοι μπορούν να τοποτετηθούν σε σταθερές (προκαθορισμένες)

θέσεις εφόσον ο γράφος είχε εισαχθεί με τις συντεταγμένες τους που

μπορεί να γίνει πχ στο παράδειγμα αυτό ως εξής

pos=1(00)2(10)4(01)3(11)5(0520)

pltfigure ()

nxdraw(Gpos with_labels=True)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού (Μη Κατευθυνόμενου)Γράφου

´Ενας πολλαπλός γράφος (multigraph) είναι έναςγράφος με πολλαπλές (παράλληλες) ακμές και(ενδεχομένως) και αυτοndashβρόγχους (selfndashloops) Ναένα παράδειγμα πολλαπλού (μη κατευθυνόμενου)γράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(12)(13)(22)(23)(23)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Απλού Κατευθυνόμενου Γράφου

Γίνεται ως εξής πχ στο παράδειγμα αυτό

G=nxDiGraph ()

Gadd_nodes_from ([ABCD])

Gadd_edges_from ([(AB) (CA) (CB)

(BD)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού Κατευθυνόμενου Γράφου

Να ένα παράδειγμα πολλαπλού κατευθυνόμενουγράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiDiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(21)(13)(22)(23)(32)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Γράφων με Βάρη Ακμών

Γίνεται πχ στο παράδειγμα αυτό με τις εντολές

G=nxGraph()

Gadd_weighted_edges_from ([(ab4)(ac8)(ad5)(cd3)])

και ο σχεδιασμός ως εξής

pltfigure(facecolor=w)pos=nxspring_layout(G)

edge_labels=dict ([((uv)d[weight ])for uvd in Gedges(data=True )])

nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20)

nxdraw_networkx_edge_labels(Gpos

edge_labels=edge_labels font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 6: Slides Δικτυακών Υπολογισμών με την Python

Για να δούμε όλους τους κόμβους που έχουν μπειως τώρα και να αφαιρέσουμε κάποιους ή όλους

Gnodes()

Gremove_nodes_from ([John Mary])Gclear()

Στη συνέχεια εισάγονται οι ακμές πχ για τους 5κόμβους 1ndash5 (που πρέπει να επαναndashεισαχθούν) να6 συνδέσεις

Gadd_nodes_from ([12345])

Gadd_edges_from ([(12)(14)(23)(34)(35)(45)])

Οι λίστες και το πλήθος των εισαχθέντων κόμβωνκαι ακμών δίνονται από τις εντολές

Gnodes()

Gnumber_of_nodes ()

Gedges()

Gnumber_of_edges ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για το σχεδιασμό του εισαχθέντος γράφου πχτου παραδείγματος αυτού του γράφου με 5κόμβους και 6 ακμές εκτελούνται οι εντολές

import matplotlibpyplot as plt

pltfigure ()

nxdraw(G with_labels=True)

pltshow()

Η τελευταία εντολή δέχεται διάφορες παραμέτρουςόπως πχ για διαφορετικό τύπο σχεδίου (layout)μέγεθος και χρώμα κόμβων και αφαίρεση τωνονομάτων (ids) των κόμβων

nxdraw_spring(G node_size=100 node_color=A0CBE2 with_labels=False)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Παραλείποντας τις προηγούμενες παραμετροποιήσεις ο σχεδιασμός

του γράφου του παραδείγματος δίνει το διάγραμμα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οι κόμβοι μπορούν να τοποτετηθούν σε σταθερές (προκαθορισμένες)

θέσεις εφόσον ο γράφος είχε εισαχθεί με τις συντεταγμένες τους που

μπορεί να γίνει πχ στο παράδειγμα αυτό ως εξής

pos=1(00)2(10)4(01)3(11)5(0520)

pltfigure ()

nxdraw(Gpos with_labels=True)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού (Μη Κατευθυνόμενου)Γράφου

´Ενας πολλαπλός γράφος (multigraph) είναι έναςγράφος με πολλαπλές (παράλληλες) ακμές και(ενδεχομένως) και αυτοndashβρόγχους (selfndashloops) Ναένα παράδειγμα πολλαπλού (μη κατευθυνόμενου)γράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(12)(13)(22)(23)(23)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Απλού Κατευθυνόμενου Γράφου

Γίνεται ως εξής πχ στο παράδειγμα αυτό

G=nxDiGraph ()

Gadd_nodes_from ([ABCD])

Gadd_edges_from ([(AB) (CA) (CB)

(BD)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού Κατευθυνόμενου Γράφου

Να ένα παράδειγμα πολλαπλού κατευθυνόμενουγράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiDiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(21)(13)(22)(23)(32)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Γράφων με Βάρη Ακμών

Γίνεται πχ στο παράδειγμα αυτό με τις εντολές

G=nxGraph()

Gadd_weighted_edges_from ([(ab4)(ac8)(ad5)(cd3)])

και ο σχεδιασμός ως εξής

pltfigure(facecolor=w)pos=nxspring_layout(G)

edge_labels=dict ([((uv)d[weight ])for uvd in Gedges(data=True )])

nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20)

nxdraw_networkx_edge_labels(Gpos

edge_labels=edge_labels font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 7: Slides Δικτυακών Υπολογισμών με την Python

Για το σχεδιασμό του εισαχθέντος γράφου πχτου παραδείγματος αυτού του γράφου με 5κόμβους και 6 ακμές εκτελούνται οι εντολές

import matplotlibpyplot as plt

pltfigure ()

nxdraw(G with_labels=True)

pltshow()

Η τελευταία εντολή δέχεται διάφορες παραμέτρουςόπως πχ για διαφορετικό τύπο σχεδίου (layout)μέγεθος και χρώμα κόμβων και αφαίρεση τωνονομάτων (ids) των κόμβων

nxdraw_spring(G node_size=100 node_color=A0CBE2 with_labels=False)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Παραλείποντας τις προηγούμενες παραμετροποιήσεις ο σχεδιασμός

του γράφου του παραδείγματος δίνει το διάγραμμα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οι κόμβοι μπορούν να τοποτετηθούν σε σταθερές (προκαθορισμένες)

θέσεις εφόσον ο γράφος είχε εισαχθεί με τις συντεταγμένες τους που

μπορεί να γίνει πχ στο παράδειγμα αυτό ως εξής

pos=1(00)2(10)4(01)3(11)5(0520)

pltfigure ()

nxdraw(Gpos with_labels=True)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού (Μη Κατευθυνόμενου)Γράφου

´Ενας πολλαπλός γράφος (multigraph) είναι έναςγράφος με πολλαπλές (παράλληλες) ακμές και(ενδεχομένως) και αυτοndashβρόγχους (selfndashloops) Ναένα παράδειγμα πολλαπλού (μη κατευθυνόμενου)γράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(12)(13)(22)(23)(23)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Απλού Κατευθυνόμενου Γράφου

Γίνεται ως εξής πχ στο παράδειγμα αυτό

G=nxDiGraph ()

Gadd_nodes_from ([ABCD])

Gadd_edges_from ([(AB) (CA) (CB)

(BD)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού Κατευθυνόμενου Γράφου

Να ένα παράδειγμα πολλαπλού κατευθυνόμενουγράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiDiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(21)(13)(22)(23)(32)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Γράφων με Βάρη Ακμών

Γίνεται πχ στο παράδειγμα αυτό με τις εντολές

G=nxGraph()

Gadd_weighted_edges_from ([(ab4)(ac8)(ad5)(cd3)])

και ο σχεδιασμός ως εξής

pltfigure(facecolor=w)pos=nxspring_layout(G)

edge_labels=dict ([((uv)d[weight ])for uvd in Gedges(data=True )])

nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20)

nxdraw_networkx_edge_labels(Gpos

edge_labels=edge_labels font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 8: Slides Δικτυακών Υπολογισμών με την Python

Παραλείποντας τις προηγούμενες παραμετροποιήσεις ο σχεδιασμός

του γράφου του παραδείγματος δίνει το διάγραμμα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οι κόμβοι μπορούν να τοποτετηθούν σε σταθερές (προκαθορισμένες)

θέσεις εφόσον ο γράφος είχε εισαχθεί με τις συντεταγμένες τους που

μπορεί να γίνει πχ στο παράδειγμα αυτό ως εξής

pos=1(00)2(10)4(01)3(11)5(0520)

pltfigure ()

nxdraw(Gpos with_labels=True)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού (Μη Κατευθυνόμενου)Γράφου

´Ενας πολλαπλός γράφος (multigraph) είναι έναςγράφος με πολλαπλές (παράλληλες) ακμές και(ενδεχομένως) και αυτοndashβρόγχους (selfndashloops) Ναένα παράδειγμα πολλαπλού (μη κατευθυνόμενου)γράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(12)(13)(22)(23)(23)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Απλού Κατευθυνόμενου Γράφου

Γίνεται ως εξής πχ στο παράδειγμα αυτό

G=nxDiGraph ()

Gadd_nodes_from ([ABCD])

Gadd_edges_from ([(AB) (CA) (CB)

(BD)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού Κατευθυνόμενου Γράφου

Να ένα παράδειγμα πολλαπλού κατευθυνόμενουγράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiDiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(21)(13)(22)(23)(32)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Γράφων με Βάρη Ακμών

Γίνεται πχ στο παράδειγμα αυτό με τις εντολές

G=nxGraph()

Gadd_weighted_edges_from ([(ab4)(ac8)(ad5)(cd3)])

και ο σχεδιασμός ως εξής

pltfigure(facecolor=w)pos=nxspring_layout(G)

edge_labels=dict ([((uv)d[weight ])for uvd in Gedges(data=True )])

nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20)

nxdraw_networkx_edge_labels(Gpos

edge_labels=edge_labels font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 9: Slides Δικτυακών Υπολογισμών με την Python

Οι κόμβοι μπορούν να τοποτετηθούν σε σταθερές (προκαθορισμένες)

θέσεις εφόσον ο γράφος είχε εισαχθεί με τις συντεταγμένες τους που

μπορεί να γίνει πχ στο παράδειγμα αυτό ως εξής

pos=1(00)2(10)4(01)3(11)5(0520)

pltfigure ()

nxdraw(Gpos with_labels=True)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού (Μη Κατευθυνόμενου)Γράφου

´Ενας πολλαπλός γράφος (multigraph) είναι έναςγράφος με πολλαπλές (παράλληλες) ακμές και(ενδεχομένως) και αυτοndashβρόγχους (selfndashloops) Ναένα παράδειγμα πολλαπλού (μη κατευθυνόμενου)γράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(12)(13)(22)(23)(23)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Απλού Κατευθυνόμενου Γράφου

Γίνεται ως εξής πχ στο παράδειγμα αυτό

G=nxDiGraph ()

Gadd_nodes_from ([ABCD])

Gadd_edges_from ([(AB) (CA) (CB)

(BD)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού Κατευθυνόμενου Γράφου

Να ένα παράδειγμα πολλαπλού κατευθυνόμενουγράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiDiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(21)(13)(22)(23)(32)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Γράφων με Βάρη Ακμών

Γίνεται πχ στο παράδειγμα αυτό με τις εντολές

G=nxGraph()

Gadd_weighted_edges_from ([(ab4)(ac8)(ad5)(cd3)])

και ο σχεδιασμός ως εξής

pltfigure(facecolor=w)pos=nxspring_layout(G)

edge_labels=dict ([((uv)d[weight ])for uvd in Gedges(data=True )])

nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20)

nxdraw_networkx_edge_labels(Gpos

edge_labels=edge_labels font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 10: Slides Δικτυακών Υπολογισμών με την Python

Εισαγωγή Πολλαπλού (Μη Κατευθυνόμενου)Γράφου

´Ενας πολλαπλός γράφος (multigraph) είναι έναςγράφος με πολλαπλές (παράλληλες) ακμές και(ενδεχομένως) και αυτοndashβρόγχους (selfndashloops) Ναένα παράδειγμα πολλαπλού (μη κατευθυνόμενου)γράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(12)(13)(22)(23)(23)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Απλού Κατευθυνόμενου Γράφου

Γίνεται ως εξής πχ στο παράδειγμα αυτό

G=nxDiGraph ()

Gadd_nodes_from ([ABCD])

Gadd_edges_from ([(AB) (CA) (CB)

(BD)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού Κατευθυνόμενου Γράφου

Να ένα παράδειγμα πολλαπλού κατευθυνόμενουγράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiDiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(21)(13)(22)(23)(32)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Γράφων με Βάρη Ακμών

Γίνεται πχ στο παράδειγμα αυτό με τις εντολές

G=nxGraph()

Gadd_weighted_edges_from ([(ab4)(ac8)(ad5)(cd3)])

και ο σχεδιασμός ως εξής

pltfigure(facecolor=w)pos=nxspring_layout(G)

edge_labels=dict ([((uv)d[weight ])for uvd in Gedges(data=True )])

nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20)

nxdraw_networkx_edge_labels(Gpos

edge_labels=edge_labels font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 11: Slides Δικτυακών Υπολογισμών με την Python

Εισαγωγή Απλού Κατευθυνόμενου Γράφου

Γίνεται ως εξής πχ στο παράδειγμα αυτό

G=nxDiGraph ()

Gadd_nodes_from ([ABCD])

Gadd_edges_from ([(AB) (CA) (CB)

(BD)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Πολλαπλού Κατευθυνόμενου Γράφου

Να ένα παράδειγμα πολλαπλού κατευθυνόμενουγράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiDiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(21)(13)(22)(23)(32)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Γράφων με Βάρη Ακμών

Γίνεται πχ στο παράδειγμα αυτό με τις εντολές

G=nxGraph()

Gadd_weighted_edges_from ([(ab4)(ac8)(ad5)(cd3)])

και ο σχεδιασμός ως εξής

pltfigure(facecolor=w)pos=nxspring_layout(G)

edge_labels=dict ([((uv)d[weight ])for uvd in Gedges(data=True )])

nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20)

nxdraw_networkx_edge_labels(Gpos

edge_labels=edge_labels font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 12: Slides Δικτυακών Υπολογισμών με την Python

Εισαγωγή Πολλαπλού Κατευθυνόμενου Γράφου

Να ένα παράδειγμα πολλαπλού κατευθυνόμενουγράφου

1 2

3

Ο γράφος αυτός εισάγεται ως εξής (αλλά δεν είναιδυνατό να σχεδιασθεί με το NetworkX)

G = nxMultiDiGraph ()

Gadd_nodes_from(range(14))

Gadd_edges_from ([(12)(12)(21)(13)(22)(23)(32)])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή Γράφων με Βάρη Ακμών

Γίνεται πχ στο παράδειγμα αυτό με τις εντολές

G=nxGraph()

Gadd_weighted_edges_from ([(ab4)(ac8)(ad5)(cd3)])

και ο σχεδιασμός ως εξής

pltfigure(facecolor=w)pos=nxspring_layout(G)

edge_labels=dict ([((uv)d[weight ])for uvd in Gedges(data=True )])

nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20)

nxdraw_networkx_edge_labels(Gpos

edge_labels=edge_labels font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 13: Slides Δικτυακών Υπολογισμών με την Python

Εισαγωγή Γράφων με Βάρη Ακμών

Γίνεται πχ στο παράδειγμα αυτό με τις εντολές

G=nxGraph()

Gadd_weighted_edges_from ([(ab4)(ac8)(ad5)(cd3)])

και ο σχεδιασμός ως εξής

pltfigure(facecolor=w)pos=nxspring_layout(G)

edge_labels=dict ([((uv)d[weight ])for uvd in Gedges(data=True )])

nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20)

nxdraw_networkx_edge_labels(Gpos

edge_labels=edge_labels font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 14: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 15: Slides Δικτυακών Υπολογισμών με την Python

Αντί της παράθεσης των τιμών των βαρών οι ακμές μπορούν να

σχεδιασθούν με εύρη ανάλογα των τιμών των βαρών ως εξής

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

edgewidth =[]

for (uvd) in Gedges(data=True)

edgewidthappend(d[weight ])nxdraw_networkx_edges(Gpos edge_color=b width=edgewidth)

nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 16: Slides Δικτυακών Υπολογισμών με την Python

Επιπλέον μπορούν να κρατηθούν στο σχέδιο μόνο οι ακμές με βάρη

μεγαλύτερα κάποιας ενδιάμεσης τιμής πχ 4

elarge = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] gt4]

esmall = [(uv) for (uvd) in Gedges(data=True)

if d[weight ] lt=4]

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos node_size=700)

nxdraw_networkx_edges(Gpos edgelist=elarge

edge_color=bwidth=edgewidth)nxdraw_networkx_edges(Gpos edgelist=esmall width=6

alpha=05edge_color=gstyle=dashed )nxdraw_networkx_labels(Gpos font_size=20)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 17: Slides Δικτυακών Υπολογισμών με την Python

Εισαγωγή ∆ιμερών Γράφων

Η εισαγωγή διμερών γράφων γίνεται όπως πχστο παρακάτω παράδειγμα

from networkxalgorithms import bipartite

G = nxGraph()

Gadd_nodes_from ([1234] bipartite=0)

Gadd_nodes_from ([abc] bipartite=1)

Gadd_edges_from ([(1a)(1b)(2a)(2b)(2c)(3c)(4b)(4c)])

pos=1(00)

2(01)

3(02)

4(03)

a(105)b(115)c(125)

Ο έλεγχος αν πρόκειται περί διμερούς γράφου(True) ή όχι (False) γίνεται με την εντολή

print bipartiteis_bipartite(G)

True

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 18: Slides Δικτυακών Υπολογισμών με την Python

Ο σχεδιασμός του διμερούς γράφου γίνεται ωςεξής

mode1 mode2 = bipartitesets(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos nodelist=list(mode1)

node_color=bnode_size=700)nxdraw_networkx_nodes(Gpos nodelist=list(mode2)

node_color=gnode_size=700)nxdraw_networkx_edges(Gpos)

nxdraw_networkx_labels(Gpos font_size=20

font_color=FFFFFF )pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 19: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 20: Slides Δικτυακών Υπολογισμών με την Python

Χαρακτηριστικά (Attributes) Κόμβων και Ακμών

Τα χαρακτηριστικά των κόμβων μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρώματος)

G = nxGraph()

Gadd_node(1 color=red)Gadd_node(2 color=blue)Gadd_node(3 color=green)

Gadd_edges_from ([(12)(13)(23)])

Gnode[1]

Gnode[1][color ]Gnodes(data=True)

Gadd_nodes_from ([(1 color red) (2 color blue)(3 color green )])

custom_node_color=

custom_node_color[1] = rcustom_node_color[2] = bcustom_node_color[3] = g

pltfigure ()

nxdraw(Gnode_list = custom_node_colorkeys()

node_color=custom_node_colorvalues ())

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 21: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 22: Slides Δικτυακών Υπολογισμών με την Python

Τα χαρακτηριστικά των ακμών μπαίνουν ως εξής(στο παράδειγμα αυτό για το χαρακτηριστικό τουχρόνου)

G = nxGraph()

Gadd_edge(1 2 time=May)Gadd_edge(2 3 time=June)Gadd_edge(3 4 time=July)Gadd_edge(4 1 time=August )

Gedge[1][2]

Gedge[1][2][time]Gedges(data=True)

Gadd_edges_from ([(1 2 time May) (1 4 time August )(2 3 time June) (3 4 time July)])

edgelist = [(12)(23)(34)(14)]

colorlist =[rbgk]pos=nxspring_layout(G)

pltfigure(facecolor=w)nxdraw_networkx_nodes(Gpos with_labels=True)

nxdraw_networkx_labels(Gpos font_size=10)

nxdraw_networkx_edges(Gpos edgelist=edgelist edge_color=colorlist)

pltaxis(off)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 23: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 24: Slides Δικτυακών Υπολογισμών με την Python

Γεννήτορες Προκατασκευασμένων Γράφων

Οι προκαθορισμένοι γράφοι εισάγονται ως

G = nxgraph -name(parameters)

όπου το όνομαndashγράφου και οι παράμετροιrsquorsquo είναιόπως δίνονται στη συνέχεια

Για τον σχεδιασμό των προκαθορισμένων γράφων(χωρίς παραμετροποιήσεις) οι εντολές είναι

pltfigure ()

nxdraw(G with_labels=False)

pltshow()

Περισσότεροι προκατασκευασμένοι γράφοι τουNetworkX δίνονται στη σελίδα

httpsnetworkxgithubiodocumentationlatestreferencegeneratorshtml

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 25: Slides Δικτυακών Υπολογισμών με την Python

1 Απλοί και Γνωστοί Προκατασκευασμένοι ΓράφοιΚύκλος n κόμβων

cycle_graph(n)

Αστέρι n+ 1 κόμβων

star_graph(n)

∆ιαδρομή n κόμβων

path_graph(n)

Γράφος αετού του Krackhardt

krackhardt_kite_graph ()

Γράφος Φλωρεντιανών οικογενειών

florentine_families_graph ()

Γράφος του καράτε κλαμπ

karate_club_graph ()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 26: Slides Δικτυακών Υπολογισμών με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G1 = nxcycle_graph(10)

G2 = nxstar_graph(6)

G3 = nxpath_graph(6)

G4 = nxkrackhardt_kite_graph ()

G5 = nxflorentine_families_graph ()

G6 = nxkarate_club_graph ()

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Cycle)

nxdraw(G1node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Star)

nxdraw(G2node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(233) set_title(Path)

nxdraw(G3node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(234) set_title(Krackhardt kite)

nxdraw(G4node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(235) set_title(Florentine families)

nxdraw(G5node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(236) set_title(Karate club)

nxdraw(G6node_size=40with_labels=False ) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 27: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 28: Slides Δικτυακών Υπολογισμών με την Python

3 Τυχαίοι ΓράφοιΤυχαίος γράφος ErdosndashRenyi για n κόμβους και πιθανότητα p

erdos_renyi_graph(np)

Τυχαίος γράφος Gnp για n κόμβους και πιθανότητα p

gnp_random_graph(np)

Τυχαίος γράφος Gnm για n κόμβους και m ακμές

gnm_random_graph(nm)

Γράφος αναδικτύωσης πλέγματος StrogatzndashWatts για n κόμβους οκαθένας με k γείτονες (σε τοπολογία δακτυλίου) και με πιθανότητααναδικτύωσης p

watts_strogatz_graph(nkp)

Τυχαίος γράφος BarabasindashAlbert για n κόμβους και κάθε νέο κόμβο μεm ακμές σε υπάρχοντες κόμβους

barabasi_albert_graph(nm)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 29: Slides Δικτυακών Υπολογισμών με την Python

Κώδικας για τον σχεδιασμό των επόμενων δικτύων

G9 = nxerdos_renyi_graph(2002)

G10 = nxerdos_renyi_graph(2001)

G11 = nxgnp_random_graph(2501)

G12 = nxgnm_random_graph(2015)

G13 = nxwatts_strogatz_graph(10204)

G14 = nxbarabasi_albert_graph(403)

fig = pltfigure(figsize =(1010))

pltsubplot(231) set_title(Erdos Renyi (p=02))

nxdraw(G9node_size=40with_labels=False ) pltaxis(tight)

pltsubplot(232) set_title(Erdos Renyi (p=01))

nxdraw(G10 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(233) set_title(Random graph G_np )

nxdraw(G11 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(234) set_title(Random graph G_nm)

nxdraw(G12 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(235) set_title(Strogatz -Watts)

nxdraw(G13 node_size=40with_labels=False) pltaxis(tight)

pltsubplot(236) set_title(Barabasi -Albert)

nxdraw(G14 node_size=40with_labels=False) pltaxis(tight)

pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 30: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 31: Slides Δικτυακών Υπολογισμών με την Python

Οπτικοποίηση (Visualization) Γράφων με το GephiΠρώτα ορίζουμε το working directory όπου θέλουμε η Python να σώσειτον γράφο τον οποίον θα σχεδιάσουμε στη συνέχεια μέσω του Gephi

import os

oschdir(pwd)

όπου το rsquopwdrsquo αντιστοιχεί στη διαδρομή στον υποστολογιστή μας

Στη συνέχεια εισάγουμε τον γράφο στο NetworkX Πχ

G = nxerdos_renyi_graph(200 001)

Αμέσως μετά εξάγουμε αυτόν τον γράφο ως αρχείο gexf για να τονεπεξεργασθεί το Gephi

nxwrite_gexf(Gerngexf)

Στο Gephi προχωρούμε ως εξής

Open Graph FileOverviewLayout gt Apply (Stop)Data Laboratory gt Add column [color] gt Fill column with a valuePartition (refresh) choose color gt ApplyPreview (refress)Presets gt Default StraightExport (για να σώσουμε το διάγραμμα του γράφου συνήθως ωςpng ή pdf)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 32: Slides Δικτυακών Υπολογισμών με την Python

Σχήμα Τυχαίος γράφος ErdosndashRenyi για 200 κόμβους και πιθανότητα001 σχεδιασμένος με το Gephi

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 33: Slides Δικτυακών Υπολογισμών με την Python

∆ιεπίπεδοι Γράφοι∆ιεπίπεδος γράφος (twondashlevel graph) ονομάζεται ένας γράφος τοσύνολο κορυφών του οποίου διαμερίζεται σε δυο υποσύνολα πουονομάζονται επίπεδα έτσι ώστε το σύνολο των ακμών του γράφου ναδιαμερίζεται σε τρία υποσύνολα ακμές μεταξύ των κορυφών τουπρώτου επιπέδου ακμές μεταξύ των κορυφών του δευτέρου επιπέδουκαι ακμές μεταξύ των κορυφών του πρώτου και του δευτέρουεπιπέδου Με άλλα λόγια η διαφορά διεπίπεδου και διμερούς γράφουείναι ότι στον δεύτερο δεν μπορούν να υπάρχουν ακμές μεταξύ τωνκορυφών του πρώτου και του δευτέρου επιπέδουΜια πρώτη κατασκευή μπορεί να γίνει αναλυτικά rsquorsquoαποσυνθέτονταςrsquorsquoτο σύνολο των κορυφών ενός δοθέντος γράφου σε δυο επίπεδα όπωςπεριγράφεται με τις παρακάτω γραμμές κώδικα (κι ακολουθεί οσχεδιασμός του γράφου αυτού στην επόμενη διαφάνεια)

G=nxerdos_renyi_graph(2003)

pos=nxspring_layout(G)

top_set=range(08)

botom_set=range(820)

for i in pos

npos=pos[i]

if i in top_set

pos[i]=[ npos[0]npos[1]+2]

elif i in botom_set

pos[i]=[ npos[0]npos[1]-2]

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=top_set node_color=r)nxdraw(Gpos with_labels=True nodelist=botom_set node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 34: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 35: Slides Δικτυακών Υπολογισμών με την Python

Μια δεύτερη κατασκευή ενός διεπίπεδου γράφου μπορεί να γίνεισυνθετικά rsquorsquoγεφυρώνονταςrsquorsquo δυο δοθέντες γράφους με την προσθήκηακμών μεταξύ του συνόλου των κορυφών του πρώτου γράφου καιτου συνόλου των κορυφών του δευτέρου γράφου

J=nxerdos_renyi_graph(15017) First level graph

F=nxerdos_renyi_graph(20017) Second level graph

H=nxbipartite_random_graph(152001) The bridging bipartite graph

G=nxGraph() The two --level graph

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 36: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 37: Slides Δικτυακών Υπολογισμών με την Python

Σε αυτήν και την επόμενη διαφάνεια δίνεται ο κώδικας κατασκευήςενός διεπίπεδου γράφου του παραδείγματος διευθυντώνndashεταιρειών

(managersndashcompanies) Στη μεθεπόμενη διαφάνεια ακολουθεί ο κώδικαςτου σχεδιασμού του γράφου αυτού όπως απεικονίζεται στην αμέσωςεπόμενη διαφάνεια

directors = 0a1b2c3d4e

companies=0A1B2C3D4E5F

labels= directorscopy()

newkey=len(directorskeys ())

for k in companieskeys ()

labels[k+newkey ]= companies[k]

J=nxerdos_renyi_graph(508) Directors

F=nxerdos_renyi_graph(606) Companies

H=nxbipartite_random_graph(56055) Directors in Companies

G=nxGraph() Two -Level Graph

from networkxalgorithms import bipartite

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+5edge[1]+5)

for node in Fnodes ()

Gadd_node(node+5bipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 38: Slides Δικτυακών Υπολογισμών με την Python

posJ=nxspring_layout(J)

posF=nxspring_layout(F)

posH=0(00)1(02)2(04)3(06)4(08)5(1-2)6(10)7(12)8(14)

9(16)10(18)

mode1 mode2 = bipartitesets(H)

pos=nxspring_layout(G)

top_set=set()

botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 39: Slides Δικτυακών Υπολογισμών με την Python

fig = pltfigure(figsize =(1313))

pltsubplot(221) set_title(Friendship Network of Directors)

nxdraw(Jpos=posJ node_color=rnode_size=700 font_size=20font_color=FFFFFF with_labels=False)

nxdraw_networkx_labels(JposJ directors font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(222) set_title(Collaboration Network of Companies)

nxdraw(Fpos=posF node_color=bnode_size=800 font_size=20font_color=FFFFFF node_shape=swith_labels=False)nxdraw_networkx_labels(FposF companies font_size=20 font_color=FFFFFF )pltaxis(tight)

pltsubplot(223) set_title(Two -Mode network of Directors and Companies)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode1)node_color=rnode_size=700)

nxdraw_networkx_nodes(Hpos=posH nodelist=list(mode2)node_color=bnode_size=800 node_shape=s)nxdraw_networkx_edges(Hpos=posH)

nxdraw_networkx_labels(HposH labels font_size=20font_color=FFFFFF )pltaxis(off)pltaxis(tight)

pltsubplot(224) set_title(Two -Level Network of Directors and Companies)

nxdraw(Gpos nodelist=list(top_set)node_color=rnode_size=700 with_labels=False)

nxdraw(Gpos nodelist=list(botom_set)node_color=bnode_size=800 node_shape=swith_labels=False)nxdraw_networkx_labels(Gpos labels font_size=20 font_color=FFFFFF )pltaxis(tight)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 40: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 41: Slides Δικτυακών Υπολογισμών με την Python

Συνθετικοί Εγωκεντρικοί ΓράφοιΕγωκεντρικός γράφος ή δίκτυο (egocentric graphnetwork) ονομάζεται ένας γράφος για τονοποίον υπάρχει μια κορυφή που ονομάζονται rsquorsquoεγώrsquorsquo η οποία συνδέεται με όλες τις άλλεςκορυφές του γράφου αυτού Ακολουθεί μια συνθετική κατασκευή ως ειδική περίπτωσησυνθετικού διεπίπεδου γράφου στον οποίον το ένα από τα δυο επίπεδα αποτελείται από μιαμόνη κορυφή (το rsquorsquoεγώrsquorsquo) η οποία συνδέεται με όλες τις κορυφές του άλλου επιπέδου

J=nxerdos_renyi_graph(2001)

F=nxerdos_renyi_graph(11)

H=nxbipartite_random_graph(2011)

G=nxGraph()

for node in Jnodes ()

Gadd_node(node bipartite=0)

for edge in Jedges ()

Gadd_edge(edge[0]edge[1])

for edge in Fedges ()

Gadd_edge(edge[0]+kedge[1]+k)

for node in Fnodes ()

Gadd_node(node+kbipartite=1)

for edge in Hedges(data=True)

Gadd_edge(edge[0]edge[1])

pos=nxspring_layout(G)

top_set=set() botom_set=set()

for i in pos

npos=pos[i]

if Gnode[i][bipartite ]==0pos[i]=[ npos[0]npos[1]+2]

top_setadd(i)

elif Gnode[i][bipartite ]==1pos[i]=[ npos[0]npos[1]-2]

botom_setadd(i)

pltfigure ()

nxdraw(Gpos with_labels=True nodelist=list(top_set)node_color=r)nxdraw(Gpos with_labels=True nodelist=list(botom_set)node_color=b)pltshow()

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 42: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 43: Slides Δικτυακών Υπολογισμών με την Python

2 Βασικοί Υπολογισμοί της ΘεωρίαςΓράφων

Γειτνίαση Κόμβων

Βαθμοί Κόμβων

Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

Ραβδογράμματα Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

Ιστογράμματα Κατανομής Βαθμών Κόμβων Μεγάλων Γράφων

Συνδεσιμότητα

Συνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Ισχυρώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ασθενώς Συνδεδεμένες Συνιστώσες Κατευθυνόμενων Γράφων

Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

∆ισυνδεδεμένες Συνιστώσες Μη Κατευθυνόμενων Γράφων

Κλίκες Κόμβων

Αλγόριθμοι BFS DFS και Dijkstra

Αποστάσεις Κόμβων

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 44: Slides Δικτυακών Υπολογισμών με την Python

Γειτνίαση Κόμβων

1 Γειτνίαση Κόμβων σε Μη ΚατευθυνόμενουςΓράφους´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολοτων κόμβων το σύνολο των ακμών και τους γείτονεςτου κόμβου i του G

Gnodes()

Gedges()

Gneighbors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι έναςσυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος τωνκόμβων του G) με στοιχεία 0 ή 1 υπολογίζεται καιτυπώνεται από τις εξής εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 45: Slides Δικτυακών Υπολογισμών με την Python

Για παράδειγμα για τον τυχαίο γράφο ErdosndashRenyi

G =nxerdos_renyi_graph(1005)

βρίσκουμε τα εξής σύνολα κόμβων ακμών γειτόνων τουκόμβου 4 και πίνακα γειτνίασης του γράφου(αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 9) (0 5) (0 6) (0 7) (1 2) (1 4) (1 5) (1 7) (1 8)

(1 9) (2 8) (2 9) (2 7) (3 8) (3 9) (3 5) (3 6) (3 7)

(4 8) (4 5) (5 6) (5 7) (5 8) (6 7) (7 9) (8 9)]

[8 1 5]

[[0 1 1 0 0 0 0 1 0 1]

[1 0 0 1 0 1 0 0 0 0]

[1 0 0 0 1 1 1 0 0 0]

[0 1 0 0 0 0 0 0 1 0]

[0 0 1 0 0 1 1 0 1 0]

[0 1 1 0 1 0 0 1 1 0]

[0 0 1 0 1 0 0 0 1 0]

[1 0 0 0 0 1 0 0 0 1]

[0 0 0 1 1 1 1 0 0 0]

[1 0 0 0 0 0 0 1 0 0]]

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 46: Slides Δικτυακών Υπολογισμών με την Python

Ο σχεδιασμός του γράφου μπορεί να γίνει με τιςεντολές

pltfigure ()

nxdraw(G with_labels=True node_color=galpha=05)pltshow()

Επιπλέον για τον πίνακα γειτνίασης μπορούμε νασχεδιάσουμε το καλούμενο spy plot με τον εξής τρόπο

adjacency_matrix = nxto_numpy_matrix(G)

fig = pltfigure(figsize =(5 5))

pltimshow(adjacency_matrix cmap=Greysinterpolation=none)

pltshow()

Τα σχέδια του γράφου και του spy plot του πίνακαγειτνίασής του βρίσκονται στην επόμενη διαφάνεια

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 47: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 48: Slides Δικτυακών Υπολογισμών με την Python

2 Γειτνίαση Κόμβων σε Κατευθυνόμενους Γράφους

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Οι παρακάτω εντολές δίνουν αντιστοίχως το σύνολο των κόμβων τοσύνολο των ακμών τους εξερχόμενους γείτονες του κόμβου i προς τουςοποίους κατευθύνονται οι ακμές που αρχίζουν από τον i και τουςεισερχόμενους γείτονες του κόμβου i από τους οποίους αρχίζουν οιακμές που κατευθύνονται στον i

Gnodes()

Gedges()

Gneighbors(i)

Gpredecessors(i)

Ο πίνακας γειτνίασης A του γράφου G που είναι τώρας ένας μησυμμετρικός πίνακας ntimes n (όπου n είναι το πλήθος των κόμβων του G)με στοιχεία 0 ή 1 υπολογίζεται και τυπώνεται από τις ίδιες εντολές

A = nxadjacency_matrix(G)

print(Atodense ())

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 49: Slides Δικτυακών Υπολογισμών με την Python

Για παράδειγμα για τον κατευθυνόμενο τυχαίο γράφο ErdosndashRenyi

G = nxerdos_renyi_graph(1005directed=True)

βρίσκουμε τα εξής σύνολα κόμβων ακμών εξερχόμενων γειτόνων τουκόμβου 4 εισερχόμενων γειτόνων του κόμβου 4 και πίνακα γειτνίασηςτου γράφου (αντιστοίχως)

[0 1 2 3 4 5 6 7 8 9]

[(0 8) (0 1) (0 6) (0 7) (1 8) (1 9) (1 3) (1 5) (1 6)

(2 0) (2 3) (2 4) (2 5) (2 6) (2 7) (2 8) (2 9) (3 0)

(3 1) (3 2) (3 4) (3 8) (3 9) (4 8) (4 1) (4 2) (4 6)

(4 7) (5 0) (5 1) (5 2) (5 3) (5 9) (6 2) (6 4) (6 5)

(7 0) (7 1) (7 2) (7 3) (7 5) (7 8) (7 9) (8 0) (8 1)

(8 2) (8 3) (8 6) (8 9) (9 8) (9 5) (9 6) (9 7)]

[8 1 2 6 7]

[2 3 6]

[[0 1 0 0 0 0 1 1 1 0]

[0 0 0 1 0 1 1 0 1 1]

[1 0 0 1 1 1 1 1 1 1]

[1 1 1 0 1 0 0 0 1 1]

[0 1 1 0 0 0 1 1 1 0]

[1 1 1 1 0 0 0 0 0 1]

[0 0 1 0 1 1 0 0 0 0]

[1 1 1 1 0 1 0 0 1 1]

[1 1 1 1 0 0 1 0 0 1]

[0 0 0 0 0 1 1 1 1 0]]

Στην επόμενη διαφάνεια βλέπουμε τον σχεδιασμό του γράφου αυτούκαι το spy plot του πίνακα γειτνίασής του που έγιναν με τις ίδιεςεντολές σχεδιασμού που δόθηκαν για την περίπτωση των μηκατευθυνόμενων γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 50: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 51: Slides Δικτυακών Υπολογισμών με την Python

Βαθμοί Κόμβων

1 Βαθμοί Κόμβων Μη Κατευθυνόμενων Γράφων

´Εστω ότι έχουμε έναν μη κατευθυνόμενο (απλό) γράφοG

Ο βαθμός του κόμβου i του G ορίζεται ως το πλήθοςτων γειτόνων του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τον βαθμότου κόμβου i και το σύνολοndashλεξικό των βαθμών όλωντων κόμβων του G

Gdegree(i)

Gdegree () the same as nxdegree(G)

Το διάγραμμα του μη κατευθυνόμενου γράφου τουπροηγούμενου παραδείγματος σχεδιάζεται στην επόμενηδιαφάνεια έτσι ώστε να φαίνεται ο κόμβος i οι γείτονέςτου κι ο βαθμός του i (εδώ i = 4)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 52: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 53: Slides Δικτυακών Υπολογισμών με την Python

2 Βαθμοί Κόμβων Κατευθυνόμενων Γράφων

´Εστω τώρα ότι έχουμε έναν κατευθυνόμενο γράφο G

Ο εξερχόμενος βαθμός (outndashdegree) του κόμβου i του Gορίζεται ως το πλήθος των εξερχόμενων γειτόνων του iκαι ο εισερχόμενος βαθμός (inndashdegree) του κόμβου i τουG ορίζεται ως το πλήθος των εισερχόμενων γειτόνωντου i Ο ολικός βαθμός (total degree) του i ορίζεται ωςτο άθροισμα του εξερχόμενου και του εισερχόμενουβαθμού του i

Οι παρακάτω εντολές δίνουν αντιστοίχως τονεξερχόμενο εισερχόμενο ολικό βαθμό του κόμβου i καιτα σύνολαndashλεξικά των αντίστοιχων βαθμών όλων τωνκόμβων του G

Gout_degree(i) the same as len(G neighbors(i))

Gin_degree(i) the same as len(G predecessors (i))

Gdegree () the same as nxdegree(G) = G out_degree (i) + G in_degree(i)

Στην επόμενη διαφάνεια φαίνονται οι βαθμοί ενός κόμβου για τοπαράδειγμά μας

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 54: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 55: Slides Δικτυακών Υπολογισμών με την Python

3 Ραβδογράμματα Βαθμών Κόμβων Γράφων

´Ενα ραβδόγραμμα βαθμών κόμβων είναι απλώς ηγραφική παράσταση της μεταβολής των διατεταγμένωνσε φθίνουσα σειρά βαθμών των κόμβων ενός γράφου οιοποίοι κόμβοι παρατίθενται με την αντίστοιχη (προςτους βαθμούς) σειρά στον άξονα x

Για έναν μη κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την παραγωγή και τονσχεδιασμό του ραβδογράμματος αυτού

deg=Gdegree ()

deg_dic=dict()

for nd in deg

if deg[nd] not in deg_dic

deg_dic[deg[nd]]=[nd]

else

deg_dic[deg[nd]] append(nd)

deg_lis =[]

nd_lis =[]

for de in sorted(deg_dickeys()reverse=True)

for nn in deg_dic[de]

deg_lisappend(de)

nd_lisappend(nn)

index = nparange(len(nd_lis ))

bar_width = 1

pltbar(index deg_lis bar_width color=g)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 56: Slides Δικτυακών Υπολογισμών με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςραβδογράμματος βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ραβδόγραμματων εξερχόμενων βαθμών κόμβων και αφετέρου το ραβδόγραμμα τωνεισερχόμενων βαθμών κόμβων Οι τροποποιήσεις του προηγούμενουκώδικα για ραβδογράμματα μη κατευθυνόμενων γράφων είναιπροφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ραβδογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 57: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 58: Slides Δικτυακών Υπολογισμών με την Python

4 Ιστογράμματα Κατανομής Βαθμών Κόμβων Γράφων

´Ενα ιστόγραμμα κατανομής βαθμών κόμβων είναιη γραφική παράσταση της μεταβολής του πλήθουςτων κόμβων ενός γράφου στον άξονα y που εχουνκάποιο βαθμό (σε αύξουσα σειρά) στον άξονα x

Το ιστόγραμμα κατανομής βαθμών κόμβων ενός μηκατευθυνόμενου γράφου G σχεδιάζεται με την εξήςεντολή

hist(degvalues()bins=len(set(Gdegree () values ())))

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 59: Slides Δικτυακών Υπολογισμών με την Python

Στο σχήμα που ακολουθεί βλέπουμε ένα παράδειγμα ενόςιστογράμματος κατανομής βαθμών ενός μη κατευθυνόμενου γράφου

´Οταν ο γράφος είναι κατευθυνόμενος έχουμε αφενός το ιστόγραμμακατανομής των εξερχόμενων βαθμών κόμβων και αφετέρου τοιστόγραμμα κατανομής των εισερχόμενων βαθμών κόμβων Οιτροποποιήσεις του προηγούμενου κώδικα για ραβδογράμματα μηκατευθυνόμενων γράφων είναι προφανείς

Στην επόμενη διαφάνεια ακολουθούν παραδείγματα ιστογραμμάτωνεξερχόμενων και εισερχόμενων βαθμών ενός κατευθυνόμενου γράφου

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 60: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 61: Slides Δικτυακών Υπολογισμών με την Python

Επιπλέον για έναν κατευθυνόμενο γράφο μπορούμε νασχεδιάσουμε το δυσδιάστατο ιστόγραμμα της κοινήςκατανομής των εξερχόμενων και των εισερχόμενωνβαθμών κόμβωνΓια το προηγούμενο παράδειγμα παίρνουμε το εξήςδυσδιάστατο ιστόγραμμα (μέσω του κώδικα που δίνεταιστο μάθημα)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 62: Slides Δικτυακών Υπολογισμών με την Python

5 Ιστογράμματα Κατανομής Βαθμών Κόμβων ΜεγάλωνΓράφων

Τυπικά οι τυχαίοι μεγάλοι γράφοι EdosndashRenyiτείνουν να ακολουθούν την διωνυμική κατανομήόπως φαίνεται στην επόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο EdosndashRenyi 5000κόμβων με πιθανότητα 025 πρώτα σε δεκαδικέςκαι μετά σε λογαριθμικές κλίμακες

Στην περίπτωση όμως των ονομαζόμενων τυχαίωνγράφων ανεξαρτήτων κλίμακας (scalendashfree graphs)οι γράφοι αυτοί τείνουν να ακολουθούν τηνκατανομή του νόμου δύναμης (power law distribution)όπως φαίνεται στην μεθεπόμενη διαφάνεια για έναντυχαίο (μη κατευθυνόμενο) γράφο Barabasi-Albert5000 κόμβων με m = 3 πρώτα σε δεκαδικές καιμετά σε λογαριθμικές κλίμακες

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 63: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 64: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 65: Slides Δικτυακών Υπολογισμών με την Python

Συνδεσιμότητα

1 Συνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος λέγεταισυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή (path) που τις ενώνει ∆ιαφορετικά ογράφος λέγεται μη συνδεδεμένοςΑν ένας (μη κατευθυνόμενος) γράφος δεν είναισυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) συνδεδεμένες συνιστώσες Μια συνδεδεμένησυνιστώσα είναι ένας μέγιστος συνδεδεμένοςυπογράφος του γράφου αυτού

Η μεγαλύτερη συνδεδεμένη συνιστώσα συνήθωςονομάζεται γιγαντιαία συνδεδεμένη συνιστώσα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 66: Slides Δικτυακών Υπολογισμών με την Python

Για έναν μη κατευθυνόμενο γράφο Gχρησιμοποιούμε τις παρακάτω εντολές για τηνδιερεύνηση της συνδεσιμότητάς του (λεπτομέρειεςγια το πώς χρησιμοποιούντοι οι εντολές αυτέςδίνονται στο σκριπτ connectednesspy)

nxis_connected(G)

nxnumber_connected_components(G)

nxconnected_components(G)

connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη συνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 5συνδεδεμένες συνιστώσες (μεταξύ των οποίων οι 2είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 67: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 68: Slides Δικτυακών Υπολογισμών με την Python

2 Ισχυρώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ισχυρώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια κατευθυνόμενη διαδρομή που τις ενώνει μέσωμιας αλυσίδας κατευθυνόμενων ακμών οι οποίεςέχουν την ίδια φορά κατευθύνσεων

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ισχυρώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ισχυρώς συνδεδεμένες συνιστώσες Μιαισχυρώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςισχυρώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 69: Slides Δικτυακών Υπολογισμών με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςισχυρής συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_strongly_connected(G)

nxnumber_strongly_connected_components(G)

nxstrongly_connected_components(G)

strongly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ισχυρώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με3 ισχυρώς συνδεδεμένες συνιστώσες (και χωρίςαπομονωμένους κόμβους)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 70: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 71: Slides Δικτυακών Υπολογισμών με την Python

∆οθέντος ενός μη ισχυρώς συνδεδεμένουκατευθυνόμενου γράφου G μπορούμε νακατασκευάσουμε έναν γράφο S που ονομάζεταισυμπυκνωμένος γράφος ή γράφος τηςσυμπύκνωσης του G οι κόμβοι του οποίου είναι οιισχυρώς συνδεδεμένες συνιστώσες του G και οιακμές μεταξύ των κόμβων του S αντιστοιχούν στιςακμές του G

Ο συμπυκνωμένος γράφος S είναι προφανώς έναςακυκλικός κατευθυνόμενος γράφος

Στην επόμενη διαφάνεια βλέπουμε έναν μη ισχυρώςσυνδεδεμένο (κατευθυνόμενο) τυχαίο γράφο και τοναντίστοιχο συμπυκνωμένο γράφο Ο γράφος αυτόςέχει 2 ισχυρώς συνεδεδεμένες συνιστώσες με 3κόμβους 3 με 2 κόμβους και 8 με 1 κόμβο

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 72: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 73: Slides Δικτυακών Υπολογισμών με την Python

3 Ασθενώς Συνδεδεμένες Συνιστώσες ΚατευθυνόμενωνΓράφων

´Ενας κατευθυνόμενος γράφος λέγεται ασθενώςσυνδεδεμένος αν για κάθε δυο κορυφές του υπάρχειμια διαδρομή που τις ενώνει μέσω μιας αλυσίδαςακμών οι οποίες όμως δεν χρειάζεται να έχουν τηνίδια φορά κατευθύνσεων

Με άλλα λόγια η ασθενής συνδεσιμότητα ενόςκατευθυνόμενου γράφου ισοδυναμεί μεσυνδεσιμότητα όταν δεν λαμβάνεται υπόψη ηκατεύθυνση των ακμών

Αν ένας (κατευθυνόμενος) γράφος δεν είναι ασθενώςσυνδεδεμένος τότε περιέχει κάποιες (τουλάχιστονδυο) ασθενώς συνδεδεμένες συνιστώσες Μιαασθενώς συνδεδεμένη συνιστώσα είναι ένας μέγιστοςασθενώς συνδεδεμένος υπογράφος του γράφουαυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 74: Slides Δικτυακών Υπολογισμών με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςασθενούς συνδεσιμότητάς του (λεπτομέρειες για τοπώς χρησιμοποιούντοι οι εντολές αυτές δίνονταιστο σκριπτ connectednesspy)

nxis_weakly_connected(G)

nxnumber_weakly_connected_components(G)

nxweakly_connected_components(G)

weakly_connected_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός μη ασθενώςσυνδεδεμένου (κατευθυνόμενου) τυχαίου γράφου με7 ασθενώς συνδεδεμένες συνιστώσες (μεταξύ τωνοποίων οι 2 είναι απομονωμένοι κόμβοι)

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 75: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 76: Slides Δικτυακών Υπολογισμών με την Python

4 Ελκυστικές Συνιστώσες Κατευθυνόμενων Γράφων

Σε έναν κατευθυνόμενο γράφο μια ισχυρώς συνδεδεμένησυνιστώσα ονομάζεται ελκυστική ή ελκύουσασυνιστώσα αν κάθε κατευθυνόμενη διαδρομή πουεισέρχεται μέσα σε αυτήν την συνιστώσα ποτέ δενβγαίνει έξω από αυτήν

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμε τιςπαρακάτω εντολές για την διερεύνηση των ελκυστικώνσυνιστωσώνς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στο σκριπτconnectednesspy)

nxis_attracting_component(G)

nxnumber_attracting_components(G)

nxattracting_components(G)

nxattracting_component_subgraphs(G)

Ακολουθεί ένα παράδειγμα ενός (κατευθυνόμενου)τυχαίου γράφου με 2 ελκυστικές συνιστώσες όπουσχεδιάζεται και ο αντίστοιχος συμπυκνωμένος γράφος

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 77: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 78: Slides Δικτυακών Υπολογισμών με την Python

5 ∆ισυνδεδεμένες Συνιστώσες Μη ΚατευθυνόμενωνΓράφων

´Ενας μη κατευθυνόμενος γράφος ονομάζεταιδισυνδεδεμένος (bicoonected) αν δεν αποσυνδέεται μετην αποκοπή οποιουδήποτε κόμβου του

Σε έναν μη κατευθυνόμενο γράφο ένας μέγιστοςυπογράφος που είναι τέτοιος ώστε να μηναποσυνδέεται με την αποκοπή οποιουδήποτεκόμβου του υπογράφου αυτού ονομάζεταιδισυνδεδεμένη συνιστώσα του γράφου

´Ενας κόμβος ενός μη δισυνδεδεμένου γράφουαποτελεί ένα σημείο διάρθρωσης (articulation point) ήκορυφή αποκοπής (cut vertex) αν και μόνον αν οκόμβος αυτός ανήκει σε τουλάχιστον δυοδισυνδεδεμένες συνιστώσες του γράφου αυτού

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 79: Slides Δικτυακών Υπολογισμών με την Python

Για έναν κατευθυνόμενο γράφο G χρησιμοποιούμετις παρακάτω εντολές για την διερεύνηση τηςδισυνδεσιμότητάς του (λεπτομέρειες για το πώςχρησιμοποιούντοι οι εντολές αυτές δίνονται στοσκριπτ connectednesspy)

nxis_biconnected(G)

nxbiconnected_component_subgraphs(G)

nxbiconnected_component_edges(G)

nxarticulation_points(G)

Ακολουθεί ένα παράδειγμα ενός μη δισυνδεδεμένου(μη κατευθυνόμενου) τυχαίου γράφου με 6δισυνδεδεμένες συνιστώσες και 5 σημείαδιάρθρωσης

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 80: Slides Δικτυακών Υπολογισμών με την Python

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 81: Slides Δικτυακών Υπολογισμών με την Python

Κλίκες Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 82: Slides Δικτυακών Υπολογισμών με την Python

Αλγόριθμοι BFS DFS και Dijkstra

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 83: Slides Δικτυακών Υπολογισμών με την Python

Αποστάσεις Κόμβων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 84: Slides Δικτυακών Υπολογισμών με την Python

Υπογράφοι και Ισομορφισμοί Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 85: Slides Δικτυακών Υπολογισμών με την Python

3 ∆ικτυακά Μέτρα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 86: Slides Δικτυακών Υπολογισμών με την Python

4 ∆ιαμερισμοί Γράφωνν

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 87: Slides Δικτυακών Υπολογισμών με την Python

5 Ταξινομησιμότητα ndash Αναμειξιμότητα

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 88: Slides Δικτυακών Υπολογισμών με την Python

6 Εκθετικά Μοντέλα Τυχαίων Γράφων

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python

Page 89: Slides Δικτυακών Υπολογισμών με την Python

7 Χρονικώς Μεταβαλλόμενοι Γράφοι

Μωυσής Α Μπουντουρίδης ∆ικτυακοί Υπολογισμοί με την Python