04. Algoritmo di Dijkstra
Ecco la nostra implementazione per l'algoritmo, utilizzando un metodo statico della classe Dijkstra.java
/*
* Algoritmi di Routing
*
* @author Francesco Mancuso
* @version 1.3
* @docs https://routing.francescomancuso.it
*
*/
package it.mancuso.mst.algoritmi;
import it.mancuso.mst.utils.Clipboard;
import java.util.ArrayList;
import java.util.List;
public class Dijkstra {
public static void doIt(int nNodi, int matrice[][]) {
// Utilizzo di un array di liste per memorizzare i predecessori
List<List<Integer>> predecessori = new ArrayList<>();
// Inizializziamo ogni nodo con una nuova lista vuota
for (int i = 0; i < nNodi; i++) {
predecessori.add(new ArrayList<>());
}
// Inizializziamo la matrice risultato
int risultato[][] = new int[nNodi][3];
for (int i = 0; i < nNodi; i++) {
risultato[i][0] = i; // N Nodi
risultato[i][1] = Integer.MAX_VALUE; // Costo
risultato[i][2] = 0; // Esaminato
}
risultato[0][1] = 0; // Costo zero per il nodo 0
predecessori.get(0).add(-1); // Nessun predecessore per il nodo 0
for (int n = 0; n < nNodi; n++) {
// Scorro ogni nodo
int nodoAttuale = 0;
// 1. Trovare il nodo con il costo minore e non esaminato
int min = Integer.MAX_VALUE;
for (int m = 0; m < nNodi; m++) {
if ((min > risultato[m][1]) && (risultato[m][2] == 0)) {
min = risultato[m][1];
nodoAttuale = m;
}
}
int costoIniziale = risultato[nodoAttuale][1];
risultato[nodoAttuale][2] = 1; // Nodo esaminato
// 2. Controlla tutti i valori dalla matrice e aggiornali se sono minori dei costi attuali
for (int r = 0; r < nNodi; r++) {
if ((matrice[nodoAttuale][r] == Integer.MAX_VALUE) || (risultato[r][2] != 0)) {
continue;
}
int temp = costoIniziale + matrice[nodoAttuale][r];
if (temp < risultato[r][1]) {
risultato[r][1] = temp;
predecessori.get(r).clear();
predecessori.get(r).add(nodoAttuale);
} else if (temp == risultato[r][1]) {
// Considera altri predecessori
predecessori.get(r).add(nodoAttuale);
}
}
}
// Stampa del risultato e salvataggio negli appunti
}
}
Risoluzione di problemi
Passi di risoluzione per problemi comuni:
- Se il programma, una volta scelto l'algoritmo, non trova il percorso minimo o entra in un loop infinito, assicurati che la matrice contenga un grafo connesso.