Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
-1-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Índice
Introducción---------------------------------------------------------------------------------------------------------- 3
Objetivos ------------------------------------------------------------------------------------------------------------- 4
Panorama General ------------------------------------------------------------------------------------------------ 5
Funciones ------------------------------------------------------------------------------------------------------------ 6
Casos de uso ------------------------------------------------------------------------------------------------------- 6
Modelo conceptual ------------------------------------------------------------------------------------------------ 8
Diagrama de clases ----------------------------------------------------------------------------------------------- 9
Pseudocódigos ----------------------------------------------------------------------------------------------------- 10
Métodos más importantes de la implementación ---------------------------------------------------------- 11
Conclusiones---------------------------------------------------------------------------------------------------------- 15
Bibliografía------------------------------------------------------------------------------------------------------------- 16
Recomendaciones--------------------------------------------------------------------------------------------------- 17
-2-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Introducción
Los grafos pueden representar las interrelaciones entre unidades que interactúan con
otras. Por ejemplo: red de computadoras, carreteras y puntos de intersección, circuitos eléctricos,
etc.
Una de las actividades importantes para un grafo es conocer cual es el camino más corto
entre un vértice y otro. Por ejemplo: Tenemos un grafo G (V, E) en donde el conjunto de vértices V
representa ciudades y el conjunto de lados E representa las carreteras que conducen a esas
ciudades. Cada lado que pertenece a E tiene una distancia (que en teoría de grafos se le llama
peso), ésta distancia no puede ser negativa. Algo que sería muy importante para un conductor de
automóvil, sería saber, cual es el camino más corto para ir de una desde una ciudad A hacia una
ciudad B, tomando en cuenta el costo actual de la gasolina. Éste y muchos problemas más se
pueden resolver con el algoritmo de Dijkstra.
-3-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Objetivos
-4-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Panorama General
El algoritmo de Dijkstra también llamado algoritmo de caminos mínimos, es un algoritmo
para la determinación del camino más corto dado un vértice origen al resto de vértices en un grafo
con pesos en cada arista, el proyecto consiste en implementar dicho algoritmo aplicándolo a una
matriz de incidencia. Los datos serán proporcionados mediante dos archivos de entrada, el primero
contendrá las filas y columnas de la matriz y el segundo contendrá, los valores para completar la
matriz de incidencia (pesos), los vértices serán presentados haciendo uso del alfabeto ingles. Los
archivos podrán ser cargados buscando su localización en cualquier medio de almacenamiento
secundario, además, también se debe de ser capaz de proveer la opción de cargar archivos
mediante conexión remota (es decir, se le proporcionara un URL).
Una vez cargados los archivos de entrada y armada la matriz de incidencia, se produce a
mostrar gráficamente las diferentes rutas que conectan todos los vértices, la aplicación debe
proveer una opción en la cual, se ingresen dos vértices, estos corresponde al punto origen (partido)
y el punto destino ( finalización ) con los cuales debe encontrarse el camino más corto que debe
calcularse mediante la implementación del algoritmo de Dijkstra, una vez calculado dicho camino
debe mostrarse gráficamente su recorrido, debido a que pueden existir varios recorridos que
cumplan con lo establecido, la aplicación debe identificar mediante un número entero los diferentes
recorridos e ingresando en la aplicación el número correspondiente a un recorrido esta deberá
redibujar todos los vértices y sus conexiones y mostrar el recorrido que se ha solicitado.
Algoritmo de Dijkstra
El algoritmo para determinar el camino de longitud mínima entre los vértices a y z es:
1. C←V
2. Para todo vértice i ∈ C, i ≠ a, se establece Di ← ∞ ; Da ← 0
3. Para todo vértice i ∈ C se establece Pi = a
4. Se obtiene el vértice s ∈ C tal que no existe otro vértice w ∈ C tal que Dw < Ds
o Si s = z entonces se ha terminado el algoritmo.
5. Se elimina de C el vértice s: C ← C−{s}
6. Para cada arista e ∈ A de longitud l, que une el vértice s con algún otro vértice t ∈ C,
o Si l+Ds < Dt, entonces:
1. Se establece Dt ← l+Ds
2. Se establece Pt ← s
7. Se regresa al paso 4
-5-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Metas
Funciones
Referencia Función
1.0 Cargar los archivos de entrada por cualquier medio secundario de
almacenamiento o mediante conexión remota.
1.1 Parsear los archivos de entrada
1.2 Nombrar los vértices y lados, colocando también el peso correspondiente a cada
lado.
1.3 Dibujar el grafo con sus vértices y lados correspondientes
1.4 Calcular el camino más corto a través de la implementación del algoritmo de
Dijkstra.
1.5 Mostrar (si es que existe más de uno) todos los caminos míniales existentes en el
grafo.
Casos de uso
Flujo Base:
1. El usuario inicia el caso de uso, solicitando al sistema cargar los archivos de entrada
2. El sistema muestra los archivos cargados actualmente, si no hay ningún archivo cargado
solo estará habilitada la opción de “cargar matriz de incidencia”.
3. El usuario selecciona el archivo (si desea cargar el archivo de a través de una conexión
remota ingresa el URL de la conexión) y acepta la operación.
-6-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Excepciones:
Error en lectura de archivo (IOException)
Error Léxico (Carácter no válido)
Error de pesos (falta o hay pesos de más)
Flujo Base:
1. El usuario solicita a la aplicación calcular el camino más corto del grafo antes cargado.
2. La aplicación solicita el vértice de llegada y el vértice de partida.
3. El usuario ingresa los datos
4. Excepción: el sistema verifica que los vértices no sean iguales y que exista en el grafo, sino
existen: Mensaje de Error y acaba el caso de uso, de lo contrario: paso 5.
5. La aplicación calcula el camino más corto, si hay más de un camino corto, solicita al
usuario ingresar el número de camino ha mostrar.
6. El usuario ingresa el número del camino.
Excepción: valida que el camino exista y que sea un número ingresado.
-7-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Modelo Conceptual
-8-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Diagrama de clases
NodoVertice NodoLado
-nombre : string -peso : double
-posX : int -verticeA : NodoVertice
-posY : int -verticeB : NodoVertice
-marca : bool -nombre : string
-etiqueta : double -siguiente : NodoLado
-siguiente : NodoVertice +NodoLado(entrada verticeA : NodoVertice, entrada verticeB : NodoVertice, entrada nombre : string)
+NodoVertice(entrada nombre : string, entrada x : int, entrada y : int) +NodoLado(entrada vertice : NodoVertice, entrada nombre : string)
+setNombre(entrada nombre : string) +setPeso(entrada peso : double)
+setLocalizacion(entrada x : int, entrada y : int) +setVerticeA(entrada verticeA : NodoVertice)
+setEtiqueta(entrada etiqueta : double) 2 1 +setVerticeB(entrada veticeB : NodoVertice)
+setMarca(entrada marca : bool) +setNombre(entrada nombre : string)
+setSiguiente(entrada siguiente : NodoVertice) +setSiguiente(entrada siguiente : NodoLado)
+getNombre() : string +getPeso() : double
+getX() : int +getVerticeA() : NodoVertice
+getY() : int +getVerticeB() : NodoVertice
+getEtiqueta() : double +getNombre() : string
+getMarca() : bool +getSiguiente() : NodoLado
+getSiguiente() : NodoVertice
*
DibujoGrafo:Extends Canvas
1
-grafo : Grafo 1
+setGrafo()
+update()
+paint() Grafo
-primerVertice : NodoVertice
-primerLado : NodoLado
1 1
-numeroGrafo : int
-caminoCorto : int
-siguiente : Grafo
+addNuevoVertice(entrada nombre : string, entrada x : int, entrada y : int)
1 +addNuevoLado(entrada verticeA : NodoVertice, entrada verticeB : NodoVertice, entrada nombre : string)
+buscarLado() : NodoLado
+buscarVertice() : NodoVertice
+algoritmoDijkstra(entrada VPartida : NodoVertice, entrada VDestino : NodoVertice, entrada grafo : Grafo)
+caminosMinimales()
1 *
1
1 1
ListaGrafo
-9-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Según las clases mostradas en el diagrama de clases, se crea el pseudocódigo para el algoritmo
de Dijkstra.
[inicio] => buscar el nodo que contiene el vértice de destino del grafo y cambiar la etiqueta a cero
del vértice de partida.
[condición]=> ¿la etiqueta del vértice de destino es “false”?. Si es falsa(marca permanente) salir
del algoritmo y retornar la longitud del camino más corto, de lo contrario si es true (marca temporal)
continuar con el algoritmo.
[marca]=> buscar el vértice entre los vértices con marca “true” y cambia la marca, por la marca
“false”.
[Etiqueta minima]=> Se calcula la nueva etiqueta y se compara para ver si es minima o permanece
la que contiene.
Pseudocódigo, para encontrar los vértices del o los caminos más cortos.
Consideración anterior: Se considera que el grafo ya ha sido cargado, con sus vértices, lados y
pesos correspondientes y ya se sabe el camino mínimo.
INICIO
Encontrar todos vértices adyacentes a Vpartida que poseen la etiqueta de permanentes (esto
según el algoritmo de Dijkstra).
FIN
-10-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Encontrar todos los vértices adyacentes a Vactual que poseen la etiqueta de permanentes (según
el algoritmo de Dijkstra)
Si ( pesoActual + el peso del lado [incidente entre Vactual y su ayacente actual] es menor
que caminoMinimo )
g1 guarda el lado en un nuevo grafo
agrega los lados de g a los lados de g1
Vactual el vértice adyacente al Vactua
ir al procedimiento CaminiMinimal(Vactual, Vdestino, g1, pesoActual+pesoDelado)
Grafo
-11-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
buscarVerticeEtiquetaMinima(Grafo grafo)
Método que busca el vertice con la etiqueta minima entre los vertices con marca
temporal
void cambiarEtiquetaVertice(String vertice, Double etiqueta, Grafo grafo)
Método que busca el vertice y cambia la etiqueta de este. void
existeLado(java.lang.String nombre)
Verifica si existe ya el Lado, buscando con relacion al nombre int void
grafoSumarOtroGrafo(Grafo _grafo)
Método que se utiliza para sumar grafos, este método es utilizado especificamente en
las llamadas recursivas cuando se buscan el ó los caminos mínimos
-12-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Scanner
ListaGrafo
-13-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
-14-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Conclusiones
• Para la implementación, creamos varias clases de tipo nodo, con el cual creamos un grafo.
Para aplicar el algoritmo de Dijkstra debimos recorrer cada nodoVertice del grafo aplicar
los pasos indicados en: Pseudocódigo Algoritmo de Dijkstra.
-15-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Bibliografía
http://es.wikipedia.org/wiki/Dijkstra
http://es.wikipedia.org/wiki/Algoritmo_de_Dijkstra
http://es.wikipedia.org/wiki/Grafo
Desarrolladores:
-16-
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Recomendaciones
• Cuando utilice la aplicación, verificar los archivos de entrada, ya que si alguna incidencia
no corresponde o no es adecuada la lexicografía y/o sintaxis la aplicación enviará un error.
• Para utilizar la aplicación debe tener instalado en su máquina la JVM (Java Virtual
Machine) 1.6 o superior.
-17-