SlideShare ist ein Scribd-Unternehmen logo
1 von 97
Downloaden Sie, um offline zu lesen
Un plugin python di QGIS per il trattamento dei
gra
Giuliano Curti (giulianc51 at gmail dot com)
A mio padre Gaetano
Rev. 0.01
Indice
Cronologia 4
Avvertenza 5
Capitolo 1. Prefazione 6
1.1. Cos'è un grafo? 6
1.2. Cos'è questo plugin? 7
1.3. L'Interfaccia Graca 8
1.4. Bibliography 14
Capitolo 2. Ambiente Educativo / Ricreativo 15
2.1. Supporto Graco 15
2.2. Suggerimenti 26
2.3. Vertici 28
2.4. Lati 32
2.5. Sottogra 34
2.6. Alberi (Trees) 35
2.7. Percorsi e Cicli 52
2.8. Connectività 62
2.9. Shortest Paths 73
2.10. Rapida Introduzione ai Gra orientati ed alle Reti 77
2.11. Riepilogo Informativo 78
Capitolo 3. Ambiente Analitico 79
3.1. Cutpoint 81
3.2. Bridge 83
3.3. Minimum Spanning Tree 85
3.4. Shortest Paths 86
3.5. Vertex Disjoint Paths 88
3.6. Edge Disjoint Paths 91
3.7. Connettività 94
Capitolo 4. Conclusioni 97
3
CRONOLOGIA 4
Cronologia
date issue
2016-09-19 Impianto
2016-09-22 Visualizzazione pesi dei lati
2016-09-23 Edge-connectivity del grafo stradale di Melegnano
2016-09-23 Chiusura rev. 0.01-ita
AVVERTENZA 5
Avvertenza
(1) Ho scritto queste note come un aiuto al mio studio ed alla comprensione
della Teoria dei Gra. Esse riettono lo stato della mia attuale conoscenza
sull'argomento, pertanto vi prego di scusare ogni imperfezione ed errore
contenuto nello scritto.
(2) Queste note riettono il mio approccio alla Teoria dei Gra, pertanto non
devono intendersi in alcun modo critiche, competizioni o sostituzioni di
altri lavori sullo stesso argomento.
(3) Condivido queste note nella speranza che possano essere di aiuto ad altri
studenti della Teoria dei Gra.
(4) Ogni commento, suggerimento, contributo o critica sono ben accetti.
(5) Assumo ogni responsabilità per i contenuti di questo scritto, ma in ogni
caso nessuna garanzia, implicita e/o esplicita, è connessa con il suo uso;
il lettore assume i contenuti a proprio rischio e responsabilità.
(6) Come ormai a tutti noto, molti termini inglesi sono diventati di uso co-
mune pertanto eviterò di farne scempio con improbabili traduzioni, quindi
lascerò intatti termini come mouse, layer, shapefile, python, tree,
cycle, console, ecc.; nei casi più ostili il ricorso alla rete risolverà ogni
vostro dubbio.
(7) Questo documento è rilasciato sotto la licenza CC by SA NC.
CAPITOLO 1
Prefazione
1.1. Cos'è un grafo?
Un Grafo è una struttura molto elementare: un insieme di Punti (d'ora
in avanti chiamati Vertici) ed un insieme di Linee (d'ora in avanti chiamate
Lati) che collegano una coppia di vertici; matematicamente un grafo è denito
dal simbolo G (V, E) dove V è l'insieme dei vertici e E = V 2
l'insieme dei lati.
Non approfondiamo i dettagli dei gra, alcuni di essi verranno spiegati nei capitoli
successivi: limitiamo la nostra analisi ai gra semplici; inoltre ci limitiamo ai gra
connessi, quelli cioè in cui tutti i vertici sono collegate in qualche modo al resto del
grafo (il lettore curioso può riferirsi ai testi indicati nella bibliograa per maggiori
informazioni).
Quello della gura è un grafo, in realtà si tratta di un tree (Albero), dotato
di
• vertici V = {B, C, G, N, S, T, Y, W}
• lati E = {(B, T) , (T, N) , (C, Y ) , (Y, W) , (G, W) , (W, N) , (N, S)}.
Quello che è interessante notare è che i gra sono independenti dalla posizione,
dimensione, distanze, ecc., l'unica cosa importante è se il vertice u è connesso o
meno con il vertice v, per tutti i vertici u, v ∈ V .
6
1.2. COS'È QUESTO PLUGIN? 7
1.2. Cos'è questo plugin?
Come alcuni di voi sapranno, QGIS (un applicativo free  open source per la
cartograa numerica) è dotato di una libreria per l'Analisi delle Reti che imple-
menta alcuni strumenti, l'algoritmo di Dijkstra principalmente; recentemente molti
contributori hanno aggiunto altri plugin con lo stesso obbiettivo, quindi è lecito
chiedersi: perchè un nuovo plugin per i gra?
Come ho detto nelle Avvertenze, questo plugin è principalmente inteso
come un aiuto per l'apprendimento della Teoria dei Gra. Il mio orizzonte
attuale non è l'analisi delle prestazioni globali di una rete o di un grafo orientato, e
nemmeno quello di scrivere una potente libreria: questi compiti sono meglio assolti
da parecchi strumenti, all'interno ed all'esterno del mondo QGIS, disponibili agli
utenti; il mio riferimento attuale è di consentire all'utente (il sottoscritto per primo)
di imparare le proprietà basilari dei gra: paths, cycles, spanning trees, connectivity,
ecc. Spero di riuscire a sviluppare il mio plugin per compiti maggiori nel futuro,
ma ora il mio obiettivo è quello che ho appena raccontato.
Tutti gli algoritmi implementati nel plugin sono sicamente scritti all'interno
del suo codic, senza uso di alcuna libreria esterna; ovviamente questo rende il
plugin prono a bachi ed errori, ma penso anche molto più interessante per scopi
educativi. In generale gli algoritmi derivano dalla letteratura tecnica, in particolar
modo dai testi citati nella bibliograa del prossimo paragrafo, tuttavia la necessità
di alcuni strumenti di analisi di connectività, normalmente presi da una parte più
avanzata della teoria (gra orientati), mi ha obbligato a scrivere alcuni algoritmi dal
nulla; ovviamente devono essere validati e sono a disposizione di chiunque volesse
esaminarli.
Nello scrivere queste note ho avuto in mente due situazioni:
1) un ambiente educativo e/o ricreativo
2) un ambiente più serio, analitico;
la prima parte di questa note è centrata sul primo punto; proverò, nella seconda
parte, un utilizzo più impegnativo per studiare situazioni più interessanti.
Il plugin può trattare un grafo alla volta e non può passare da un grafo all'altra;
un lavoro chiuso deve essere riaperto per essere trattato.
1.3. L'INTERFACCIA GRAFICA 8
1.3. L'Interfaccia Graca
Il plugin è controllato attraverso un pannello di controllo; questo è organizzato
in dierenti tabs (questo è una nuova caratteristica, peraltro in continua evoluzione,
pertanto nelle gure seguenti potranno apparire versioni del pannello dierenti e
non aggiornate).
(1) I/O
1.3. L'INTERFACCIA GRAFICA 9
(2) Proprietà del grafo:
1.3. L'INTERFACCIA GRAFICA 10
(3) Interrogazione dei Vertici e dei Lati:
1.3. L'INTERFACCIA GRAFICA 11
(4) Alberi e Cicli:
1.3. L'INTERFACCIA GRAFICA 12
(5) Connettività:
1.3. L'INTERFACCIA GRAFICA 13
(6) Percorsi:
1.4. BIBLIOGRAPHY 14
1.4. Bibliography
I gra sono un argomento arontato in molti settori della Matematica, per cui
è frequente incontrare utili documenti in aree come la Programmazione Lineare e
l'Ottimizzazione, l'Ingegneria del Software, l'Analisi delle Reti e cosi via.
Io ho mosso i miei primi passi sui testi che seguono; essi consentono un approccio
timido come il mio, ma possono orire argomenti stuzzicanti al lettore, quindi
possono costituire una guida completa allo studio dei gra:
(1) J.A.Bondy, U.S.R.Murty, Graph Theory, Springer, 2008
(2) Frank Harary, Graph Theory, Addison Wesley, 1969
CAPITOLO 2
Ambiente Educativo / Ricreativo
2.1. Supporto Graco
Come detto in precedenza un grafo non è determinato dalle sue dimensioni,
forme, distanze, ecc. tuttavia il suo schizzo è molto utile: consente al lettore di
conoscere immediatamente il grafo.
Questo fatto costituisce la prima utile relazione con QGIS: QGIS come supporto
per la visualizzazione del grafo.
Questa è in realtà la modalità più semplice, una interazione più intelligente fra
QGIS e graph4qgis sarà presentata in seguito.
Ci sono tre modalità per aprire un le con il plugin graphs4qgis, questi i
rispettivi schemi di funzionamento:
(1) caricamento di un le Graph
(a) se il plugin trova uno shapele dei vertici collegato al grafo lo carica
previa conferma dell'utente
(b) altrimenti crea automaticamente una geometria dei vertici e genera
il relativo shapele
(c) crea lo shapele dei lati
(2) caricamento di uno Shapefile dei lati
(a) crea la struttura del grafo
(b) crea lo shapele dei vertici
(3) caricamento di un le CSV (analogo al caricamento di uno shapele)
(4) creazione di un layer a mano libera
(5) ci sarebbe una quinta modalità di caricare le TXT ma non la discutiamo
quì.
15
2.1. SUPPORTO GRAFICO 16
2.1.1. Caricamento di un le Graph. Questa è la modalità standard:
l'utente carica un le Graph:
2.1. SUPPORTO GRAFICO 17
il sistema riconosce se ci sono shapele collegati al grafo aperto; in caso aer-
mativo il sistema ore all'utente la possibilità di caricarlo:
2.1. SUPPORTO GRAFICO 18
alla risposta aermativa dell'utente il sistema carica lo shapele, altrimenti crea
automaticamente e carica a video i layer dei vertici e dei lati (NB: il layer dei lati ed
il layer dei vertici quando creato automaticamente risiedono in memoria, pertanto
se necessario occorre salvarli):
Questa è la rappresentazione grezza di un grafo pubblicato sul testo di Frank
Harary.
2.1. SUPPORTO GRAFICO 19
L'utente può modicare la disposizione dei vertice con gli strumenti usuali di
QGIS come sotto rappresentato
2.1. SUPPORTO GRAFICO 20
Premendo il tasto update SHP ricostruiamo lo schema come rappresentato
dall'Autore in Graph Theory, Addison Wesley, 1969, g. 5.1, pag. 44:
2.1. SUPPORTO GRAFICO 21
2.1.2. Caricamento di uno Shapele. La seconda modalità consente all'u-
tente di caricare un le SHP, più esattamente un le vettoriale di tipo linestring:
caricato lo shapele, il sistema costruisce automaticamente la struttura del
Grafo; provvede inoltre a creare ed a caricare a video il layer dei vertici.
2.1. SUPPORTO GRAFICO 22
2.1.3. Caricamento di un le CSV. L'utente può partire da un le di testo
come il seguente:
per l'inserimento dei lati; il le contiene una linea per ogni lato del grafo di cui
fornisce la geometria degli estremi;
2.1. SUPPORTO GRAFICO 23
l'Utente può caricarlo con i comandi usuali di QGIS e questo è il risultato:
in realtà il le CSV carica un layer vettoriale nello spazio video di QGIS, quindi
l'utente segue la procedura descritta al paragrafo Ÿ2.1.2.
2.1. SUPPORTO GRAFICO 24
2.1.4. A mano libera. Come ultima risorsa potete usare i potenti strumenti
di QGIS per disegnare un layer vettoriale; in tal caso vanno osservate queste regole:
(1) create un layer vettoriale di tipo LineString
(2) inserite le linee (lati) del grafo (avendo cura di far coincidere le estremità
condivise settando opportunamente la funzione di snapping di QGIS)
(3) i vertici del grafo saranno le estremità delle linee (lati)
(4) le eventuali intersezioni fra le linee non saranno considerate (tecnicamente
si dice che sono ammessi gra non-piani); è vostra responsabilità spezzare
le linee nel caso vogliate utilizzare le intersezioni.
Fatto questo, dovete seguire la procedura descritta al paragrafo Ÿ2.1.2; questo è un
esampio:
2.1. SUPPORTO GRAFICO 25
.. e questo il grafo nale:
2.2. SUGGERIMENTI 26
2.2. Suggerimenti
2.2.1. Python Console. É probabilmente buona cosa tenere aperta la con-
sole Python di QGIS per vedere eventuali messaggi del sistema:
2.2. SUGGERIMENTI 27
2.2.2. Capacità di modica di QGIS. Una opzione molto potente è oerta
dalle potenzialità di QGIS: gli elementi evidenziati a video, come vedremo fra poco,
possono essere copiati con il comando standard di QGIS
e duplicati in un layer vettoriale dierente, per usi futuri
2.3. VERTICI 28
2.3. Vertici
2.3.1. Lista dei Vertici. Il plugin consente di elencare a video la lista di tutti
i vertici:
Il numero totale dei vertici è normalmente denominato n.
2.3. VERTICI 29
2.3.2. Coordinate dei Vertici. ... lo stesso per l'elenco delle coordinate
cartesiane dei vertici:
2.3. VERTICI 30
2.3.3. Grado dei Vertici. ... ed anche per l'elenco dei gradi dei vertici:
2.3. VERTICI 31
2.3.4. Interrogazione dei Vertici. L'utene può interrogare il singolo ver-
tice selezionandolo nella casella a discesa; del vertice selezionato sono riportate le
coordinate cartesiane, il grado, i vertici adiacenti, i lati incidenti e se il
vertice costituisce un cutpoint:
2.4. LATI 32
2.4. Lati
2.4.1. Lista dei Lati. L'utente può ottenere l'elenco di tutti i lati del grafo:
Il numero totale dei lati è normalmente denominato m.
2.4. LATI 33
2.4.2. Interrogazione dei Lati. .. oppure può interrogare il singolo lato
ottenendo i vertici di estremità, il peso, se il lato è un bridge, ecc.
2.5. SOTTOGRAFI 34
2.5. Sottogra
2.5.1. Sottogra. Dato il grafo G = {VG, EG}, il grafo H = {VH, EH} tale
che vH ⊆ VG e EH ⊆ EG è detto sottografo di G.
2.5.2. Sottogra Indotti. (da fare)
2.6. ALBERI (TREES) 35
2.6. Alberi (Trees)
Tipi particolari di sottogra di G sono gli Alberi (trees) T = {VT , ET }; la
loro caratteristica è di contenere il numero minimo di lati necessari a connettere
tutti i vertici di cui sono dotati.
Particolarmente importanti sono gli spanning trees che hanno la proprietà
VT = VG, cioè comprendono tutti i vertici del grafo; i lati ET ⊆ EG sono in numero
di n − 1; con ragionamenti elementari l'utente può vericare che questo numero
è necessario per connettere i vertici (un numero minore di lati lascerebbe qualche
vertice sconnesso) e suciente allo scopo (un numero maggiore connetterebbe vertici
già connessi).
Fra i numerosi alberi di G analizziamo i tre più importanti:
(1) Breath First Search (BFS)
(2) Depth First Search (DFS)
(3) Minimum Spanning Tree (MST);
più tardi vedremo l'importanza di questi alberi nell'analisi dei gra.
Alla ne del capitolo introdurremo un quarto albero, il Maximum Spanning
Tree, il cui signicato apparirà chiaramente dal nome.
2.6. ALBERI (TREES) 36
2.6.1. Breath First Search. Abbiamo già notato che in un albero ogni cop-
pia di vertici è connessa, quindi possiamo denire una vertice base, detto radice,
e navigare l'albero dalla radice no a raggiungere tutti gli altri vertici; questa nav-
igazione può essere fatta in diversi modi, una è la Breath First Search; in
questo modo partiamo dalla radice (livello 1) e congiungiamo tutti i vertici adia-
centi (livello 2), da quì raggiungiamo i vertici adiacenti ai precedenti (livello 3) e
cosi via; questo è molto simile all'organizzazione del sistema di le di un computer,
dove abbiamo la radice, un livello sotto le cartelle e i le, un livello ancora sotto
abbiamo altre cartelle e le e così via; un altro esempio familiare può essere l'albero
genealogico dove i livelli sono rappresentati dalle generazioni.
Questo è un esempio di BFS con la radice nel vertice v1:
i lati dell'albero BFS sono evidenziati in colore rosso;
2.6. ALBERI (TREES) 37
questo è un ingrandimento della tabella visualizzata nella console python di
QGIS:
dove possiamo vedere
(1) il predecessore
(2) il livello
(3) l'ordine cronologico
dei vertici attraversati dal BSF
2.6. ALBERI (TREES) 38
o, se preferite, direttamente a schermo:
..
2.6. ALBERI (TREES) 39
2.6.2. Depth First Search. Probabilmente l'utente può pensare al BFS
come ad una straticazione del grafo ed alla sua analisi strato per strato; possi-
amo però immaginare di attraversare il nostro grafo in modo dierente, ad esempio
navigando in profondità dalla radice attraverso il primo vertice incontrato ed anco-
ra più giù; raggiunto il punto più basso si riprende dal primo vertice disponibile e
così via: questa modalità si chiama Depth First Search; questo ne è un esempio
con la radice posta sempre nel vertice v1:
i lati dell'abero DFS sono sempre evidenziati in colore rosso;
2.6. ALBERI (TREES) 40
questo un ingrandimento della tabella visualizzata nella console python di
QGIS:
dove possiamo vedere:
(1) il predecessore
(2) l'ordine di andata
(3) l'ordine di ritorno
dei vertici attraversati dal DSF.
2.6. ALBERI (TREES) 41
Questo invece un esempio dello stesso grafo con la radice posta nel vertice v4:
quì i lati del DFS sono colorati in giallo;
2.6. ALBERI (TREES) 42
i dettagli sono visualizzati nella tabella che segue:
La stessa cosa può essere ovviamente eseguita con la modalità BFS.
2.6. ALBERI (TREES) 43
2.6.3. Pesi. Prima di passare al terzo ed ultimo tipo di albero dobbiamo in-
trodurre un nuovo concetto: il Peso dei lati. Finora abbiamo considerato i lati
tutti uguali, cioè andare dal vertice A al vertice B era lo stesso che andare dal ver-
tice C al vertice D; in molte situazioni reali dove i gra costituiscono un utilissimo
modello, le cose possono presentarsi diversamente: A può essere più vicino a B che
C con D; in altri casi passare da A a B può essere meno costoso che passare da
C a D, ecc. Pertanto dobbiamo introdurre una proprietà che caratterizzi i lati del
grafo, questa proprietà è il peso (nella letteratura tecnica è detto anche Costo);
selezionando un lato nella casella a discesa, insieme ad altre proprietà già discusse,
abbiamo anche il peso del lato:
(il lato (G, W) ha peso 837).
2.6. ALBERI (TREES) 44
Possiamo ottenere in qualsiasi momento l'elenco dei pesi dei lati del grafo, sia
in forma tabellare:
che in forma graca:
2.6. ALBERI (TREES) 45
2.6. ALBERI (TREES) 46
2.6.4. Minimum Spanning Tree. Ritornando agli alberi, possiamo immag-
inare di costruire l'abero di peso (o costo) minore fra tutti gli altri, questo è il
Minimum Spanning Tree.
Un esempio semplice è il problema di costruire una costosa rete (quì il termine
è usato in senso generico) illustrato da J.A.Bondy, U.S.R.Murty, Graph Theory,
Springer, 2008, Ÿ6.2, g. 6.5, pag. 165 sulla griglia idro-elettrica della Republica
Popolare di Cina.
Due algoritmi sono particolarmente noti per questo calcolo:
(1) l'algoritmo di Jarnik-Prim
(2) l'algoritmo di Boruvka-Kruskal.
L'utente è indirizzato verso la letteratura tecnica per i dettagli; il plugin esegue
entrambi gli algoritmi.
2.6. ALBERI (TREES) 47
2.6.4.1. Algoritmo di Jarnik-Prim. Questo è un esempio dell'algoritmo di Jarnik-
Prim:
con l'elenco dei pesi:
oppure con i pesi sullo sfondo:
2.6. ALBERI (TREES) 48
2.6. ALBERI (TREES) 49
2.6.4.2. Algoritmo di Boruvka-Kruskal. Questo è un esempio dell'algoritmo di
Boruvka-Kruskal:
con l'elenco dei pesi:
Avvertenza: il MST è unico, quindi nessuna sorpresa se i due algoritmi for-
niscono lo stesso risultato, non ci sono altre possibilità. L'esecuzione dei due
algoritmi può essere utile per confrontarne i risultati.
2.6. ALBERI (TREES) 50
2.6.5. Maximum Spanning Tree. É un gioco di simmetria pensare al max-
imum spanning tree: invertendo il segno dei pesi del grafo w → −w l'algoritmo
esegue la ricerca del Maximum Spanning Tree (si potrebbe anche usare l'inverso
w → 1
w , ma la somma degli inversi non è l'inverso della somma, quindi preferiamo
usare gli opposti):
(il MxST è individuato con il colore giallo).
2.6. ALBERI (TREES) 51
2.6.6. Fogliame. Elementi caratteristici di un albero sono le foglie, i vertici
terminali, quelli con grado 1. Ovviamente possono essere presenti anche gra nor-
mali; nonostante siano visibili direttamente, il plugin dispone di un comando per
evidenziare il fogliame, l'insieme dei vertici terminali:
2.7. PERCORSI E CICLI 52
2.7. Percorsi e Cicli
2.7.1. Generalità. Come abbiamo visto la presenza di lati fra i vertici con-
sente di navigare da un punto all'altro; dati due vertici p e q abbiamo diversi modi
di navigare da uno all'altro: ad esempio ripercorrendo alcuni lati oppure ripassando
da alcuni vertici; la navigazione senza ripassare dagli stessi vertici (e quindi senza
ripassare gli stessi lati) è forse la più importante, chiamata Path e denotata con
pPq.
Ripensando ad esempio gli alberi, vediamo che fra ogni coppia di vertici esiste
un percorso; di più, il percorso è unico: questa è un'importante caratteristica degli
alberi.
Però abbiamo visto che l'albero comprende tutti i vertici del grafo, ma non
contiene tutti i lati: qual'è il ruolo di questi lati addizionali? questo è l'argomento
del prossimo paragrafo.
2.7. PERCORSI E CICLI 53
2.7.2. Cotrees. Non cerco di tradurre il temine che indica chiaramente il
complementare di un albero, quindi dato il grafo G = (V, EG) e l'albero coprente
T = (V, ET ), il sottografo complementare C = (V, EC) dove EC = E − ET è il
cotree.
2.7.2.1. BFS cotree. Il cotree dell'albero BFS del paragrafo Ÿ2.6.1 è:
Come si può vedere, l'insieme dei lati del cotree EC = {e3, e5, e7, e10, e11} è
l'insieme complementare dei lati ET = {e0, e1, e2, e4e6, e8, e9} dell'albero.
2.7. PERCORSI E CICLI 54
2.7.2.2. DFS cotree. Possiamo fare la stessa cosa con l'albero DFS:
2.7. PERCORSI E CICLI 55
2.7.3. Cyclomatic number. (Anche in questo caso preferisco non tradurre
il termine) Sappiamo che il numero dei lati di un albero è |ET | = n − 1, pertanto il
numero dei lati di un cotree è |EC| = |E|−|ET | = m−n+1; questo viene chiamato
cyclomatic number ed è visualizzato nel tab proprietà dell'interfaccia graca del
plugin:
vedremo fra poco la ragione del suo nome.
2.7. PERCORSI E CICLI 56
2.7.4. Cicli. In un albero abbiamo un unico percorso fra due vertici; se ag-
giungiamo un lato del cotree (quì di seguito abbiamo usato un albero BFS e il suo
cotree) abbiamo un circuito; il lato e3 del cotree unisce i vertici v2, v4 del grafo,
ma fra questi esiste già un percorso nell'albero, esattamente il percorso v2Pv4 =
(v2, v0, v4); il risultato nale è il percorso (v2, v0, v4) + (v4, v2) = (v2, v0, v4, v2);
questo percorso speciale, dove possiamo partire da ogni vertice e raggiungerlo di
nuovo è chiamato Ciclo.
2.7. PERCORSI E CICLI 57
Lo stesso succede con il lato e5:
2.7. PERCORSI E CICLI 58
E lo stesso con il lato e7:
2.7. PERCORSI E CICLI 59
E lo stesso con il lato e10
2.7. PERCORSI E CICLI 60
E lo stesso con il lato e11
2.7. PERCORSI E CICLI 61
2.7.5. Cicli Fondamentali. Come abbiamo visto, per ogni lato del cotree
abbiamo un ciclo, questa è la ragione per la quale il numero dei lati del cotree
m − n + 1 è chiamato cyclomatic number.
Notate che il grafo può contenere un maggior numero di cicli, ma è importante
osservare che qualsiasi altro ciclo può essere ottenuto a partire dai cicli precedenti,
giusticando così il loro nome di Cicli Fondamentali.
Combinando ad esempio il primo ed il quarto ciclo otteniamo il nuovo ciclo:
{e1, e10, e6} + {e0, e3, e6} = {e1, e10, e3, e0}.
2.8. CONNECTIVITÀ 62
2.8. Connectività
2.8.1. Generalità. Abbiamo nora parlato di connettività come di una pro-
prietà booleana di un grafo G, in realtà la connettività è una proprietà variabile,
ad esempio i gra seguenti presentano gradi di connessione molto diversi:
nel primo è suciente eliminare il lato centrale o uno solo dei vertici centrali
per disconnetterlo in due parti separate; nel secondo l'eliminazione di parecchi lati
e/o vertici lascia il grafo comunque connesso; analizziamo meglio questa proprietà
chiamata Connettivita.
2.8. CONNECTIVITÀ 63
2.8.2. Bridges. Un Bridge è un lato la cui eliminazione separa il grafo
come il lato (v1, v3) della gura che separa la parte {v0, v1, v2} dalla parte
{v3, v4, v5} del grafo.
2.8. CONNECTIVITÀ 64
2.8.3. Cutpoints. Un vertice la cui cancellazione disconnette il grafo è detto
Cutpoint:
nel grafo della gura la cancellazione del vertice 5 disconnette il grafo, quindi
il vertice 5 è un cutpoint; lo stesso vale per il vertice 6.
2.8. CONNECTIVITÀ 65
2.8.4. Vertex-connectivity  Line-connectivity. I due ultimi gra sono
particolari, hanno un bridge e due cutpoint; non tutti i gra hanno bridge e/o
cutpoint; normalmente è necessario cancellare un certo numero di lati o di vertici
per disconnettere il grafo; mantenendo questi due aspetti separati, possiamo parlare
di Vertex-connectivity e Line-connectivity. La connettività è molto legata
ai disjoint paths, specicamente la vertex-connectivity con i vertex-disjoint-paths
e la edge-connectivity con gli edge-disjoints-paths; si potrebbe anzi dimostrare con
facile evidenza che eliminando un vertice (lato) si sopprime un vdp (edp) e quindi
il loro numero deve coincidere; il numero k di vertici (lati) necessari a disconnettere
il grafo danno il livello di connettività e parliamo di vertex(edge)-connectivity = k.
Ovviamente la connettività varia a seconda della coppia di vertici interessati; in tal
caso si parla di connettività locale; il valore minimo fornisce la connettività
del grafo.
2.8. CONNECTIVITÀ 66
2.8.4.1. Vertex-disjoint. In generale, in un grafo G abbiamo più percorsi fra
due vertici; siamo interessati ai percorsi particolari che non condividono vertici,
i cosiddetti Vertex-Disjoint Paths; nel grafo sottostante (da F.Harary, Graph
Theory, Addison Wesley, 1969, p. 44), dal vertice a al vertice h abbiamo il percorso
(a, c, l, h):
2.8. CONNECTIVITÀ 67
e il percorso (a, d, f, h):
Ogni percorso può essere variato, ad esempio l'ultimo percorso può essere sosti-
tuito con (a, b, e, d, f, i, g, h), ma il numero di percorsi senza vertici condivisi rimane
2, questa è una proprietà invariante del grafo.
Quindi il concetto può essere parafrasato: in un grafo il numero di vertex-
disjoint paths fra due vertici è sso; quelli visualizzati sono due fra i molti percorsi
disponibili.
2.8. CONNECTIVITÀ 68
2.8.4.2. Vertex-connectivity. La proprietà vista sopra è un'importante indice
della connettività del grafo; è evidente che la cancellazione di un vertice da ogni
percorso distrugge la connessione del grafo; nell'esempio sotto
la cancellazione del vertice c di un percorso e del vertice d dell'altro (o la
cancellazione dei vertici f e l) disconnette il grafo; pertanto il numero dei vertex-
disjoint paths eguaglia il numero dei vertici la cui eliminazione disconnete il grafo;
il valore minimo di tale numero per tutte le coppie di vertici è detto Vertex-
connectivity del grafo G; il suo valore è riportato nel riepilogo informativo.
2.8. CONNECTIVITÀ 69
2.8.4.3. Edge-disjoint. In questo capitolo siamo invece interessati a quei per-
corsi particolari che non hanno lati condivisi, i cosiddetti Edge-Disjoint Paths;
nel grafo sottostante (da F.Harary, Graph Theory, Addison Wesley, 1969, p. 44),
dal vertice a al vertice h abbiamo il percorso (a, d, l, h):
2.8. CONNECTIVITÀ 70
il percorso (a, e, d, f, h):
2.8. CONNECTIVITÀ 71
e il percorso (a, c, l, i, h):
Come nel caso precedente dei VDP, anche in questo caso ogni percorso può
avere diverse varianti, ma il loro numero è comunque 3, anche questa è una proprietà
invariante del grafo.
2.8. CONNECTIVITÀ 72
2.8.4.4. Line-connectivity. Anche questa proprietà è un'importante indice del-
la connessione di un grafo; risulta evidente che l'eliminazione di un lato di ogni
percorso distrugge la connessione del grafo; nell'esempio sotto
l'eliminazione del lato d − l del primo percorso, del lato d − f del secondo e del
lato c − l del terzo disconnette il grafo; pertanto il numero degli edge-disjoint paths
eguaglia il numero di lati la cui cancellazione separa il grafo; il valore minimo fra
quelli di tutte le coppie di vertici è detto Edge-connectivity del grafo G; il suo
valore è riportato nel riepilogo informativo del grafo.
2.9. SHORTEST PATHS 73
2.9. Shortest Paths
2.9.1. Generalità. Anche in questo caso preferisco non tradurre il termine
peraltro a tutti noto data la larga introduzione dei navigatori per autoveicoli.
Come già detto, in un grafo connesso G possiamo raggiungere, a partire dal
vertice generico p, ogni altro vertice del grafo; questo può essere fatto in diversi
modi, quindi possiamo chiederci: quale la strada più breve da p a q? Anche i criteri
da soddisfare possono essere diversi, ad esempio la distanza (la via più corta da
p a q), il costo (la via meno costosa da p a q) e così via. Noi unichiamo tutti i
possibili criteri nella proprietà già introdotta del peso, quindi usiamo il termine più
corto come sinonimo di più leggero, esattamente come abbiamo visto a proposito
del Minimum Spanning Tree, con la sola dierenza che adesso siamo interessati solo
nel percorso da p a q.
2.9. SHORTEST PATHS 74
2.9.1.1. Single Shortest Path (Dijkstra). L'algoritmo di Dijkstra assolve a
questo compito; sotto è evidenziato il percorso più breve dal vertice 1 al vertice 9
del grafo pubblicato da J.A.Bondy, U.S.R.Murty, Graph Theory, Springer, 2008,
g. 6.7, pag. 150:
il percorso transita dai vertici (1, 3, 9); il suo peso totale è 2.00: fra tutti i
percorsi da 1 a 9, il percorso evidenziato è il più corto o, se preferite, il più leggero.
2.9. SHORTEST PATHS 75
2.9.1.2. All Shortest Paths SP (Dijkstra). Lo stesso algoritmo di Dijkstra può
essere usato per conoscere tutti i shortest paths da un vertice a tutti gli altri;
sotto è visualizzato il percorso fra il vertice 6 e il vertice 9: (6, 12, 7, 3, 9) di peso
totale 7.00:
2.9. SHORTEST PATHS 76
e quì il percorso fra i vertici 6 e 10: (6, 12, 7, 3, 1, 4, 10) di peso totale 10:
2.10. RAPIDA INTRODUZIONE AI GRAFI ORIENTATI ED ALLE RETI 77
2.10. Rapida Introduzione ai Gra orientati ed alle Reti
Come abbiamo visto, i gra sono un potente modello matematico applicabile
in molti settori della Scienza o dell'Industria; tuttavia la loro generalità deve essere
compressa per adattarli a speciche situazioni; quì introduco brevemente i principali
sviluppi dei gra; lo faccio solo per dare un quadro più completo della materia
al lettore, senza entrate in dettaglio; il presente lavoro si limita ai gra: voglio
rimarcare la loro importanza come base per ulteriori sviluppi.
2.10.1. Gra orientati. Nella teoria dei Gra il lato che connette il vertice
p al vertice q, connette vicendevolmente il vertice q al vertice p, cioè è simmetrico;
ma nella realtà non è sempre così, ci sono situazioni dove un lato connette p con
q, ma non viceversa; basta pensare ai sensi unici stradali; probabilmente lo stesso
vale per i circuiti elettronici; o al usso del sangue nelle vene e arterie del nostro
corpo.
In questi casi la direzione è importante, quindi viene considerata nei gra con
orientazione o gra orientati, detti in breve Digraphs.
2.10.2. Networks. In speciche applicazioni la direzione non è suciente; ad
esempio nelle analisi di traco e di trasporto la conoscenza delle direzioni è neces-
saria per sapere se dal vertice p si può raggiungere il vertice q; anzi, l'introduzione
degli algoritmi per la ricerca dei percorsi più brevi sono un grande aiuto per ragioni
economiche evidenti; bene, ma questo non è suciente: probabilmente vogliamo
anche sapere quanti veicoli possono transitare sulle strade, quanti prodotti possi-
amo trasportare e così via. In questi casi dobbiamo introdurre due nuove proprietà
degli arcs (questo è il nome usuale che viene usato per i lati nei gra orientati): la
capacità c ed il usso f con la clausola f ≤ c.
Spero in un prossimo futuro di essere in grado di trattare anche questi problemi,
per il momento devo chiudere quì.
2.11. RIEPILOGO INFORMATIVO 78
2.11. Riepilogo Informativo
Molte delle proprietà esaminate sopra sono riportate nel riepilogo del tab Prop
compilato al caricamento dei dati del grafo:
CAPITOLO 3
Ambiente Analitico
Come ulteriore dimostrazione delle prestazioni del mio plugin, proverò ad ap-
plicarle ad un caso concreto, il grafo stradale della mia città, Melegnano, vicino
Milano, Italia:
Questo è il grafo semplicato estratto da uno shapele e convertito in un grafo
riconoscibile dal mio plugin.
Avvertenza: Come ho detto, analizzo una rete come fosse un grafo, senza
considerazione cioè della direzione delle strade. Propongo questa analogia: il grafo
stradale è hardware e la direzione di marcia è software (essendo possibile cambiarla
con un provvedimento amministrativo), il presente studio quindi può essere visto
come analisi hardware; lascio la analisi software a futuri sviluppi del mio lavoro.
79
3. AMBIENTE ANALITICO 80
Il riepilogo dice
• 179 vertici
• 237 lati
• peso totale 28537m (ho usato la lunghezza in metri delle strade come peso
del grafo)
• il grafo è connesso pertanto non ci sono componenti
• grado minimo 1 (ci sono molte strade a fondo chiuso)
• grado massimo 4
• grado medio 2.6
• il grafo è
 non pari
 non dispari
 non bipartito
• cyclomatic number 59
• 49 cutpoint (uso due algoritmi sperimentali per il calcolo e il riepilogo
dice che la vers. A dell'algoritmo fornisce un numero dierente di cupoint:
faccenda da approfondire)
• 50 bridge;
per quanto riguarda la connettività aggiungerò qualcosa sotto.
3.1. CUTPOINT 81
3.1. Cutpoint
Guardando qualche dettaglio, possiamo evidenziare i cutpoint, tutti insieme:
3.1. CUTPOINT 82
o uno alla volta:
Il caso evidenziato è abbastanza signicativo: l'eliminazione o la messa fuori
servizio del vertice v108 disconnette il grafo, in tal caso il vertice v109, un centro
civico (scuola, piscina, campo di calcio, ecc.), non sono più raggiungibili, ma anche
il vertice v111, la connessione con la rete regionale è impedito.
3.2. BRIDGE 83
3.2. Bridge
Un altro aspetto sono i bridge, tutti insieme:
3.2. BRIDGE 84
o uno alla volta:
molti bridge sono costituiti dalle strade a fondo chiuse di cui abbiamo parla-
to, quindi sono relativamente poco importanti data la modesta inuenza sul grafo
generale; più importante ovviamente il bridge v108 − v111, non visualizzato nella
gura, ma presente nella precedente: la sua defezione causa la stessa disconnessione
vista a proposito del cutpoint v108.
3.3. MINIMUM SPANNING TREE 85
3.3. Minimum Spanning Tree
Un aspetto a mio avviso molto interessante è il Minimum Spanning Tree nella
gura sotto:
la lunghezza totale, ricordo, del grafo è di 28.5m, la lunghezza totale del MST
è di 17km.
C'è una vecchia discussione nella mia città circa le piste pedonali e/o ciclabili;
come spesso succede in Italia le discussioni sono lunghe, le piste ciclopedonali un
pò meno .....
Comunque, suppongo che le risorse per questa infrastruttura a rete siano limi-
tate e la necessità di dotare l'intera città di piste signica attrezzare oltre 28km di
strade.
Se trattiamo le piste ciclopedonali come una risorsa pregiata, del tipo di quella
considerata da J.A.Bondy, U.S.R.Murty, Graph Theory, Springer, 2008, 6.2, g.
6.5, p. 165, già citata al paragrafo Ÿ2.6.4, potremmo pensare al MST come ad
una possibile soluzione: basterebbe attrezzare 17km di piste, poco più della metà
dell'intera lunghezza, per consentire l'attraversamento di tutta la città e rendere
accessibili tutti i suoi punti cruciali. Peraltro andrebbero considerate anche le piste
già esistenti che, coordinate nel quadro complessivo, potrebbero abbassare ancora
il costo e le risorse necessarie.
Avvertenza: il costo delle piste e la loro maggiore o minore lunghezza non
sono i soli criteri; se lasciassi per un momento i panni del matematico dilettante e
rivestissi quelli di architetto che ho appena dismesso, certamente analizzerei molti
altri aspetti; quello che penso, rientrando velocemente nei più comodi panni del
matematico, è che l'informazione è molto utile per chi deve decidere, un punto
fermo da mettere insieme ad altri per costruire il giusto progetto ed il miglior
mosaico decisionale.
3.4. SHORTEST PATHS 86
3.4. Shortest Paths
Guardiamo ora i Shortest Paths, il singolo Shortest Paths, ad esempio, dal
vertice v86 al vertice v173:
3.4. SHORTEST PATHS 87
o tutti i Shortest Paths dallo stesso vertice v86; i percorsi possono essere
visualizzati uno alla volta, nella gura sotto è mostrato il percorso da v86 a v153.
Avvertenza: questa analisi è la stessa disponibile nella Network Analysis Li-
brary di QGIS o negli altri plugin citati all'inizio; con tutta probabilità questi ultimi
sono più ecienti e robusti del mio; come ho detto più volte, la duplicazione degli
algoritmi nel mio plugin ha essenzialmente scopi didattici.
3.5. VERTEX DISJOINT PATHS 88
3.5. Vertex Disjoint Paths
Un interessante aspetto sono i Vertex Disjoint Paths; li abbiamo calcolati fra
il vertice v89, il centro città, e il vertice v44, la connessione verso nord (Milano);
come si può vedere dalle gure seguenti, ci sono tre di questi percorsi, il primo:
3.5. VERTEX DISJOINT PATHS 89
il secondo:
3.5. VERTEX DISJOINT PATHS 90
e il terzo:
Tutte le strade interessate sono a doppio senso di marcia per cui in questo caso
l'analisi hardware coincide con quella software.
É importante sottolineare la nozione di connettività locale: la connessione fra
centro città e rete regionale nord è sucientemente robusta: occorre mettere fuori
gioco contemporaneamente tre vertici per distruggere questa connessione.
3.6. EDGE DISJOINT PATHS 91
3.6. Edge Disjoint Paths
Analoghi ai vertex-disjoint sono gli Edge Disjoint Paths, la dierenza consiste
nel fatto che quì è possibile anche attraversare un vertice già passato, mentre tutti i
lati del percorso devono essere dierenti; usando ancora i vertici v89 e v44, abbiamo
tre percorsi, il primo:
3.6. EDGE DISJOINT PATHS 92
il secondo:
3.6. EDGE DISJOINT PATHS 93
e il terzo:
Nota matematica: detti κ (G) la vertex-connectivity, λ (G) la edge-connectivity
e δ (G) il grado minimo, vale il teorema di Whitney: κ (G) ≤ λ (G) ≤ δ (G)
(F.Harary, Graph Theory, Addison Wesley, 1969, th. 5.1 pag. 43); nel nostro
caso abbiamo κ (G) = 3, λ (G) = 3 e δ (G) = min (dv044, dv089) = 3, il teorema di
Whitney κ (G) = λ (G) = δ (G) risulta vericato.
3.7. CONNETTIVITÀ 94
3.7. Connettività
3.7.1. Un Suggerimento. Abbiamo visto l'importanza della vertex- e della
edge-connectivity per la comprensione della struttura del grafo; spesso i gra con-
tengono molti vertici terminali, quindi sono numerosi i cutpoint ed i bridge; questi
cutpoint e/o bridge sono banali, noti e non molto importanti in quanto incidono
su una parte limitata del grafo; peggio, questa moltitudine nasconde altri even-
tuali importanti cutpoint e bridge, pertanto recuperiamo un risultato già visto al
paragrafo Ÿ2.6.6: il fogliame del grafo. Eliminando no ad esaurimento i vertici
terminali, raggiungiamo un sottografo che ho chiamato core; quello sotto è il core
del grafo stradale di Melegnano:
3.7. CONNETTIVITÀ 95
Applicando le analisi viste a questo sottografo possiamo scoprire aspetti molto
interessanti:
(1) ci sono quattro cutpoint (v6, v21, v22, v158)
(2) c'è un bridge (v21-v22).
3.7.2. Vertex Connectivity. Abbiamo già visto al paragrafo Ÿ 2.8.4 l'im-
portanza della vertex-connectivity di un grafo; questa sotto è la statistica del grafo
stradale di Melegnano:
numero di coppie 8197
minimo 1 per la coppia ['v 0', 'v 12']
media 1.73
massima 4 per la coppia ['v 1', 'v 4']
sqm 0.66
Confesso che il dato medio (1.73) mi preoccupa perchè quì stiamo trattando
il sottografo depurato dai nodi terminali e mi sarei aspettato un valore almeno
superiore a 2.
(Nota 1: ora il plugin ore anche la distribuzione statistica della vertex-connectivity;
questa tabella è stata preparata con una versione precedente che non la prevedeva;
aggiornerò quanto prima i dati).
(Nota 2: La tabella è stata completata con una versione standalone dell'appli-
cazione perchè il calcolo dei VDP di tutte le coppie di vertici costituisce un processo
troppo lungo per una sessione interattiva come il plugin).
3.7.3. Edge Connectivity. Questa è la statistica della edge-connectivity del
grafo stradale di Melegnano:
numero di coppie 8385
minimo 1 per la coppia ['v 0', 'v 12']
media 2.10
massima 4 per la coppia ['v 1', 'v 4']
sqm 0.68
la distribuzione della connettività per grado è la seguente
3.7. CONNETTIVITÀ 96
grado frequenza %
0 0 0
1 1510 18
2 4554 54
3 2288 27
4 33 1
totale 8385 100
Avanzo un'ipotesi: abbiamo già visto la presenza del bridge (v20, v21); questo
bridge divide il grafo in due blocchi di circa 10 ÷ 12 vertici a nord-est e i rimanenti
130 − 10 ÷ 12 = 118 ÷ 120 (ricordate che stiamo trattanto con il core del grafo
stradale) per un totale di 118÷120×10÷12 = 1200÷1416 coppie, quindi le coppie
con edge-connection = 1 sono probabilmente collegate con quel bridge; possiamo
pensare che il restante grafo è sostantialmente robusto).
(Nota: Come sopra la tabella è stata completata con una versione standalone
dell'applicazione perchè il calcolo degli EDP di tutte le coppie di vertici costituisce
un processo troppo lungo per una sessione interattiva come il plugin).
CAPITOLO 4
Conclusioni
Non credo ci siamo molte conclusioni da trarre; ho sostanzialmente raccontato
quello che avevo in mente di dire; spero di aver dato una suciente informazione sul
plugin che ho realizzato e spero che possa essere di aiuto a qualcun altro studente
di gra.
Resto a disposizione ed in attesa di suggerimenti, consigli, contributo e critiche,
nell'attesa vedrò di approfondire qualcosa sui gra orientati e le reti.
Grazie.
97

Weitere ähnliche Inhalte

Ähnlich wie Graphs plugin 20160923-ita

Avogadro: calcolo e visualizzazione per la chimica quantistica
Avogadro: calcolo e visualizzazione per la chimica quantisticaAvogadro: calcolo e visualizzazione per la chimica quantistica
Avogadro: calcolo e visualizzazione per la chimica quantisticaPorfirina
 
Quick and easy to create maps scopriamo insieme q gis
Quick and easy to create maps scopriamo insieme q gisQuick and easy to create maps scopriamo insieme q gis
Quick and easy to create maps scopriamo insieme q gisCity Planner
 
Git
GitGit
Gitmods
 
Simulatore Grafico Per Reti Ottiche A Pacchetto
Simulatore Grafico Per Reti Ottiche A PacchettoSimulatore Grafico Per Reti Ottiche A Pacchetto
Simulatore Grafico Per Reti Ottiche A PacchettoFedele Mantuano
 
Qt Lezione3: un visualizzatore di immagini
Qt Lezione3: un visualizzatore di immaginiQt Lezione3: un visualizzatore di immagini
Qt Lezione3: un visualizzatore di immaginiPaolo Sereno
 
BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...
BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...
BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...Francesco Andreuzzi
 
BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...
BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...
BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...Francesco Andreuzzi
 
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...Francesco Cucari
 
Struttin' on, novità in casa Struts
Struttin' on, novità in casa StrutsStruttin' on, novità in casa Struts
Struttin' on, novità in casa StrutsMarcello Teodori
 
Rai qt presentazione-2015-06-03
Rai qt presentazione-2015-06-03Rai qt presentazione-2015-06-03
Rai qt presentazione-2015-06-03Giuliano Curti
 
Metodi matematici per l’analisi di sistemi complessi
Metodi matematici per l’analisi di sistemi complessiMetodi matematici per l’analisi di sistemi complessi
Metodi matematici per l’analisi di sistemi complessiLino Possamai
 
Introduzione a openstreetmap e casi d'uso disi 23-04-2012
Introduzione a openstreetmap e casi d'uso   disi 23-04-2012Introduzione a openstreetmap e casi d'uso   disi 23-04-2012
Introduzione a openstreetmap e casi d'uso disi 23-04-2012Ale ZenaIT
 
GUI in Gtk+ con Glade & Anjuta
GUI in Gtk+ con Glade & AnjutaGUI in Gtk+ con Glade & Anjuta
GUI in Gtk+ con Glade & Anjutadelfinostefano
 
Graph partitioning: implementazione dell'algoritmo spettrale e confronto con ...
Graph partitioning: implementazione dell'algoritmo spettrale e confronto con ...Graph partitioning: implementazione dell'algoritmo spettrale e confronto con ...
Graph partitioning: implementazione dell'algoritmo spettrale e confronto con ...KevinMarzio
 

Ähnlich wie Graphs plugin 20160923-ita (20)

Topog presentation
Topog presentationTopog presentation
Topog presentation
 
Avogadro: calcolo e visualizzazione per la chimica quantistica
Avogadro: calcolo e visualizzazione per la chimica quantisticaAvogadro: calcolo e visualizzazione per la chimica quantistica
Avogadro: calcolo e visualizzazione per la chimica quantistica
 
Quick and easy to create maps scopriamo insieme q gis
Quick and easy to create maps scopriamo insieme q gisQuick and easy to create maps scopriamo insieme q gis
Quick and easy to create maps scopriamo insieme q gis
 
Git
GitGit
Git
 
Simulatore Grafico Per Reti Ottiche A Pacchetto
Simulatore Grafico Per Reti Ottiche A PacchettoSimulatore Grafico Per Reti Ottiche A Pacchetto
Simulatore Grafico Per Reti Ottiche A Pacchetto
 
Qt Lezione3: un visualizzatore di immagini
Qt Lezione3: un visualizzatore di immaginiQt Lezione3: un visualizzatore di immagini
Qt Lezione3: un visualizzatore di immagini
 
DHow2 - L1
DHow2 - L1DHow2 - L1
DHow2 - L1
 
BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...
BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...
BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...
 
BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...
BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...
BisPy: un pacchetto Python per il calcolo della massima bisimulazione di graf...
 
Tesi andrea cingolani
Tesi andrea cingolaniTesi andrea cingolani
Tesi andrea cingolani
 
Hadoop in action!
Hadoop in action!Hadoop in action!
Hadoop in action!
 
OpenStreetMap per il web
OpenStreetMap per il webOpenStreetMap per il web
OpenStreetMap per il web
 
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
 
Struttin' on, novità in casa Struts
Struttin' on, novità in casa StrutsStruttin' on, novità in casa Struts
Struttin' on, novità in casa Struts
 
Rai qt presentazione-2015-06-03
Rai qt presentazione-2015-06-03Rai qt presentazione-2015-06-03
Rai qt presentazione-2015-06-03
 
Lezioni 2009
Lezioni 2009Lezioni 2009
Lezioni 2009
 
Metodi matematici per l’analisi di sistemi complessi
Metodi matematici per l’analisi di sistemi complessiMetodi matematici per l’analisi di sistemi complessi
Metodi matematici per l’analisi di sistemi complessi
 
Introduzione a openstreetmap e casi d'uso disi 23-04-2012
Introduzione a openstreetmap e casi d'uso   disi 23-04-2012Introduzione a openstreetmap e casi d'uso   disi 23-04-2012
Introduzione a openstreetmap e casi d'uso disi 23-04-2012
 
GUI in Gtk+ con Glade & Anjuta
GUI in Gtk+ con Glade & AnjutaGUI in Gtk+ con Glade & Anjuta
GUI in Gtk+ con Glade & Anjuta
 
Graph partitioning: implementazione dell'algoritmo spettrale e confronto con ...
Graph partitioning: implementazione dell'algoritmo spettrale e confronto con ...Graph partitioning: implementazione dell'algoritmo spettrale e confronto con ...
Graph partitioning: implementazione dell'algoritmo spettrale e confronto con ...
 

Mehr von Giuliano Curti

Graphs plugin 20160923-eng
Graphs plugin 20160923-engGraphs plugin 20160923-eng
Graphs plugin 20160923-engGiuliano Curti
 
Geographic vs geocentric coordinates-2015-02-03-ita
Geographic vs geocentric coordinates-2015-02-03-itaGeographic vs geocentric coordinates-2015-02-03-ita
Geographic vs geocentric coordinates-2015-02-03-itaGiuliano Curti
 
Spherical trigonometry
Spherical trigonometrySpherical trigonometry
Spherical trigonometryGiuliano Curti
 
A line-simplifying and line-rectifying tool
A line-simplifying and line-rectifying toolA line-simplifying and line-rectifying tool
A line-simplifying and line-rectifying toolGiuliano Curti
 
Topog4qgis tech documentation
Topog4qgis tech documentationTopog4qgis tech documentation
Topog4qgis tech documentationGiuliano Curti
 
Point4qgis presentation
Point4qgis presentationPoint4qgis presentation
Point4qgis presentationGiuliano Curti
 

Mehr von Giuliano Curti (6)

Graphs plugin 20160923-eng
Graphs plugin 20160923-engGraphs plugin 20160923-eng
Graphs plugin 20160923-eng
 
Geographic vs geocentric coordinates-2015-02-03-ita
Geographic vs geocentric coordinates-2015-02-03-itaGeographic vs geocentric coordinates-2015-02-03-ita
Geographic vs geocentric coordinates-2015-02-03-ita
 
Spherical trigonometry
Spherical trigonometrySpherical trigonometry
Spherical trigonometry
 
A line-simplifying and line-rectifying tool
A line-simplifying and line-rectifying toolA line-simplifying and line-rectifying tool
A line-simplifying and line-rectifying tool
 
Topog4qgis tech documentation
Topog4qgis tech documentationTopog4qgis tech documentation
Topog4qgis tech documentation
 
Point4qgis presentation
Point4qgis presentationPoint4qgis presentation
Point4qgis presentation
 

Graphs plugin 20160923-ita

  • 1. Un plugin python di QGIS per il trattamento dei gra Giuliano Curti (giulianc51 at gmail dot com)
  • 2. A mio padre Gaetano Rev. 0.01
  • 3. Indice Cronologia 4 Avvertenza 5 Capitolo 1. Prefazione 6 1.1. Cos'è un grafo? 6 1.2. Cos'è questo plugin? 7 1.3. L'Interfaccia Graca 8 1.4. Bibliography 14 Capitolo 2. Ambiente Educativo / Ricreativo 15 2.1. Supporto Graco 15 2.2. Suggerimenti 26 2.3. Vertici 28 2.4. Lati 32 2.5. Sottogra 34 2.6. Alberi (Trees) 35 2.7. Percorsi e Cicli 52 2.8. Connectività 62 2.9. Shortest Paths 73 2.10. Rapida Introduzione ai Gra orientati ed alle Reti 77 2.11. Riepilogo Informativo 78 Capitolo 3. Ambiente Analitico 79 3.1. Cutpoint 81 3.2. Bridge 83 3.3. Minimum Spanning Tree 85 3.4. Shortest Paths 86 3.5. Vertex Disjoint Paths 88 3.6. Edge Disjoint Paths 91 3.7. Connettività 94 Capitolo 4. Conclusioni 97 3
  • 4. CRONOLOGIA 4 Cronologia date issue 2016-09-19 Impianto 2016-09-22 Visualizzazione pesi dei lati 2016-09-23 Edge-connectivity del grafo stradale di Melegnano 2016-09-23 Chiusura rev. 0.01-ita
  • 5. AVVERTENZA 5 Avvertenza (1) Ho scritto queste note come un aiuto al mio studio ed alla comprensione della Teoria dei Gra. Esse riettono lo stato della mia attuale conoscenza sull'argomento, pertanto vi prego di scusare ogni imperfezione ed errore contenuto nello scritto. (2) Queste note riettono il mio approccio alla Teoria dei Gra, pertanto non devono intendersi in alcun modo critiche, competizioni o sostituzioni di altri lavori sullo stesso argomento. (3) Condivido queste note nella speranza che possano essere di aiuto ad altri studenti della Teoria dei Gra. (4) Ogni commento, suggerimento, contributo o critica sono ben accetti. (5) Assumo ogni responsabilità per i contenuti di questo scritto, ma in ogni caso nessuna garanzia, implicita e/o esplicita, è connessa con il suo uso; il lettore assume i contenuti a proprio rischio e responsabilità. (6) Come ormai a tutti noto, molti termini inglesi sono diventati di uso co- mune pertanto eviterò di farne scempio con improbabili traduzioni, quindi lascerò intatti termini come mouse, layer, shapefile, python, tree, cycle, console, ecc.; nei casi più ostili il ricorso alla rete risolverà ogni vostro dubbio. (7) Questo documento è rilasciato sotto la licenza CC by SA NC.
  • 6. CAPITOLO 1 Prefazione 1.1. Cos'è un grafo? Un Grafo è una struttura molto elementare: un insieme di Punti (d'ora in avanti chiamati Vertici) ed un insieme di Linee (d'ora in avanti chiamate Lati) che collegano una coppia di vertici; matematicamente un grafo è denito dal simbolo G (V, E) dove V è l'insieme dei vertici e E = V 2 l'insieme dei lati. Non approfondiamo i dettagli dei gra, alcuni di essi verranno spiegati nei capitoli successivi: limitiamo la nostra analisi ai gra semplici; inoltre ci limitiamo ai gra connessi, quelli cioè in cui tutti i vertici sono collegate in qualche modo al resto del grafo (il lettore curioso può riferirsi ai testi indicati nella bibliograa per maggiori informazioni). Quello della gura è un grafo, in realtà si tratta di un tree (Albero), dotato di • vertici V = {B, C, G, N, S, T, Y, W} • lati E = {(B, T) , (T, N) , (C, Y ) , (Y, W) , (G, W) , (W, N) , (N, S)}. Quello che è interessante notare è che i gra sono independenti dalla posizione, dimensione, distanze, ecc., l'unica cosa importante è se il vertice u è connesso o meno con il vertice v, per tutti i vertici u, v ∈ V . 6
  • 7. 1.2. COS'È QUESTO PLUGIN? 7 1.2. Cos'è questo plugin? Come alcuni di voi sapranno, QGIS (un applicativo free open source per la cartograa numerica) è dotato di una libreria per l'Analisi delle Reti che imple- menta alcuni strumenti, l'algoritmo di Dijkstra principalmente; recentemente molti contributori hanno aggiunto altri plugin con lo stesso obbiettivo, quindi è lecito chiedersi: perchè un nuovo plugin per i gra? Come ho detto nelle Avvertenze, questo plugin è principalmente inteso come un aiuto per l'apprendimento della Teoria dei Gra. Il mio orizzonte attuale non è l'analisi delle prestazioni globali di una rete o di un grafo orientato, e nemmeno quello di scrivere una potente libreria: questi compiti sono meglio assolti da parecchi strumenti, all'interno ed all'esterno del mondo QGIS, disponibili agli utenti; il mio riferimento attuale è di consentire all'utente (il sottoscritto per primo) di imparare le proprietà basilari dei gra: paths, cycles, spanning trees, connectivity, ecc. Spero di riuscire a sviluppare il mio plugin per compiti maggiori nel futuro, ma ora il mio obiettivo è quello che ho appena raccontato. Tutti gli algoritmi implementati nel plugin sono sicamente scritti all'interno del suo codic, senza uso di alcuna libreria esterna; ovviamente questo rende il plugin prono a bachi ed errori, ma penso anche molto più interessante per scopi educativi. In generale gli algoritmi derivano dalla letteratura tecnica, in particolar modo dai testi citati nella bibliograa del prossimo paragrafo, tuttavia la necessità di alcuni strumenti di analisi di connectività, normalmente presi da una parte più avanzata della teoria (gra orientati), mi ha obbligato a scrivere alcuni algoritmi dal nulla; ovviamente devono essere validati e sono a disposizione di chiunque volesse esaminarli. Nello scrivere queste note ho avuto in mente due situazioni: 1) un ambiente educativo e/o ricreativo 2) un ambiente più serio, analitico; la prima parte di questa note è centrata sul primo punto; proverò, nella seconda parte, un utilizzo più impegnativo per studiare situazioni più interessanti. Il plugin può trattare un grafo alla volta e non può passare da un grafo all'altra; un lavoro chiuso deve essere riaperto per essere trattato.
  • 8. 1.3. L'INTERFACCIA GRAFICA 8 1.3. L'Interfaccia Graca Il plugin è controllato attraverso un pannello di controllo; questo è organizzato in dierenti tabs (questo è una nuova caratteristica, peraltro in continua evoluzione, pertanto nelle gure seguenti potranno apparire versioni del pannello dierenti e non aggiornate). (1) I/O
  • 9. 1.3. L'INTERFACCIA GRAFICA 9 (2) Proprietà del grafo:
  • 10. 1.3. L'INTERFACCIA GRAFICA 10 (3) Interrogazione dei Vertici e dei Lati:
  • 11. 1.3. L'INTERFACCIA GRAFICA 11 (4) Alberi e Cicli:
  • 12. 1.3. L'INTERFACCIA GRAFICA 12 (5) Connettività:
  • 13. 1.3. L'INTERFACCIA GRAFICA 13 (6) Percorsi:
  • 14. 1.4. BIBLIOGRAPHY 14 1.4. Bibliography I gra sono un argomento arontato in molti settori della Matematica, per cui è frequente incontrare utili documenti in aree come la Programmazione Lineare e l'Ottimizzazione, l'Ingegneria del Software, l'Analisi delle Reti e cosi via. Io ho mosso i miei primi passi sui testi che seguono; essi consentono un approccio timido come il mio, ma possono orire argomenti stuzzicanti al lettore, quindi possono costituire una guida completa allo studio dei gra: (1) J.A.Bondy, U.S.R.Murty, Graph Theory, Springer, 2008 (2) Frank Harary, Graph Theory, Addison Wesley, 1969
  • 15. CAPITOLO 2 Ambiente Educativo / Ricreativo 2.1. Supporto Graco Come detto in precedenza un grafo non è determinato dalle sue dimensioni, forme, distanze, ecc. tuttavia il suo schizzo è molto utile: consente al lettore di conoscere immediatamente il grafo. Questo fatto costituisce la prima utile relazione con QGIS: QGIS come supporto per la visualizzazione del grafo. Questa è in realtà la modalità più semplice, una interazione più intelligente fra QGIS e graph4qgis sarà presentata in seguito. Ci sono tre modalità per aprire un le con il plugin graphs4qgis, questi i rispettivi schemi di funzionamento: (1) caricamento di un le Graph (a) se il plugin trova uno shapele dei vertici collegato al grafo lo carica previa conferma dell'utente (b) altrimenti crea automaticamente una geometria dei vertici e genera il relativo shapele (c) crea lo shapele dei lati (2) caricamento di uno Shapefile dei lati (a) crea la struttura del grafo (b) crea lo shapele dei vertici (3) caricamento di un le CSV (analogo al caricamento di uno shapele) (4) creazione di un layer a mano libera (5) ci sarebbe una quinta modalità di caricare le TXT ma non la discutiamo quì. 15
  • 16. 2.1. SUPPORTO GRAFICO 16 2.1.1. Caricamento di un le Graph. Questa è la modalità standard: l'utente carica un le Graph:
  • 17. 2.1. SUPPORTO GRAFICO 17 il sistema riconosce se ci sono shapele collegati al grafo aperto; in caso aer- mativo il sistema ore all'utente la possibilità di caricarlo:
  • 18. 2.1. SUPPORTO GRAFICO 18 alla risposta aermativa dell'utente il sistema carica lo shapele, altrimenti crea automaticamente e carica a video i layer dei vertici e dei lati (NB: il layer dei lati ed il layer dei vertici quando creato automaticamente risiedono in memoria, pertanto se necessario occorre salvarli): Questa è la rappresentazione grezza di un grafo pubblicato sul testo di Frank Harary.
  • 19. 2.1. SUPPORTO GRAFICO 19 L'utente può modicare la disposizione dei vertice con gli strumenti usuali di QGIS come sotto rappresentato
  • 20. 2.1. SUPPORTO GRAFICO 20 Premendo il tasto update SHP ricostruiamo lo schema come rappresentato dall'Autore in Graph Theory, Addison Wesley, 1969, g. 5.1, pag. 44:
  • 21. 2.1. SUPPORTO GRAFICO 21 2.1.2. Caricamento di uno Shapele. La seconda modalità consente all'u- tente di caricare un le SHP, più esattamente un le vettoriale di tipo linestring: caricato lo shapele, il sistema costruisce automaticamente la struttura del Grafo; provvede inoltre a creare ed a caricare a video il layer dei vertici.
  • 22. 2.1. SUPPORTO GRAFICO 22 2.1.3. Caricamento di un le CSV. L'utente può partire da un le di testo come il seguente: per l'inserimento dei lati; il le contiene una linea per ogni lato del grafo di cui fornisce la geometria degli estremi;
  • 23. 2.1. SUPPORTO GRAFICO 23 l'Utente può caricarlo con i comandi usuali di QGIS e questo è il risultato: in realtà il le CSV carica un layer vettoriale nello spazio video di QGIS, quindi l'utente segue la procedura descritta al paragrafo Ÿ2.1.2.
  • 24. 2.1. SUPPORTO GRAFICO 24 2.1.4. A mano libera. Come ultima risorsa potete usare i potenti strumenti di QGIS per disegnare un layer vettoriale; in tal caso vanno osservate queste regole: (1) create un layer vettoriale di tipo LineString (2) inserite le linee (lati) del grafo (avendo cura di far coincidere le estremità condivise settando opportunamente la funzione di snapping di QGIS) (3) i vertici del grafo saranno le estremità delle linee (lati) (4) le eventuali intersezioni fra le linee non saranno considerate (tecnicamente si dice che sono ammessi gra non-piani); è vostra responsabilità spezzare le linee nel caso vogliate utilizzare le intersezioni. Fatto questo, dovete seguire la procedura descritta al paragrafo Ÿ2.1.2; questo è un esampio:
  • 25. 2.1. SUPPORTO GRAFICO 25 .. e questo il grafo nale:
  • 26. 2.2. SUGGERIMENTI 26 2.2. Suggerimenti 2.2.1. Python Console. É probabilmente buona cosa tenere aperta la con- sole Python di QGIS per vedere eventuali messaggi del sistema:
  • 27. 2.2. SUGGERIMENTI 27 2.2.2. Capacità di modica di QGIS. Una opzione molto potente è oerta dalle potenzialità di QGIS: gli elementi evidenziati a video, come vedremo fra poco, possono essere copiati con il comando standard di QGIS e duplicati in un layer vettoriale dierente, per usi futuri
  • 28. 2.3. VERTICI 28 2.3. Vertici 2.3.1. Lista dei Vertici. Il plugin consente di elencare a video la lista di tutti i vertici: Il numero totale dei vertici è normalmente denominato n.
  • 29. 2.3. VERTICI 29 2.3.2. Coordinate dei Vertici. ... lo stesso per l'elenco delle coordinate cartesiane dei vertici:
  • 30. 2.3. VERTICI 30 2.3.3. Grado dei Vertici. ... ed anche per l'elenco dei gradi dei vertici:
  • 31. 2.3. VERTICI 31 2.3.4. Interrogazione dei Vertici. L'utene può interrogare il singolo ver- tice selezionandolo nella casella a discesa; del vertice selezionato sono riportate le coordinate cartesiane, il grado, i vertici adiacenti, i lati incidenti e se il vertice costituisce un cutpoint:
  • 32. 2.4. LATI 32 2.4. Lati 2.4.1. Lista dei Lati. L'utente può ottenere l'elenco di tutti i lati del grafo: Il numero totale dei lati è normalmente denominato m.
  • 33. 2.4. LATI 33 2.4.2. Interrogazione dei Lati. .. oppure può interrogare il singolo lato ottenendo i vertici di estremità, il peso, se il lato è un bridge, ecc.
  • 34. 2.5. SOTTOGRAFI 34 2.5. Sottogra 2.5.1. Sottogra. Dato il grafo G = {VG, EG}, il grafo H = {VH, EH} tale che vH ⊆ VG e EH ⊆ EG è detto sottografo di G. 2.5.2. Sottogra Indotti. (da fare)
  • 35. 2.6. ALBERI (TREES) 35 2.6. Alberi (Trees) Tipi particolari di sottogra di G sono gli Alberi (trees) T = {VT , ET }; la loro caratteristica è di contenere il numero minimo di lati necessari a connettere tutti i vertici di cui sono dotati. Particolarmente importanti sono gli spanning trees che hanno la proprietà VT = VG, cioè comprendono tutti i vertici del grafo; i lati ET ⊆ EG sono in numero di n − 1; con ragionamenti elementari l'utente può vericare che questo numero è necessario per connettere i vertici (un numero minore di lati lascerebbe qualche vertice sconnesso) e suciente allo scopo (un numero maggiore connetterebbe vertici già connessi). Fra i numerosi alberi di G analizziamo i tre più importanti: (1) Breath First Search (BFS) (2) Depth First Search (DFS) (3) Minimum Spanning Tree (MST); più tardi vedremo l'importanza di questi alberi nell'analisi dei gra. Alla ne del capitolo introdurremo un quarto albero, il Maximum Spanning Tree, il cui signicato apparirà chiaramente dal nome.
  • 36. 2.6. ALBERI (TREES) 36 2.6.1. Breath First Search. Abbiamo già notato che in un albero ogni cop- pia di vertici è connessa, quindi possiamo denire una vertice base, detto radice, e navigare l'albero dalla radice no a raggiungere tutti gli altri vertici; questa nav- igazione può essere fatta in diversi modi, una è la Breath First Search; in questo modo partiamo dalla radice (livello 1) e congiungiamo tutti i vertici adia- centi (livello 2), da quì raggiungiamo i vertici adiacenti ai precedenti (livello 3) e cosi via; questo è molto simile all'organizzazione del sistema di le di un computer, dove abbiamo la radice, un livello sotto le cartelle e i le, un livello ancora sotto abbiamo altre cartelle e le e così via; un altro esempio familiare può essere l'albero genealogico dove i livelli sono rappresentati dalle generazioni. Questo è un esempio di BFS con la radice nel vertice v1: i lati dell'albero BFS sono evidenziati in colore rosso;
  • 37. 2.6. ALBERI (TREES) 37 questo è un ingrandimento della tabella visualizzata nella console python di QGIS: dove possiamo vedere (1) il predecessore (2) il livello (3) l'ordine cronologico dei vertici attraversati dal BSF
  • 38. 2.6. ALBERI (TREES) 38 o, se preferite, direttamente a schermo: ..
  • 39. 2.6. ALBERI (TREES) 39 2.6.2. Depth First Search. Probabilmente l'utente può pensare al BFS come ad una straticazione del grafo ed alla sua analisi strato per strato; possi- amo però immaginare di attraversare il nostro grafo in modo dierente, ad esempio navigando in profondità dalla radice attraverso il primo vertice incontrato ed anco- ra più giù; raggiunto il punto più basso si riprende dal primo vertice disponibile e così via: questa modalità si chiama Depth First Search; questo ne è un esempio con la radice posta sempre nel vertice v1: i lati dell'abero DFS sono sempre evidenziati in colore rosso;
  • 40. 2.6. ALBERI (TREES) 40 questo un ingrandimento della tabella visualizzata nella console python di QGIS: dove possiamo vedere: (1) il predecessore (2) l'ordine di andata (3) l'ordine di ritorno dei vertici attraversati dal DSF.
  • 41. 2.6. ALBERI (TREES) 41 Questo invece un esempio dello stesso grafo con la radice posta nel vertice v4: quì i lati del DFS sono colorati in giallo;
  • 42. 2.6. ALBERI (TREES) 42 i dettagli sono visualizzati nella tabella che segue: La stessa cosa può essere ovviamente eseguita con la modalità BFS.
  • 43. 2.6. ALBERI (TREES) 43 2.6.3. Pesi. Prima di passare al terzo ed ultimo tipo di albero dobbiamo in- trodurre un nuovo concetto: il Peso dei lati. Finora abbiamo considerato i lati tutti uguali, cioè andare dal vertice A al vertice B era lo stesso che andare dal ver- tice C al vertice D; in molte situazioni reali dove i gra costituiscono un utilissimo modello, le cose possono presentarsi diversamente: A può essere più vicino a B che C con D; in altri casi passare da A a B può essere meno costoso che passare da C a D, ecc. Pertanto dobbiamo introdurre una proprietà che caratterizzi i lati del grafo, questa proprietà è il peso (nella letteratura tecnica è detto anche Costo); selezionando un lato nella casella a discesa, insieme ad altre proprietà già discusse, abbiamo anche il peso del lato: (il lato (G, W) ha peso 837).
  • 44. 2.6. ALBERI (TREES) 44 Possiamo ottenere in qualsiasi momento l'elenco dei pesi dei lati del grafo, sia in forma tabellare: che in forma graca:
  • 46. 2.6. ALBERI (TREES) 46 2.6.4. Minimum Spanning Tree. Ritornando agli alberi, possiamo immag- inare di costruire l'abero di peso (o costo) minore fra tutti gli altri, questo è il Minimum Spanning Tree. Un esempio semplice è il problema di costruire una costosa rete (quì il termine è usato in senso generico) illustrato da J.A.Bondy, U.S.R.Murty, Graph Theory, Springer, 2008, Ÿ6.2, g. 6.5, pag. 165 sulla griglia idro-elettrica della Republica Popolare di Cina. Due algoritmi sono particolarmente noti per questo calcolo: (1) l'algoritmo di Jarnik-Prim (2) l'algoritmo di Boruvka-Kruskal. L'utente è indirizzato verso la letteratura tecnica per i dettagli; il plugin esegue entrambi gli algoritmi.
  • 47. 2.6. ALBERI (TREES) 47 2.6.4.1. Algoritmo di Jarnik-Prim. Questo è un esempio dell'algoritmo di Jarnik- Prim: con l'elenco dei pesi: oppure con i pesi sullo sfondo:
  • 49. 2.6. ALBERI (TREES) 49 2.6.4.2. Algoritmo di Boruvka-Kruskal. Questo è un esempio dell'algoritmo di Boruvka-Kruskal: con l'elenco dei pesi: Avvertenza: il MST è unico, quindi nessuna sorpresa se i due algoritmi for- niscono lo stesso risultato, non ci sono altre possibilità. L'esecuzione dei due algoritmi può essere utile per confrontarne i risultati.
  • 50. 2.6. ALBERI (TREES) 50 2.6.5. Maximum Spanning Tree. É un gioco di simmetria pensare al max- imum spanning tree: invertendo il segno dei pesi del grafo w → −w l'algoritmo esegue la ricerca del Maximum Spanning Tree (si potrebbe anche usare l'inverso w → 1 w , ma la somma degli inversi non è l'inverso della somma, quindi preferiamo usare gli opposti): (il MxST è individuato con il colore giallo).
  • 51. 2.6. ALBERI (TREES) 51 2.6.6. Fogliame. Elementi caratteristici di un albero sono le foglie, i vertici terminali, quelli con grado 1. Ovviamente possono essere presenti anche gra nor- mali; nonostante siano visibili direttamente, il plugin dispone di un comando per evidenziare il fogliame, l'insieme dei vertici terminali:
  • 52. 2.7. PERCORSI E CICLI 52 2.7. Percorsi e Cicli 2.7.1. Generalità. Come abbiamo visto la presenza di lati fra i vertici con- sente di navigare da un punto all'altro; dati due vertici p e q abbiamo diversi modi di navigare da uno all'altro: ad esempio ripercorrendo alcuni lati oppure ripassando da alcuni vertici; la navigazione senza ripassare dagli stessi vertici (e quindi senza ripassare gli stessi lati) è forse la più importante, chiamata Path e denotata con pPq. Ripensando ad esempio gli alberi, vediamo che fra ogni coppia di vertici esiste un percorso; di più, il percorso è unico: questa è un'importante caratteristica degli alberi. Però abbiamo visto che l'albero comprende tutti i vertici del grafo, ma non contiene tutti i lati: qual'è il ruolo di questi lati addizionali? questo è l'argomento del prossimo paragrafo.
  • 53. 2.7. PERCORSI E CICLI 53 2.7.2. Cotrees. Non cerco di tradurre il temine che indica chiaramente il complementare di un albero, quindi dato il grafo G = (V, EG) e l'albero coprente T = (V, ET ), il sottografo complementare C = (V, EC) dove EC = E − ET è il cotree. 2.7.2.1. BFS cotree. Il cotree dell'albero BFS del paragrafo Ÿ2.6.1 è: Come si può vedere, l'insieme dei lati del cotree EC = {e3, e5, e7, e10, e11} è l'insieme complementare dei lati ET = {e0, e1, e2, e4e6, e8, e9} dell'albero.
  • 54. 2.7. PERCORSI E CICLI 54 2.7.2.2. DFS cotree. Possiamo fare la stessa cosa con l'albero DFS:
  • 55. 2.7. PERCORSI E CICLI 55 2.7.3. Cyclomatic number. (Anche in questo caso preferisco non tradurre il termine) Sappiamo che il numero dei lati di un albero è |ET | = n − 1, pertanto il numero dei lati di un cotree è |EC| = |E|−|ET | = m−n+1; questo viene chiamato cyclomatic number ed è visualizzato nel tab proprietà dell'interfaccia graca del plugin: vedremo fra poco la ragione del suo nome.
  • 56. 2.7. PERCORSI E CICLI 56 2.7.4. Cicli. In un albero abbiamo un unico percorso fra due vertici; se ag- giungiamo un lato del cotree (quì di seguito abbiamo usato un albero BFS e il suo cotree) abbiamo un circuito; il lato e3 del cotree unisce i vertici v2, v4 del grafo, ma fra questi esiste già un percorso nell'albero, esattamente il percorso v2Pv4 = (v2, v0, v4); il risultato nale è il percorso (v2, v0, v4) + (v4, v2) = (v2, v0, v4, v2); questo percorso speciale, dove possiamo partire da ogni vertice e raggiungerlo di nuovo è chiamato Ciclo.
  • 57. 2.7. PERCORSI E CICLI 57 Lo stesso succede con il lato e5:
  • 58. 2.7. PERCORSI E CICLI 58 E lo stesso con il lato e7:
  • 59. 2.7. PERCORSI E CICLI 59 E lo stesso con il lato e10
  • 60. 2.7. PERCORSI E CICLI 60 E lo stesso con il lato e11
  • 61. 2.7. PERCORSI E CICLI 61 2.7.5. Cicli Fondamentali. Come abbiamo visto, per ogni lato del cotree abbiamo un ciclo, questa è la ragione per la quale il numero dei lati del cotree m − n + 1 è chiamato cyclomatic number. Notate che il grafo può contenere un maggior numero di cicli, ma è importante osservare che qualsiasi altro ciclo può essere ottenuto a partire dai cicli precedenti, giusticando così il loro nome di Cicli Fondamentali. Combinando ad esempio il primo ed il quarto ciclo otteniamo il nuovo ciclo: {e1, e10, e6} + {e0, e3, e6} = {e1, e10, e3, e0}.
  • 62. 2.8. CONNECTIVITÀ 62 2.8. Connectività 2.8.1. Generalità. Abbiamo nora parlato di connettività come di una pro- prietà booleana di un grafo G, in realtà la connettività è una proprietà variabile, ad esempio i gra seguenti presentano gradi di connessione molto diversi: nel primo è suciente eliminare il lato centrale o uno solo dei vertici centrali per disconnetterlo in due parti separate; nel secondo l'eliminazione di parecchi lati e/o vertici lascia il grafo comunque connesso; analizziamo meglio questa proprietà chiamata Connettivita.
  • 63. 2.8. CONNECTIVITÀ 63 2.8.2. Bridges. Un Bridge è un lato la cui eliminazione separa il grafo come il lato (v1, v3) della gura che separa la parte {v0, v1, v2} dalla parte {v3, v4, v5} del grafo.
  • 64. 2.8. CONNECTIVITÀ 64 2.8.3. Cutpoints. Un vertice la cui cancellazione disconnette il grafo è detto Cutpoint: nel grafo della gura la cancellazione del vertice 5 disconnette il grafo, quindi il vertice 5 è un cutpoint; lo stesso vale per il vertice 6.
  • 65. 2.8. CONNECTIVITÀ 65 2.8.4. Vertex-connectivity Line-connectivity. I due ultimi gra sono particolari, hanno un bridge e due cutpoint; non tutti i gra hanno bridge e/o cutpoint; normalmente è necessario cancellare un certo numero di lati o di vertici per disconnettere il grafo; mantenendo questi due aspetti separati, possiamo parlare di Vertex-connectivity e Line-connectivity. La connettività è molto legata ai disjoint paths, specicamente la vertex-connectivity con i vertex-disjoint-paths e la edge-connectivity con gli edge-disjoints-paths; si potrebbe anzi dimostrare con facile evidenza che eliminando un vertice (lato) si sopprime un vdp (edp) e quindi il loro numero deve coincidere; il numero k di vertici (lati) necessari a disconnettere il grafo danno il livello di connettività e parliamo di vertex(edge)-connectivity = k. Ovviamente la connettività varia a seconda della coppia di vertici interessati; in tal caso si parla di connettività locale; il valore minimo fornisce la connettività del grafo.
  • 66. 2.8. CONNECTIVITÀ 66 2.8.4.1. Vertex-disjoint. In generale, in un grafo G abbiamo più percorsi fra due vertici; siamo interessati ai percorsi particolari che non condividono vertici, i cosiddetti Vertex-Disjoint Paths; nel grafo sottostante (da F.Harary, Graph Theory, Addison Wesley, 1969, p. 44), dal vertice a al vertice h abbiamo il percorso (a, c, l, h):
  • 67. 2.8. CONNECTIVITÀ 67 e il percorso (a, d, f, h): Ogni percorso può essere variato, ad esempio l'ultimo percorso può essere sosti- tuito con (a, b, e, d, f, i, g, h), ma il numero di percorsi senza vertici condivisi rimane 2, questa è una proprietà invariante del grafo. Quindi il concetto può essere parafrasato: in un grafo il numero di vertex- disjoint paths fra due vertici è sso; quelli visualizzati sono due fra i molti percorsi disponibili.
  • 68. 2.8. CONNECTIVITÀ 68 2.8.4.2. Vertex-connectivity. La proprietà vista sopra è un'importante indice della connettività del grafo; è evidente che la cancellazione di un vertice da ogni percorso distrugge la connessione del grafo; nell'esempio sotto la cancellazione del vertice c di un percorso e del vertice d dell'altro (o la cancellazione dei vertici f e l) disconnette il grafo; pertanto il numero dei vertex- disjoint paths eguaglia il numero dei vertici la cui eliminazione disconnete il grafo; il valore minimo di tale numero per tutte le coppie di vertici è detto Vertex- connectivity del grafo G; il suo valore è riportato nel riepilogo informativo.
  • 69. 2.8. CONNECTIVITÀ 69 2.8.4.3. Edge-disjoint. In questo capitolo siamo invece interessati a quei per- corsi particolari che non hanno lati condivisi, i cosiddetti Edge-Disjoint Paths; nel grafo sottostante (da F.Harary, Graph Theory, Addison Wesley, 1969, p. 44), dal vertice a al vertice h abbiamo il percorso (a, d, l, h):
  • 70. 2.8. CONNECTIVITÀ 70 il percorso (a, e, d, f, h):
  • 71. 2.8. CONNECTIVITÀ 71 e il percorso (a, c, l, i, h): Come nel caso precedente dei VDP, anche in questo caso ogni percorso può avere diverse varianti, ma il loro numero è comunque 3, anche questa è una proprietà invariante del grafo.
  • 72. 2.8. CONNECTIVITÀ 72 2.8.4.4. Line-connectivity. Anche questa proprietà è un'importante indice del- la connessione di un grafo; risulta evidente che l'eliminazione di un lato di ogni percorso distrugge la connessione del grafo; nell'esempio sotto l'eliminazione del lato d − l del primo percorso, del lato d − f del secondo e del lato c − l del terzo disconnette il grafo; pertanto il numero degli edge-disjoint paths eguaglia il numero di lati la cui cancellazione separa il grafo; il valore minimo fra quelli di tutte le coppie di vertici è detto Edge-connectivity del grafo G; il suo valore è riportato nel riepilogo informativo del grafo.
  • 73. 2.9. SHORTEST PATHS 73 2.9. Shortest Paths 2.9.1. Generalità. Anche in questo caso preferisco non tradurre il termine peraltro a tutti noto data la larga introduzione dei navigatori per autoveicoli. Come già detto, in un grafo connesso G possiamo raggiungere, a partire dal vertice generico p, ogni altro vertice del grafo; questo può essere fatto in diversi modi, quindi possiamo chiederci: quale la strada più breve da p a q? Anche i criteri da soddisfare possono essere diversi, ad esempio la distanza (la via più corta da p a q), il costo (la via meno costosa da p a q) e così via. Noi unichiamo tutti i possibili criteri nella proprietà già introdotta del peso, quindi usiamo il termine più corto come sinonimo di più leggero, esattamente come abbiamo visto a proposito del Minimum Spanning Tree, con la sola dierenza che adesso siamo interessati solo nel percorso da p a q.
  • 74. 2.9. SHORTEST PATHS 74 2.9.1.1. Single Shortest Path (Dijkstra). L'algoritmo di Dijkstra assolve a questo compito; sotto è evidenziato il percorso più breve dal vertice 1 al vertice 9 del grafo pubblicato da J.A.Bondy, U.S.R.Murty, Graph Theory, Springer, 2008, g. 6.7, pag. 150: il percorso transita dai vertici (1, 3, 9); il suo peso totale è 2.00: fra tutti i percorsi da 1 a 9, il percorso evidenziato è il più corto o, se preferite, il più leggero.
  • 75. 2.9. SHORTEST PATHS 75 2.9.1.2. All Shortest Paths SP (Dijkstra). Lo stesso algoritmo di Dijkstra può essere usato per conoscere tutti i shortest paths da un vertice a tutti gli altri; sotto è visualizzato il percorso fra il vertice 6 e il vertice 9: (6, 12, 7, 3, 9) di peso totale 7.00:
  • 76. 2.9. SHORTEST PATHS 76 e quì il percorso fra i vertici 6 e 10: (6, 12, 7, 3, 1, 4, 10) di peso totale 10:
  • 77. 2.10. RAPIDA INTRODUZIONE AI GRAFI ORIENTATI ED ALLE RETI 77 2.10. Rapida Introduzione ai Gra orientati ed alle Reti Come abbiamo visto, i gra sono un potente modello matematico applicabile in molti settori della Scienza o dell'Industria; tuttavia la loro generalità deve essere compressa per adattarli a speciche situazioni; quì introduco brevemente i principali sviluppi dei gra; lo faccio solo per dare un quadro più completo della materia al lettore, senza entrate in dettaglio; il presente lavoro si limita ai gra: voglio rimarcare la loro importanza come base per ulteriori sviluppi. 2.10.1. Gra orientati. Nella teoria dei Gra il lato che connette il vertice p al vertice q, connette vicendevolmente il vertice q al vertice p, cioè è simmetrico; ma nella realtà non è sempre così, ci sono situazioni dove un lato connette p con q, ma non viceversa; basta pensare ai sensi unici stradali; probabilmente lo stesso vale per i circuiti elettronici; o al usso del sangue nelle vene e arterie del nostro corpo. In questi casi la direzione è importante, quindi viene considerata nei gra con orientazione o gra orientati, detti in breve Digraphs. 2.10.2. Networks. In speciche applicazioni la direzione non è suciente; ad esempio nelle analisi di traco e di trasporto la conoscenza delle direzioni è neces- saria per sapere se dal vertice p si può raggiungere il vertice q; anzi, l'introduzione degli algoritmi per la ricerca dei percorsi più brevi sono un grande aiuto per ragioni economiche evidenti; bene, ma questo non è suciente: probabilmente vogliamo anche sapere quanti veicoli possono transitare sulle strade, quanti prodotti possi- amo trasportare e così via. In questi casi dobbiamo introdurre due nuove proprietà degli arcs (questo è il nome usuale che viene usato per i lati nei gra orientati): la capacità c ed il usso f con la clausola f ≤ c. Spero in un prossimo futuro di essere in grado di trattare anche questi problemi, per il momento devo chiudere quì.
  • 78. 2.11. RIEPILOGO INFORMATIVO 78 2.11. Riepilogo Informativo Molte delle proprietà esaminate sopra sono riportate nel riepilogo del tab Prop compilato al caricamento dei dati del grafo:
  • 79. CAPITOLO 3 Ambiente Analitico Come ulteriore dimostrazione delle prestazioni del mio plugin, proverò ad ap- plicarle ad un caso concreto, il grafo stradale della mia città, Melegnano, vicino Milano, Italia: Questo è il grafo semplicato estratto da uno shapele e convertito in un grafo riconoscibile dal mio plugin. Avvertenza: Come ho detto, analizzo una rete come fosse un grafo, senza considerazione cioè della direzione delle strade. Propongo questa analogia: il grafo stradale è hardware e la direzione di marcia è software (essendo possibile cambiarla con un provvedimento amministrativo), il presente studio quindi può essere visto come analisi hardware; lascio la analisi software a futuri sviluppi del mio lavoro. 79
  • 80. 3. AMBIENTE ANALITICO 80 Il riepilogo dice • 179 vertici • 237 lati • peso totale 28537m (ho usato la lunghezza in metri delle strade come peso del grafo) • il grafo è connesso pertanto non ci sono componenti • grado minimo 1 (ci sono molte strade a fondo chiuso) • grado massimo 4 • grado medio 2.6 • il grafo è non pari non dispari non bipartito • cyclomatic number 59 • 49 cutpoint (uso due algoritmi sperimentali per il calcolo e il riepilogo dice che la vers. A dell'algoritmo fornisce un numero dierente di cupoint: faccenda da approfondire) • 50 bridge; per quanto riguarda la connettività aggiungerò qualcosa sotto.
  • 81. 3.1. CUTPOINT 81 3.1. Cutpoint Guardando qualche dettaglio, possiamo evidenziare i cutpoint, tutti insieme:
  • 82. 3.1. CUTPOINT 82 o uno alla volta: Il caso evidenziato è abbastanza signicativo: l'eliminazione o la messa fuori servizio del vertice v108 disconnette il grafo, in tal caso il vertice v109, un centro civico (scuola, piscina, campo di calcio, ecc.), non sono più raggiungibili, ma anche il vertice v111, la connessione con la rete regionale è impedito.
  • 83. 3.2. BRIDGE 83 3.2. Bridge Un altro aspetto sono i bridge, tutti insieme:
  • 84. 3.2. BRIDGE 84 o uno alla volta: molti bridge sono costituiti dalle strade a fondo chiuse di cui abbiamo parla- to, quindi sono relativamente poco importanti data la modesta inuenza sul grafo generale; più importante ovviamente il bridge v108 − v111, non visualizzato nella gura, ma presente nella precedente: la sua defezione causa la stessa disconnessione vista a proposito del cutpoint v108.
  • 85. 3.3. MINIMUM SPANNING TREE 85 3.3. Minimum Spanning Tree Un aspetto a mio avviso molto interessante è il Minimum Spanning Tree nella gura sotto: la lunghezza totale, ricordo, del grafo è di 28.5m, la lunghezza totale del MST è di 17km. C'è una vecchia discussione nella mia città circa le piste pedonali e/o ciclabili; come spesso succede in Italia le discussioni sono lunghe, le piste ciclopedonali un pò meno ..... Comunque, suppongo che le risorse per questa infrastruttura a rete siano limi- tate e la necessità di dotare l'intera città di piste signica attrezzare oltre 28km di strade. Se trattiamo le piste ciclopedonali come una risorsa pregiata, del tipo di quella considerata da J.A.Bondy, U.S.R.Murty, Graph Theory, Springer, 2008, 6.2, g. 6.5, p. 165, già citata al paragrafo Ÿ2.6.4, potremmo pensare al MST come ad una possibile soluzione: basterebbe attrezzare 17km di piste, poco più della metà dell'intera lunghezza, per consentire l'attraversamento di tutta la città e rendere accessibili tutti i suoi punti cruciali. Peraltro andrebbero considerate anche le piste già esistenti che, coordinate nel quadro complessivo, potrebbero abbassare ancora il costo e le risorse necessarie. Avvertenza: il costo delle piste e la loro maggiore o minore lunghezza non sono i soli criteri; se lasciassi per un momento i panni del matematico dilettante e rivestissi quelli di architetto che ho appena dismesso, certamente analizzerei molti altri aspetti; quello che penso, rientrando velocemente nei più comodi panni del matematico, è che l'informazione è molto utile per chi deve decidere, un punto fermo da mettere insieme ad altri per costruire il giusto progetto ed il miglior mosaico decisionale.
  • 86. 3.4. SHORTEST PATHS 86 3.4. Shortest Paths Guardiamo ora i Shortest Paths, il singolo Shortest Paths, ad esempio, dal vertice v86 al vertice v173:
  • 87. 3.4. SHORTEST PATHS 87 o tutti i Shortest Paths dallo stesso vertice v86; i percorsi possono essere visualizzati uno alla volta, nella gura sotto è mostrato il percorso da v86 a v153. Avvertenza: questa analisi è la stessa disponibile nella Network Analysis Li- brary di QGIS o negli altri plugin citati all'inizio; con tutta probabilità questi ultimi sono più ecienti e robusti del mio; come ho detto più volte, la duplicazione degli algoritmi nel mio plugin ha essenzialmente scopi didattici.
  • 88. 3.5. VERTEX DISJOINT PATHS 88 3.5. Vertex Disjoint Paths Un interessante aspetto sono i Vertex Disjoint Paths; li abbiamo calcolati fra il vertice v89, il centro città, e il vertice v44, la connessione verso nord (Milano); come si può vedere dalle gure seguenti, ci sono tre di questi percorsi, il primo:
  • 89. 3.5. VERTEX DISJOINT PATHS 89 il secondo:
  • 90. 3.5. VERTEX DISJOINT PATHS 90 e il terzo: Tutte le strade interessate sono a doppio senso di marcia per cui in questo caso l'analisi hardware coincide con quella software. É importante sottolineare la nozione di connettività locale: la connessione fra centro città e rete regionale nord è sucientemente robusta: occorre mettere fuori gioco contemporaneamente tre vertici per distruggere questa connessione.
  • 91. 3.6. EDGE DISJOINT PATHS 91 3.6. Edge Disjoint Paths Analoghi ai vertex-disjoint sono gli Edge Disjoint Paths, la dierenza consiste nel fatto che quì è possibile anche attraversare un vertice già passato, mentre tutti i lati del percorso devono essere dierenti; usando ancora i vertici v89 e v44, abbiamo tre percorsi, il primo:
  • 92. 3.6. EDGE DISJOINT PATHS 92 il secondo:
  • 93. 3.6. EDGE DISJOINT PATHS 93 e il terzo: Nota matematica: detti κ (G) la vertex-connectivity, λ (G) la edge-connectivity e δ (G) il grado minimo, vale il teorema di Whitney: κ (G) ≤ λ (G) ≤ δ (G) (F.Harary, Graph Theory, Addison Wesley, 1969, th. 5.1 pag. 43); nel nostro caso abbiamo κ (G) = 3, λ (G) = 3 e δ (G) = min (dv044, dv089) = 3, il teorema di Whitney κ (G) = λ (G) = δ (G) risulta vericato.
  • 94. 3.7. CONNETTIVITÀ 94 3.7. Connettività 3.7.1. Un Suggerimento. Abbiamo visto l'importanza della vertex- e della edge-connectivity per la comprensione della struttura del grafo; spesso i gra con- tengono molti vertici terminali, quindi sono numerosi i cutpoint ed i bridge; questi cutpoint e/o bridge sono banali, noti e non molto importanti in quanto incidono su una parte limitata del grafo; peggio, questa moltitudine nasconde altri even- tuali importanti cutpoint e bridge, pertanto recuperiamo un risultato già visto al paragrafo Ÿ2.6.6: il fogliame del grafo. Eliminando no ad esaurimento i vertici terminali, raggiungiamo un sottografo che ho chiamato core; quello sotto è il core del grafo stradale di Melegnano:
  • 95. 3.7. CONNETTIVITÀ 95 Applicando le analisi viste a questo sottografo possiamo scoprire aspetti molto interessanti: (1) ci sono quattro cutpoint (v6, v21, v22, v158) (2) c'è un bridge (v21-v22). 3.7.2. Vertex Connectivity. Abbiamo già visto al paragrafo Ÿ 2.8.4 l'im- portanza della vertex-connectivity di un grafo; questa sotto è la statistica del grafo stradale di Melegnano: numero di coppie 8197 minimo 1 per la coppia ['v 0', 'v 12'] media 1.73 massima 4 per la coppia ['v 1', 'v 4'] sqm 0.66 Confesso che il dato medio (1.73) mi preoccupa perchè quì stiamo trattando il sottografo depurato dai nodi terminali e mi sarei aspettato un valore almeno superiore a 2. (Nota 1: ora il plugin ore anche la distribuzione statistica della vertex-connectivity; questa tabella è stata preparata con una versione precedente che non la prevedeva; aggiornerò quanto prima i dati). (Nota 2: La tabella è stata completata con una versione standalone dell'appli- cazione perchè il calcolo dei VDP di tutte le coppie di vertici costituisce un processo troppo lungo per una sessione interattiva come il plugin). 3.7.3. Edge Connectivity. Questa è la statistica della edge-connectivity del grafo stradale di Melegnano: numero di coppie 8385 minimo 1 per la coppia ['v 0', 'v 12'] media 2.10 massima 4 per la coppia ['v 1', 'v 4'] sqm 0.68 la distribuzione della connettività per grado è la seguente
  • 96. 3.7. CONNETTIVITÀ 96 grado frequenza % 0 0 0 1 1510 18 2 4554 54 3 2288 27 4 33 1 totale 8385 100 Avanzo un'ipotesi: abbiamo già visto la presenza del bridge (v20, v21); questo bridge divide il grafo in due blocchi di circa 10 ÷ 12 vertici a nord-est e i rimanenti 130 − 10 ÷ 12 = 118 ÷ 120 (ricordate che stiamo trattanto con il core del grafo stradale) per un totale di 118÷120×10÷12 = 1200÷1416 coppie, quindi le coppie con edge-connection = 1 sono probabilmente collegate con quel bridge; possiamo pensare che il restante grafo è sostantialmente robusto). (Nota: Come sopra la tabella è stata completata con una versione standalone dell'applicazione perchè il calcolo degli EDP di tutte le coppie di vertici costituisce un processo troppo lungo per una sessione interattiva come il plugin).
  • 97. CAPITOLO 4 Conclusioni Non credo ci siamo molte conclusioni da trarre; ho sostanzialmente raccontato quello che avevo in mente di dire; spero di aver dato una suciente informazione sul plugin che ho realizzato e spero che possa essere di aiuto a qualcun altro studente di gra. Resto a disposizione ed in attesa di suggerimenti, consigli, contributo e critiche, nell'attesa vedrò di approfondire qualcosa sui gra orientati e le reti. Grazie. 97