La figura aprendizaje camino más corto (Dijkstra)

1: Dijkstra algoritmo

  El algoritmo se puede realizar algoritmo codicioso, partiendo del punto de partida para encontrar la distancia más corta desde otros puntos, encontrar el vértice de la distancia más corta, y luego en el vértice como punto de tránsito, para encontrar

A partir de punto de tránsito a otros vértices distancia más cercana, con el fin de encontrar la ruta paso a paso a través óptima elección!

2: proceso algorítmico

 

Como se muestra en el flujo de la figura, la distancia a otro v0 vértice se establece en una ruta de array [0,1,5,65535,65535,65535,65535,65535,65535] donde v0 65535 sustituyendo la distancia entre el punto a ser infinito. En primer lugar, encontramos el vértice más cercano en el camino hacia la v1, v1 entonces como punto de tránsito para actualizar la matriz, cómo actualizar Nepal? V0 a V1 a través de unirse ruta y llega al otro v0 vértice es menor que el camino directamente al otro vértice, en lugar de utilizar directamente los valores en la matriz de camino más pequeño. A su vez continuar el ciclo venir y encontrar V0 a v2, v3, v4 a, a V5, V6, V7 a V8 de la distancia. En él.

 

3: Ejemplo de código

 

Pena nearstWay paquete de; 

importación sun.security.util.Length; 

/ * * 
 * @author: Dazhu 
 * @date: Creación: 18/03/2020 11:37 
 * @description: ruta más corta 
 * @modified Por: 
 * @version: $ 
 * / 
público  clase los principales {
     público  estáticas  void principales (String [] args) {
         // crear una matriz vértice, la adyacencia matriz 
        int INF = 65535 ; 
        vértice [] VertexList = nuevo nuevo vértice [] {
                 nuevo nuevo vértice ( " V0 " ),
                 nueva nuevo vértice ( " v1" ),
                 Nuevo Vertex ( " v2 " ),
                 nuevo Vertex ( " v3 " ),
                 nuevo Vertex ( " v4 " ),
                 nuevo Vertex ( " v5 " ),
                 nuevo Vertex ( " v6 " ),
                 nuevo Vertex ( " v7 " ) ,
                 nuevo Vertex ( " V8 " ) 
        };
        En t[] [] AdjMat = nuevo  int [] [] { 
                {   0 ,   1 ,   5 , inf, inf, inf, inf, inf, inf}, 
                {   1 ,   0 ,   3 ,   7 ,   5 , inf, inf, inf, inf}, 
                {   5 ,   3 ,   0 , inf,   1 ,   7 , inf, inf, inf}, 
                {inf,   7 , inf,   0 ,   2 , inf,   3 , inf, inf}, 
                {inf,   5 ,  1 ,   2 ,   0 ,   3 ,   6 ,   9 , inf}, 
                {inf inf,   7 , inf,   3 ,   0 , inf,   5 , inf}, 
                {inf inf inf,   3 ,   6 , INF,   0 ,   2 ,   7 }, 
                {inf inf inf inf,   9 ,   5 ,   2 ,   0 ,   4 }, 
                {inf inf inf inf inf inf,   7 ,   4,   0 }, 
        }; 
        Gráfico G = nuevo nuevo Graph (VertexList, adjMat); 
        el Dijkstra DJK = nuevo nuevo el Dijkstra (G); 
        djk.findNearestWay ( 0 ); 
    } 
} 
clase el Dijkstra {
     público Gráfico G = nulo ;
     público  int nVertex;
     público  int [] pathMatirx; // para el almacenamiento de tabla de matriz del camino más corto 
    pública  int [] shortPathTable; // para almacenar punto más corta valor de peso camino correcto 
    público  int [] markArr; //markArr [k] = 1 se obtiene representante de la ruta más corta vk v0 al 
    público el Dijkstra (Gráfico G) {
         el este .g = G;
         el este .nVertex = g.vertexList.length;
         // inicializa una matriz de acuerdo con el número de vértices de salida gráfica 
        el este .pathMatirx = new new  int [nVertex];
         el este .shortPathTable = new new  int [nVertex];
         el este .markArr = new new  int [nVertex]; 
    } 

    público  void findNearestWay ( int V0) {
         int V = 0 , W = 0 , K = 0;
         Int min;
         // inicializar los datos 
        para ( int I = 0 ; I <nVertex; I ++ ) {
             el este .markArr [I] = 0 ;
             // initialize a shotPathTable otra v0 vértice es la distancia 
            del este .shortPathTable [I] = G .adjMat [v0] [I];
             // array initialize de trayectorias es 0 
            el este .pathMatirx [I] = 0 ; 
        } 
        // necesidad Representante a la ruta de reclamación entre v0 v0! ! 
        la presente .markArr [ 0 ] = 1. ;
         // iniciar el bucle principal, cada ciclo de V0 para encontrar el camino más corto entre un vértice v, hasta que todos los vértices están buscando! ! ! 
        para (V =. 1 ; V <nVertex; V ++ ) { 
            min = 65535 ; // conocimiento actual de la distancia desde la v0 más cercano, inicializado a un valor adecuado mayor
             // Encuentra la más cercana vértice v0 en 
            para (W = 0 ; W <nVertex; W ++ ) {
                 // si y sólo si el punto es encontrar el camino más corto no es menor que la trayectoria inferior y min 
                iF ((markArr [W] == 0 ) && shortPathTable [W] < min) {
                     // Guardar el camino más corto hasta el vértice K 
                    K = W;
                     // se sustituye por el camino más corto min 
                    min = shortPathTable [W]; 
                } 
            } 
            //El momento encontrar el conjunto vértice más cercano a 1, lo que representa V0 a VK ha encontrado el camino más corto hacia 
            el este .markArr [k] = 1 ; 

            // revisar la ruta actual y la distancia más corta! !
            // Si v0 a través de la distancia previamente determinada alcanza otra vk vértice, v0 es menor que la distancia de las otras líneas rectas en el vértice
             // actualización v0 shortPathTable en [] es la distancia más corta 
            para (W = 0 ; W <nVertex; W ++ ) {
                 IF ( markArr [W] == 0 && g.adjMat + min [K] [W] < shortPathTable [W]) { 
                    shortPathTable [W] = min + g.adjMat [K] [W]; 
                    pathMatirx [W] = K; 
                } 
            } 
        } 
    } 
} 

clase{Graph
     público   Vertex [] VertexList;
     público  int adjMat [] [];
     públicas  int Nverts; 

    público Graph (Vertex [] VertexList, int [] [] adjMat) {
         // inicialización, la matriz vértice 
        del este .vertexList = VertexList;
         // la creación de un lado de la matriz 
        de la presente .adjMat = adjMat;
         // vértice inicial de ordenar 
        el este .nVerts = 0 ; 

    } 
    // vértice añadido a la matriz de vértice 
    público  void addVertex (String Lab) { 
        VertexList [Nverts ++] = new new  vértice (Lab);
    }

     // Añadir borde a borde de la matriz
     // peso 0: un peso de 0 está conectado
     // peso k: k se conecta a la derecha
     // infinito peso: no conectado al 
    público  vacío addEdge ( int inicio, int final, int peso) { 
        adjMat [Inicio] [Fin] = peso; 
        adjMat [Fin] [Inicio] = peso; 
    } 

    // mostrar todos los vértices 
    públicos  vacíos showVertexs () {
         para ( int I = 0 ; I <vertexList.length; I ++ ) { 
            el Sistema . OUT .println (VertexList [I]);
        } 
    } 
    // 
    }Imprimir vértices especifican 
    público  void printVertex ( int V) { 
        el sistema. OUT .println (VertexList [V] .label); 
    } 

} 


// estructura de clases vértice
 // vértice puede estar presente en la matriz, que se denota por el índice,
 // curso puede estar presente en la lista 
de clase Vertex {
     público etiqueta de cuerda; // etiqueta 
    público Boolean wasVisited; // si indicios atravesado. 
    público Vertex (etiqueta String) {
         el este .label = etiqueta; 
        wasVisited = false ; 
}

 

Supongo que te gusta

Origin www.cnblogs.com/dazhu123/p/12519611.html
Recomendado
Clasificación