Software para teoría de grafos

June 14, 2019 | Author: Juan Fernando Hernández | Category: Graph Theory, Vertex (Graph Theory), Java (Programming Language), Software, Programming Language
Share Embed Donate


Short Description

Download Software para teoría de grafos...

Description

SOFTWARE PARA TEORIA TEORI A DE GRAFOS

Sánche Sánchezz Enrique nri quezz Heider I saías hei heider der_ese esencia@hotm ncia@hotmail ail.com Rodrí Rodríguez guez Maysun aysundo do Eduar duardo ed_r d_rm@hotmail ail.com Ruiz Campo Camposs J ohnat ohnatan an Eric je_blue87 blue87@hot @hotm mail ail.com Universidad Nacional De Trujillo Escuela Profesional De Informática

RESUMEN El presente trabajo trata de abordar conceptos de Teoría de Grafos y plasmarlos en un Software de uso interactivo y con una interfaz amigable. El problema es realizar un software comercial, de fácil uso y legible, en el desarrollo de grafos dirigidos y no dirigidos, con sus principales operaciones sobre este. En el mercado existen muchas aplicaciones que resuelven este problema. Pero nuestra propuesta es que no solamente el usuario experto en Teoría de Grafos, acceda al software sino también aquellos que tienen poca noción del tema, y puedan modelar fácilmente distintos problemas de la realidad. Por ello el software tiene una amplia gama de validaciones, y reportes de mensajes. Los logros obtenidos son de calidad favorable, respondiendo a los objetivos  planteados.

Palabras Claves: Teoría de Grafos , Grafo dirigido, Grafo no dirigido, Vértice, Arista, recorrido de grafos, recubrimiento de grafos, software.

1. INTRODUCCION Muchos problemas que incluyen objetos de la vida real  pueden ser representados fácilmente utilizando una estructura de datos que represente un grafo. Estas estructuras de datos son simples y eficaces en la resolución de problemas ya que los nodos de este pueden representar  muchas cosas tales como: una ciudad, un estado, un centro informático, un servidor, etc. Para lo cual tendremos que discretizar los objetos de la realidad para poder ser  representados por esta estructura fundamental de datos. Los grafos son muy usados por las múltiples operaciones que se pueden realizar en ellos y la fácil manera de equiparar estas relaciones con problemas de la vida real. Este tema ha sido de estudio durante muchos años por lo cual se han logrado desarrollar muchos algoritmos para los

diferentes problemas relacionados con éstos. Son conocidos los informáticos renombrados que realizaron estudios tales como: Kruskal, Dijkstra, Prim, etc. En el presente Software tratamos de implementar los principales algoritmos sobre grafos tales como: Árbol de Recubrimiento Mínimo, Ruta más corta, etc. El tratamiento de grafos es un problema que viene a ser  desarrollado durante durante casi toda la vida de un informático desde el curso de estructuras de datos hasta actualmente en cursos de Optimización en Postgrado, nos fue apasionante el desarrollo de este proyecto desde su inicio hasta el final nos agrado la forma eficiente y rápida que soporta Java el uso de gráficos, la gran cantidad de herramientas que nos  proporciona para la realización de nuestro trabajo y además el encapsulamiento de la estructura del programa; propiedad fundamental en la programación orientada a objetos. Java nos muestra un nuevo mundo, uno en el cual casi todo es  posible y si hay algo que no esta implementado se puede realizar. Este mundo de multiplataforma, actualidad y eficiencia que nos proporcionó este excelente lenguaje nos demostró que un lenguaje libre y de dominio público puede  proporcionarnos todas las herramientas que necesitamos  para desarrollar software de alta calidad y de bajo costo. Además de lo bueno que fue Java, también nos entretuvo la elección de los algoritmos a implementar en nuestro  programa ya que la eficiencia o eficacia de estos radica en su tiempo de ejecución el cual debimos determinar y en algunos casos mejorar para la realización óptima de las operaciones.

2. CONCEPTOS PREVI OS IM PORTANTES 2.1. .1. Gr G r afo Un grafo es un par (V, A) donde V es un conjunto finito no vacío (conjunto de vértices) y A un conjunto finito de pares (V x V) no ordenados de vértices (conjunto de aristas). Gráficamente, los vértices se representan por puntos y las aristas por líneas que los unen.

El orden de un grafo es el número de vértices que lo compone |V| y la medida de un grafo es el numero de aristas.

2.2. Digrafo Un digrafo G = (V, E) esta formado por un conjunto finito no vacío V (conjunto de vértices) y por un conjunto E de  pares ordenados de elementos distintos de V (conjunto de arcos).

2.3. Vértices y Aristas Los Vértices son los puntos o nodos con los que esta conformado un grafo. El grado de un vértice es el número de aristas de las que es extremo. Se dice que un vértice es ‘par’ o ‘impar’ según lo sea su grado. Las Aristas son las líneas con las que se unen los vértices de un grafo y con la que se construyen también caminos.

Fig. 1. Ejemplo de un Grafo simple 2.6. Grafo bipartido o bipartito Un grafo bipartido es un grafo simple donde se puede encontrar una partición de V tal que V = X ∪ Y con X ∩ Y = φ tal que toda arista uv ∈ A une vértices de distinta parte, es decir, une un vértice u de la capa X con un vértice v de la capa Y. A continuación se expone un teorema para poder saber  si un grafo es o no bipartido.

 Teorema: Un grafo G es bipartido si y solo si no contiene ciclos impares.

Si la arista carece de dirección (en los grafos) se denota indistintamente {a, b} o {b, a}, y si tuviera dirección (en los digrafos) se le de denota solo {a, b} o {b, a} según la dirección dada. Siendo a y b los vértices que une.

1

2

Un vértice puede tener 0 o más aristas, pero toda arista debe unir exactamente dos vértices. 5

Si {a, b} es una arista, a los vértices a y b se les llama sus extremos.

2.4. Adyacencia e Incidencia Dos vértices son adyacentes si son extremos de una misma arista. Dos aristas son adyacentes si tienen un extremo común, así que los vértices adyacentes a un vértice dado son todos los vértices que están al otro extremo de las aristas que tienen como origen o destino el vértice dado. Un vértice aislado no tiene vértices adyacentes. Un vértice y una arista son incidentes si el vértice es extremo de la arista.

3

6

4

7

Fig. 2. Grafo Bipartido 2.7. Subgrafo G' = (N', A') es un subgrafo de G = (N, A) si: 1) G' es un grafo 2) N' es un subconjunto de N 3) A' es un subconjunto de A Un subgrafo se obtiene eliminando nodos y arcos de un grafo.

2.8. Conexión de Grafos

2.5. Grafos Simples

Un grafo G= (V, E) se denomina conexo si existe un camino entre cualquier par de vértices distintos de G.

Un grafo simple es un par G = (V, A) donde V es un conjunto finito, no ordenado y no vacío y A es un conjunto finito de pares no ordenados de vértices distintos de V, es decir, no debe haber ni aristas múltiples ni bucles.

Dado un grafo G = (V, A), una componente conexa de G será el grafo que se obtiene al tomar todos los vértices que están en la componente conexa de un cierto vértice de V y todas las aristas del grafo que conectan estos vértices. Señalemos que las componentes conexas de un grafo son grafos conexos y es fácil ver que todo grafo se puede

representar como unión de grafos conexos (sus componentes conexas).

2.9. Recorridos de un Grafo

Algoritmo para el Recorrido en Anchura Sea G = (V, A) un grafo conexo, V’ = V un conjunto de vértices, A’ un vector de arcos inicialmente vacío y P un vector auxiliar inicialmente vacío.

Existen dos métodos distintos de recorrer un grafo para explorar todos sus vértices. La diferencia es fundamentalmente el orden en que se visitan los diferentes vértices [1]. Estos métodos son:

1. Se introduce el vértice inicial en P y se elimina del conjunto. 2. Mientras V’ no sea vacío repetir los puntos 3 y 4. En otro caso parar. 3. Se toma el primer elemento de P como vértice activo. 4. Si el vértice activo tiene algún vértice adyacente que se encuentre en V’: - Se toma el de menor índice. - Se inserta en P como ultimo elemento. - Se elimina de V’. - Se inserta en A’ el arco que le une con el vértice activo. Si el vértice activo no tiene adyacentes se elimina de P.

2.9.1. Recorrido en Profundidad: Se comienza en el vértice inicial (vértice con índice 1) que se marca como vértice activo. Hasta que todos los vértices hayan sido visitados, en cada paso se avanza al vecino con el menor índice siempre que se pueda, pasando este a ser el vértice activo. Cuando todos los vecinos al vértice activo hayan sido visitados, se retrocede al vértice X desde el que se alcanzó el vértice activo y se prosigue siendo ahora X el vértice activo.

Algoritmo para el Recorrido en Profundidad Sea G = (V, A) un grafo conexo, V’ = V un conjunto de vértice, A’ un vector de arcos inicialmente vacío y P un vector auxiliar inicialmente vacío: 1. Se introduce el vértice inicial en P y se elimina del conjunto V’. 2. Mientras V’ no sea vacío repetir los puntos 3 y 4. En otro caso parar. 3. Se toma el último elemento de P como vértice activo. 4. Si el vértice activo tiene algún vértice adyacente que se encuentre en V’: - Se toma el de menor índice. - Se inserta en P como ultimo elemento. - Se elimina de V’. - Se inserta en A’ el arco que le une con el vértice activo. Si el vértice activo no tiene adyacentes se elimina de P.

2.10. Árbol Un árbol A= (V, E) es un grafo no dirigido, conexo y sin ciclos. Todos los caminos de un grafo son simples. Un tipo de árbol que tendremos en cuenta es el Árbol Libre [2]:

2.10.1. Árbol Libre: -

Un árbol libre es un grafo no dirigido conexo acíclico. Todo árbol libre con n vértices tiene n-1 aristas. Si se añade una arista se introduce un ciclo. Si se borra una arista quedan vértices no conectados. cualquier par de vértices está unido por un único camino simple un árbol libre con un vértice distinguido es un árbol con raíz.

2.9.2. Recorrido en Anchura

2.11. Árboles Recubridores de un Grafo

Se comienza en el vértice inicial (vértice con índice 1) y se marca como vértice activo, a diferencia con el de  profundidad ahora se visitan en orden creciente de índice todos los vecinos del vértice activo antes de pasar al siguiente. Hasta que todos los vértices hayan sido visitados, en cada paso se van visitando en orden creciente de índice todos los vecinos del vértice activo. Cuando se han visitado todos los vecinos del vértice activo, se toma como nuevo vértice activo el primer vértice X visitado después del actual vértice activo en el desarrollo del algoritmo.

Un árbol de recubrimiento de un grafo no dirigido y etiquetado no negativamente es cualquier subgrafo que contenga todos los vértices y que sea un árbol libre [2]. Los árboles de recubrimiento son:

2.11.1. Árbol de Recubrimiento Mínimo Un árbol de recubrimiento mínimo es un árbol de recubrimiento y no hay ningún otro cuya suma de los pesos de las aristas sea menor.

Algoritmos para hallar árboles generadores mínimos: a) Algoritmo de K ruskal Se eligen aristas de la forma más económica. Inicialmente se ordenan las aristas por su peso. A continuación se van eligiendo las aristas de menor peso de modo tal, que no formen ciclo con las aristas anteriormente seleccionadas. Para evitar que se formen ciclos se asignan etiquetas a los vértices de modo que los vértices que formen parte de las aristas ya elegidas tengan todos la misma etiqueta. [3] 1.  T={} 2. Asignar etiquetas a todos los vértices t(i)=i, i=1, 2,

..., n.

3. Mientras halla vértices con etiquetas diferentes repetir. - Escoger la arista (u, v) de menor peso tal que t(u) sea diferente de t(v). Agregarla a T. - Asignar a todos los vértices de una componente conexa de T la misma etiqueta.

b) Algoritmo de Dijkstra [4] Sean: 









 pequeña modificación la cual seria escoger las aristas de mayor peso en vez de las de menor peso.

2.12. Emparejamiento de un Grafo Un emparejamiento (matching) en un grafo no dirigido y simple g = (v, a) es un subconjunto de aristas M ⊆ A tal que dos aristas cualesquiera de M no tengan un extremo común. Evidentemente un subconjunto de un emparejamiento es también un emparejamiento aunque de menor cardinal. Algunos tipos de emparejamientos:

2.12.1. Emparejamiento Perfecto Un emparejamiento es perfecto cuando todos los vértices de G son extremo de alguna arista de M, es decir, cuando todos los vértices del grafo son vértices saturados por M. [5]

2.12.2. Emparejamiento Maximal Un emparejamiento maximal en un grafo es un emparejamiento que no puede ser ampliado agregando una arista. Un emparejamiento es maximal si y solo si toda arista de G comparte extremos con alguna arista de M.

G = (V, E) donde V es el conjunto de vértices y E el de arcos. S es el conjunto de vértices cuyos caminos más cortos al origen han sido ya determinados. V-S es el resto de vértices. d: ARRAY de estimaciones de caminos más cortos a dichos vértices.

Fig. 3. Emparejamiento Maximal

 pi: ARRAY de predecesores para cada vértice. 1. Inicializar d y pi 2. Poner S a vacío // aun no hemos estudiado ningún vértice. 3. Mientras {V-S} ≠ vacío //mientras queden nodos sin determinar su camino mínimo al origen 4. Ordenar los vértices en V-S y analizar de acuerdo a la menor distancia al origen. 5. Añadir u, el vértice más cercano en V-S, a S // S = S + {u} 6. Relajar todos los vértices todavía en V-S conectados a u

2.11.2. Árbol de Recubrimiento Máximo Un árbol de recubrimiento máximo es un árbol de recubrimiento y no hay ningún otro cuya suma de los pesos de las aristas sea mayor. Para conseguir el árbol de recubrimiento se puede emplear el algoritmo de Kruskal, solo haciéndolo una

2.12.3. Emparejamiento Máximo Un emparejamiento máximo es un emparejamiento que tiene el mayor número posible de aristas. Todo emparejamiento máximo es también maximal, pero no necesariamente al revés, ya que un emparejamiento sea maximal no implica que sea máximo.

Fig. 4. Emparejamiento máximo y Perfecto -

corta de un vértice a otro y desde un vértice origen a todos los demás. Reportar de una manera formal los distintos tipos de grafos procesados. Proporcionar la posibilidad de guardar y recuperar un grafo de un tipo de unidad de almacenamiento. Presentar aplicaciones utilizando diversas operaciones sobre Grafos.

Fig. 5. Emparejamiento Máximo – No Perfecto 3. DESARROL LO DEL SOFTWARE En esta parte del desarrollo del software, describiremos  parte del ciclo de vida, con una visión de conceptualizar  características importantes en el desarrollo y la aplicación final (programa ejecutable).

3.1. Definición Del Problema

3.1.1. Definición: Representar en forma adecuada y realizar óptimamente las operaciones en un grafo tanto dirigido como no dirigido.

3.1.2. Objetivos 5. Lograr que el usuario interactúe con el software  para la manipulación de grafos en pantalla. • Representar de forma eficiente las diferentes operaciones que sobre grafos se pueden realizar  y además de que el usuario logre comprenderlos. • Dar a conocer la importancia del conocimiento de esta importante estructura de datos.

3.2. Análisis Y Especificación De Requerimientos:

3.2.1. Requisitos Funcionales: -

-

Graficar de forma fácil y eficaz diferentes tipos de grafos tales como: Grafos Simples, Grafos Bipartitos y Dígrafos. Permitir al usuario modificar el grafo en pantalla (cambio de posición de vértices, cambiar color, eliminar vértices o aristas). Colocar pesos a las aristas, convirtiendo al grafo en ponderado. Realizar de forma eficiente funciones para Grafos no dirigidos tales como: Árbol de recubrimiento mínimal y máximal, Recorrido en  profundidad y en anchura y Emparejamiento de Grafos. Realizar de forma eficiente funciones para Grafos Dirigidos tales como: Recorrido en  profundidad, Recorrido en anchura, Ruta más

3.2.2.

Descripción de usuarios:

Este software es de propósito general, cualquier usuario  puede interactuar con el. Nosotros clasificamos a los usuarios en dos clases:

a)Usuario experto: Es aquel usuario que tiene una noción clara sobre Grafos, y puede manipular el  programa con mayor facilidad. Este usuario es quien puede dar al software el valor adecuado ya que responderá eficazmente sus problemas de modelamiento y sus principales operaciones.

b)Usuario Inexperto: Es la persona que conoce poco del tema, pero necesita interactuar con el programa,  para algunas tareas personales, estas personas  pueden ser: estudiantes de colegios, novatos en matemática universitaria, etc.

3.3.3. Ejemplos de formatos de respuesta La respuesta del software para las diversas peticiones del usuario se muestra a continuación: Estos son ejemplos de grafos ponderados dibujado por  el Usuario, a través de la paleta de dibujo:

Fig. 1. Grafo dirigido ponderado.

3.3.1. Estructura de datos utilizada: Los grafos se suelen representar matricialmente para poder  resolver diversos ejercicios sobre estos.

Fig. 2. Grafo no dirigido ponderado Estos solo son dos ejemplos principales de formato de respuesta del software, utilice el software y comprobara mas resultados.

Se utiliza la matriz de Incidencia para almacenar las relaciones entre vértices y aristas, es una matriz booleana, de nxm, en donde n representa el numero de Vértices del grafo y m el numero de aristas. En el siguiente ejemplo mostramos la matriz de incidencia para el grafo mostrado en la figura 2. Dado el Grafo=(V,E), en donde V={ 0, 1, 2, 3, 4 } y E={ e0=(v0,v1), e1=(v0,2), e2=(v0,v4), e3=(v1,v3), e4=(v1,v4), e5=(v2,v3), e6=(v2,v4), e7=(v3,v4) }.

3.3.4. Representación Pictórica de Procesos ¿Tengo un  problema, como lo soluciono?

e0 e1 e2 e3 e4 e5 e6 e7 v0 v1 v2 v3 v4

⎡1 ⎢1 ⎢ ⎢0 ⎢ ⎢0 ⎢⎣ 0

1 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0

0 0 1 0 1

0⎤ 0 ⎥⎥ 0⎥ ⎥ 1⎥ 1 ⎥⎦

Fig. 3. Matriz de Incidencia Modelamiento del problema a través de un grafo. Dibujado de vértices y aristas con su respectivo  peso. Aplicación de operaciones sobre grafos.

Problema solucionado, gracias a las operaciones sobre grafos.

Reporte grafico de la solicitud enviada al software

3.3. Diseño: Para el diseño del software, se tuvo en cuenta el paradigma de Programación Orientada a Objetos (POO), ya que es un  paradigma con alto de grado de aplicación por su excelente modulación de funciones, haciéndoles altamente cohesivos y débilmente acoplados. En esta sección describiremos la estructura de datos que utilizamos, esquematizaremos los diferentes procesos y la relación entre sus módulos.

La matriz de adyacencia se usa para relación entre vértices, es una matriz de nxn, en donde n es el numero de vértices del grafo. La matriz puede ser booleana, o de pesos es decir  en la casilla de la relación se coloca un 1 o el peso que existe en la arista de la relación. Tomamos la misma figura de la representación anterior para formar la matriz de adyacencia del grafo.

v0 v1 v2 v3 v4

v0 ⎡0 ⎢1 ⎢ ⎢1 ⎢ ⎢0 ⎢⎣1

v1 v2 v3 v4 1 1 0 0 0 1 0 0 1 1 1 0 1 1 1

1⎤ 1 ⎥⎥ 1⎥ ⎥ 1⎥ 0 ⎥⎦

Fig. 3. Matriz de Adyacencia Para el desarrollo de nuestro software, utilizamos dos estructuras de datos para cada tipo de grafos, y que explicaremos a continuación: Para grafos no dirigidos tomamos la siguiente representación: Sea el grafo G=(V,E), en donde en donde: V={ v0, v1, v2,.. , vn }, n=|V|

E={ e0, e1, e2,… , em}, m=|E| Los vértices almacenamos en un vector (Array o matriz de orden 1xn): 0 1 2 … n-1 v1 v2 v3 … vn Para representar una arista utilizamos la siguiente estructura: Estructura de la Arista Extremo 1 Extremo 2  Numero entero Numero entero

1

v1 vx



1

v2 vx



2

v3 vx



vn vx



… n-1

Fig. 4. Estructura del conjunto de Arcos del grafo Peso Numero entero

Y para las aristas en conjunto utilizamos el concepto de Listas enlazadas, para enlazar todas las aristas del grafo. 0

0

m-1

....

3.3.2. Diseño descendente: El diseño descendente nos muestra la jerarquía de acceso a los diversos procesos del software recurriendo a la modularidad. En otras palabras consiste en dividir el  problema principal en subproblemas y el subproblema en sub-subproblemas más, y así sucesivamente.

Para grafos dirigidos cambiamos la estructura de representación. Sea el dígrafo G=(V,E), en donde en donde: V={ v1, v2,.. , vn }, n=|V| E={ e1, e2,… , em}, m=|E| Los vértices también lo almacenamos en un vector: 0 1 2 … n-1 v1 v2 v3 … vn

Fig. 5. Diseño descendente

La estructura de los arcos se representada de la siguiente forma: Estructura del Arco: Padre Hijo  Numero entero Numero entero

Peso Numero entero

Para el conjunto de arcos que conforma el dígrafo, consideramos una vector de lista de Arcos, En donde cada  posición del vector señala que en esa lista de arcos como  padre común para todos los arcos es el vértice de la misma  posición en el vector de vértices. De esta manera la estructura queda bien definida para poder aplicar de manera eficiente diversas operaciones sobre dígrafos.

Fig. 6. División del sub-problema: Dibujar Grafo

encapsulación, reutilización y demás características del paradigma orientado a objetos.

Realizar Operaciones

S obre un Grafo dirigido

Recorrido en Profundidad

S obre un Grafo no dirigido

Es un lenguaje abierto de tal manera que todas aplicaciones desarrolladas en él pueden ser  ejecutadas en todas las plataformas existentes Microsoft Windows, Unix, Solaris. Ya que la aplicación se ejecuta sobre una máquina virtual que está disponible para distintos sistemas operativos. Esto significa que la aplicación realizada en Java es totalmente portable.



Es un lenguaje orientado a Internet, con los que los  programas en Java pueden ser ejecutados en  páginas Web, a través de servidores o localmente a través de un navegador.

Recorrido en Anchura

Camino mas corto de un vértice a otro.

Recubrimiento Minimal

Camino mas corto de un vértice a todos.

Recubrimiento Maximal

•  No es necesaria instalación de librerías adicionales al sistema operativo para la ejecución de  programas.

Emparejamiento máximo

Fig. 7. División del sub-problema: Realizar operaciones Reportar grafo

Grafo Original





Es de libre distribución, sin coste para el desarrollador.

Pero no todo son ventajas, Java también posee algunas desventajas a tener en cuenta, si bien es cierto que van desapareciendo:

Grafo de Operación

• La interfaz gráfica original de java sigue siendo  pobre. • Algunas de las funciones dependen hoy por hoy del navegador que se utilice.

Fig. 8. División del sub-problema: Reportar Grafo 3.3. Implementación: La implementación del software nos fue un reto, ya que tuvimos que analizar diferentes algoritmos y modificarlos  para encajar nuestra estructura de datos, a la vez crear  algunos nuevos para complementar el desarrollo del software.

Un vistazo al software externo es el siguiente:

Como se ha comentado en la introducción se ha elegido el lenguaje de programación Java, Ya que este lenguaje es netamente orientada a objetos. El seleccionar Java como lenguaje fue un reto para nosotros, puesto que ha supuesto el aprendizaje del lenguaje  para poder desarrollar la aplicación, debido a la inexperiencia sobre este lenguaje. Java aporta continuación:



muchas

ventajas

enumeradas

a

Es un lenguaje de programación orientado a objetos, con todas las ventajas que supone esta metodología de programación, en cuanto a la

Fig. 9. Apariencia del programa hecho en J ava

También implementamos una aplicación: El Laberinto. Que consiste en que un sujeto debe encontrar su objetivo en un laberinto, para ello cada cuadro representa un vértice. Un vértice forma una arista con su vecino en las cuatro direcciones. Para poder hallar el objetivo, se utiliza el recorrido en profundidad.

4. CONCLUSIONES - Se logro desarrollar un software altamente eficiente y

efectivo.

- Se logro realizar un software completo con manejo de

operaciones y aplicaciones.

- Pudimos comprobar la eficiencia de los diferentes

algoritmos sobre grafos.

- La aplicación de la Programación Orientada a Objetos nos

 permite crear software de manera ordenada y rápida. Además que nos genera un código legible.

- La aplicación del las diferentes teorías de la POO nos

 permitió crear diversos tipos de datos con comportamiento especifico. - El software resultante aun no llego a ser terminado por  completo, pero seguiremos trabajando para implementar  mas funciones para nuestra próxima versión.

5. REFERENCIAS [1] Samuel Gutiérrez Revenga, Algoritmos de Búsqueda en Profundidad y en Anchura, España, Octubre 2002 [2] Universidad Politécnica de Catalunya, Departamento de LSI, Árboles de recubrimiento de Coste Mínimo, España 2005

Fig. 10. Ubicación inicial del sujeto

[3] Universidad de Antioquia, Teoría de Redes, Árboles, Antioquia 2003 [4] Samuel Gutiérrez Revenga, Algoritmos de Dijkstra, España, Octubre 2002 [5] Pérez Martín Raquel, Emparejamiento de Grafos, Trabajo de fin de Carrera, Santiago de Chile, Diciembre 2004.

Fig. 11. El Sujeto encuentra su objetivo

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF