Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Algoritmi - Algortimi, Rappresentazione di un grafo mediante matrice
Forum - Algoritmi - Algortimi, Rappresentazione di un grafo mediante matrice

Avatar
tlearner (Normal User)
Newbie


Messaggi: 1
Iscritto: 02/04/2012

Segnala al moderatore
Postato alle 19:24
Lunedì, 02/04/2012
Salve a tutti!! (essendo nuovo ne approfitto per salutarvi, complimenti veramente un ottimo sito)

Passo subito al problema senza altri giri di parole.

Mi sono imbattuto in algoritmi riguardanti i grafi, e devo ammettere che faccio fatica a comprendere alcune cose:
- Ho capito che per rappresentare un grafico a livello logico posso utilizzare un array bidimensionale (una bella matrice) dove le colonne rappresentano il "valore" del vertice nel grafo e come valore possiamo associare un costo, il punto è: come determino il percorso minimo? (cioè che attraversa il minor numero di archi)
- il massimo? ecc (cioè che attraversa il maggior numero di archi)
e come faccio a sommare i costi di un determinato percorso?

ovviamente si tratta di scandire la matrice ma sto incontrando più di qualche problema.. ho cercato cercato cercato ma ci sono solo algoritmi che spiegano in teoria (tra l'altro graficamente e logicamente non è complicato, ma a livello di codice mi sfugge), in pratica nulla.

PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 437
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 20:54
Lunedì, 02/04/2012
mmmmm non sottovalutare i'approccio concettuale per questo tipo di cose...
prima di tutto devi avere ben chiaro un paio di cose per implementare l'algoritmo dei cammini minimi:

1)cos'è e come si effettua una visita BFS di un grafo indipendentemente dalle strutture usate per implementarlo
2)cos'è e come si implementa un Min/Max Heap o coda con priorità.
3)cos'è e come si implementa un albero (che sarà l'albero di copertura del grafo)

per risolvere il problema dei cammini min/max devi implementare l'algoritmo di Dijkstra
http://it.wikipedia.org/wiki/Algoritmo_di_Dijkstra
(giusto la pratica che cercavi)
  
se ti può essere d'aiuto ho scritto degli esempi di manipolazione dei grafi mediante matrice di adiacenza, matrice di incidenza, liste di adiacenza ecc..
http://www.pierotofy.it/pages/sorgenti/dettagli/19052-Coll ...

Comunque in breve l'algoritmo funziona cosi (trovare il cammino minimo da nado A a nodo B):

1)inizializzo un albero T  con nodo A radice e tutti gli altri nodi figli di A e distanza da a "infinito"
   struttura di un nodo {value, distanza}
2)inserisco A in un Min-heap M
3)
   while(!CODAVUOTA(M))
     estraggo un nodo i
     while(per ogni nodo adiacente j di i){
        if(distanza di i + il costo dell'arco C_ij < distanza di j){
             j diventa figlio di i in T
             e la distanza di j diventa
             dj = distanza di i + il costo dell'arco C_ij;
               if(se j non è presente in M){
                   INCODA(j, M);
               }
        }
       passa al prossimo nodo adiacente
     }

in definitiva si ottiene un albero di copertura T con il nodo A radice e il nodo B un nodo generico o foglia del grafo segue facendo una visita dell'albero partendo dal nodo radice fino a trovare il nodo B.
se hai ben capito cos'è e come funziona una BFS si capisce subito che questo algoritmo si basa su di essa!

ecco anche questo ti sarà utile
http://www.pierotofy.it/pages/sorgenti/dettagli/19089-NetA ...
li ho caricati per questo motivo :k:

Ultima modifica effettuata da Bonny il 02/04/2012 alle 21:08
PM Quote
Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Segnala al moderatore
Postato alle 8:06
Martedì, 03/04/2012
Allora prima di partire con gli algoritmi sui grafi devi capire bene come implentare un grafo .
(Per semplificare la cosa faccio un esempio prendendo come esempio questo grafo: http://upload.wikimedia.org/wikipedia/commons/thumb/5/5b/6 ...
Matrice di adiacenza
Si alloca una matrice 6x6 di bool e per indicare che A è collegato a B si mettere il valore TRUE nella cella MATRICE[A][B];
Nell'esempio:
MATRICE[6][4]=TRUE;
MATRICE[4][5]=TRUE;
MATRICE[4][3]=TRUE;
ecc..
Tuttavia nell'esempio il grafo non è diretto quindi bisogna fare anche il collegamento da B ad a, quindi:
MATRICE[4][6]=TRUE;
MATRICE[5][4]=TRUE;
MATRICE[3][4]=TRUE;
ecc..
Questo metodo è molto veloce a capire se A è collegato a B ma lento a restituire tutti i figli di un nodo. Se vuoi un metodo migliore impara le liste di adiacenza.
In conclusione per calcolare il percorso minimo o massimo basta usare http://it.wikipedia.org/wiki/Algoritmo_di_Dijkstra . Sembra difficile ma l'esempio a fine pagina è molto intuitivo.

PM Quote