lunes, 15 de abril de 2013

EJEMPLO DE IMPLEMENTACIÓN DEL ALGORITMO


Hallar el camino mínimo desde el vértice 3 hasta 4 en el grafo con la siguiente matriz de distancias:


Aplicamos el algoritmo de Floyd-Warshall, y para ello en cada iteración fijamos un vértice intermedio.

1ª Iteración: nodo intermedio = 1
La matriz es simétrica, por lo que solamente hará falta calcular el triángulo superior de las distancias.
d23 = min(d23, d21 + d13) = 8
d24 = min(d24, d21 + d14) = 4
d25 = min(d25, d21 + d15) = 9
d26 = min(d26, d21 + d16) = Descripción: \infty
d32 = min(d32, d31 + d12) = 8
d34 = min(d34, d31 + d14) = 6
d35 = min(d35, d31 + d15) = 7
d36 = min(d36, d31 + d16) = 1
d45 = min(d45, d41 + d15) = Descripción: \infty
d46 = min(d46, d41 + d16) = 4
d56 = min(d56, d51 + d16) = Descripción: \infty
La matriz de distancia después de esta iteración es:



2ª Iteración: nodo intermedio = 2
d13 = min(d13, d12 + d23) = 5
d14 = min(d14, d12 + d24) = 1
d15 = min(d15, d12 + d25) = 12
d16 = min(d16, d12 + d26) = Descripción: \infty
d34 = min(d34, d32 + d24) = 6
d35 = min(d35, d32 + d25) = 7
d36 = min(d36, d32 + d26) = 1
d45 = min(d45, d42 + d25) = 13
d46 = min(d46, d42 + d26) = 4
d56 = min(d56, d52 + d26) = Descripción: \infty
La matriz de distancia después de esta iteración es:

3ª Iteración: nodo intermedio = 3
d12 = min(d12, d13 + d32) = 3
d14 = min(d14, d13 + d34) = 1
d15 = min(d15, d13 + d35) = 12
d16 = min(d16, d13 + d36) = 6
d24 = min(d24, d23 + d34) = 4
d25 = min(d25, d23 + d35) = 9
d26 = min(d26, d23 + d36) = 9
d45 = min(d45, d43 + d35) = 13
d46 = min(d46, d43 + d36) = 4
d56 = min(d56, d53 + d36) = 8
La matriz de distancia después de esta iteración es:

4ª Iteración: nodo intermedio = 4
d12 = min(d12, d14 + d42) = 3
d13 = min(d13, d14 + d43) = 5
d15 = min(d15, d14 + d45) = 12
d16 = min(d16, d14 + d46) = 5
d23 = min(d23, d24 + d43) = 8
d25 = min(d25, d24 + d45) = 9
d26 = min(d26, d24 + d46) = 8
d35 = min(d35, d34 + d45) = 7
d36 = min(d36, d34 + d46) = 1
d56 = min(d56, d54 + d46) = 8
La matriz de distancia después de esta iteración es:

5ª Iteración: nodo intermedio = 5
d12 = min(d12, d15 + d52) = 3
d13 = min(d13, d15 + d53) = 5
d14 = min(d14, d15 + d54) = 1
d16 = min(d16, d15 + d56) = 5
d23 = min(d23, d25 + d53) = 8
d24 = min(d24, d25 + d54) = 4
d26 = min(d26, d25 + d56) = 8
d34 = min(d34, d35 + d54) = 6
d36 = min(d36, d35 + d56) = 1
d46 = min(d46, d45 + d56) = 4
La matriz de distancia después de esta iteración es:

6ª Iteración: nodo intermedio = 6
d12 = min(d12, d16 + d62) = 3
d13 = min(d13, d16 + d63) = 5
d14 = min(d14, d16 + d64) = 1
d15 = min(d15, d16 + d65) = 12
d23 = min(d23, d26 + d63) = 8
d24 = min(d24, d26 + d64) = 4
d25 = min(d25, d26 + d65) = 9
d34 = min(d34, d36 + d64) = 5
d35 = min(d35, d36 + d65) = 7
d45 = min(d45, d46 + d65) = 12
La matriz de distancia después de esta iteración es:
Ya se han hecho todas las iteraciones posibles. Por tanto, el camino mínimo entre 2 vértices cualesquiera del grafo será el obtenido en la matriz final. En este caso, el camino mínimo entre 3 y 4 vale 5.


IMPLEMENTACION DEL ALGORITMO


package javaapplication15;

import javax.swing.JOptionPane;

/**
 *
 * @author Denis,lewis,johana
 */
public class JavaApplication15 {

    private int n;
    private int[][] A = new int[10][10];
    private int[] vect1 = new int[10];
    private int[] vect2 = new int[10];
    private int[][] B = new int[10][10];

    public void ingresar() {
        setN(Integer.parseInt(JOptionPane.showInputDialog(null, "Ingrese numero de nodos")));
        int i, j;
        for (i = 1; i <= getN(); i++) {
            for (j = 1; j <= getN(); j++) {
                getA()[i][j] = Integer.parseInt(JOptionPane.showInputDialog(null, "Ingrese la Matriz" + getA()[i][j]));
            }
        }
    }

    public void nodointer() {
        int i, j;
        for (i = 1; i <= 6; i++) {
            for (j = 1; j <= 6; j++) {
                if (i == j) {
                    getB()[i][j] = 0;
                } else {
                    getB()[i][j] = j;
                }
            }
        }
    }

    public void floid() {
        int bucle, i, j, suma;
        for (bucle = 1; bucle <= getN(); bucle++) {
            for (i = 1; i <= getN(); i++) {
                getVect1()[i] = getA()[bucle][i];
                getVect2()[i] = getA()[i][bucle];
            }
            for (i = 1; i <= getN(); i++) {
                for (j = 1; j <= getN(); j++) {
                    if (getVect2()[i] == 999 || getVect1()[j] == 999) {
                        suma = 999;
                    } else {
                        suma = getVect2()[i] + getVect1()[j];
                    }
                    if (suma < getA()[i][j]) {
                        getA()[i][j] = suma;
                        getB()[i][j] = bucle;
                    }
                }
            }
        }
    }

    public void mostrar1() {
        int i, j;
        JOptionPane.showInputDialog(null, "Imprime distancias o pesos optimo");
        for (i = 1; i <= getN(); i++) {
            for (j = 1; j <= getN(); j++) {
                JOptionPane.showMessageDialog(null, "Distancia es: " + getA()[i][j]);
            }
            JOptionPane.showMessageDialog(null, "\n\n");
        }
    }

    public void mostrar2() {
        int i, j;
        JOptionPane.showInputDialog(null, "Imprime matriz intermedios");
        for (i = 1; i <= getN(); i++) {
            for (j = 1; j <= getN(); j++) {
                JOptionPane.showMessageDialog(null, "Intermedios es:" + getB()[i][j]);
            }
            JOptionPane.showMessageDialog(null, "\n\n");
        }
    }

    public void preguntar() {
        int i, j;
        i = Integer.parseInt(JOptionPane.showInputDialog(null, "De que vertice a que vertice desea ir a: "));
        j = Integer.parseInt(JOptionPane.showInputDialog(null, "De que vertice a que vertice desea ir b: "));
        if (i == 0 || j == 0 || i == j) {
            JOptionPane.showMessageDialog(null, "Distancia minima es 0");
        } else {
            JOptionPane.showMessageDialog(null, "Distancia minima" + getA()[i][j] + "\n");
            JOptionPane.showMessageDialog(null, "Pasa por el: \t" + getB()[i][j] + "\t Y despues por el: \t" + j);
        }
    }

    public static void main(String[] args) {
        JavaApplication15 j = new JavaApplication15();
        j.ingresar();
        j.nodointer();
        j.floid();
        j.mostrar1();
        j.mostrar2();
        j.preguntar();

    }

    /**
     * @return the n
     */
    public int getN() {
        return n;
    }

    /**
     * @param n the n to set
     */
    public void setN(int n) {
        this.n = n;
    }

    /**
     * @return the A
     */
    public int[][] getA() {
        return A;
    }

    /**
     * @param A the A to set
     */
    public void setA(int[][] A) {
        this.A = A;
    }

    /**
     * @return the vect1
     */
    public int[] getVect1() {
        return vect1;
    }

    /**
     * @param vect1 the vect1 to set
     */
    public void setVect1(int[] vect1) {
        this.vect1 = vect1;
    }

    /**
     * @return the vect2
     */
    public int[] getVect2() {
        return vect2;
    }

    /**
     * @param vect2 the vect2 to set
     */
    public void setVect2(int[] vect2) {
        this.vect2 = vect2;
    }

    /**
     * @return the B
     */
    public int[][] getB() {
        return B;
    }

    /**
     * @param B the B to set
     */
    public void setB(int[][] B) {
        this.B = B;
    }
}

1 comentario:

  1. en esta parte,:
    // Pruebas fuera con algoritmo gráfico mostrado en clase.

    y el llenado del Array, creo que, para ahorrarte un poco de lineas de Codigo, la mejor opcion era implementar el llenado con un For anidado.

    ResponderEliminar