2. Graphs
Un graph tiene una estructura más general que la de un tree. Un tree es un
tipo de graph si lo podemos ver así.
Con un graph podemos representar cosas interesantes de nuestro mundo
como un Sistema de autopistas, un sistema de vuelos de ciudad a ciudad
como se conectan las computadora a un red, etc.
Los humanos tenemos la capacidad de entender un mapa y sus relaciones,
lamentablemente las computadoras no lo tiene. Tenemos que aprender a
ver un mapa como un graph y asi podríamos hacer que la computadora
hiciera cosas interesantes.
3. Graphs
Veamos un ejemplo de la información que un estudiante necesita para tener
un grado asociado, necesita saber que cursos debe tomar y el orde a seguir
para lograrlo.
Un graph nos ayudaría a representarlo. Veamos la imagen.
4. Graphs
Vocabulario y definiciones.
Vertex: también conocido como nodo y es la parte fundamental del
graph. También lo podemos encontrar con el nombre de “key”
Edge: es otra parte fundamental del graph. Este conecta dos vertices
mostrando que hay una relación entre ellos. Los edges pueden ser en un
sentido o en dos sentidos. Si todos los edges en un graph son solo de un
solo sentido se le conocerá como directed graph o digraph
Weight: el peso(weight) es el costo que tiene la conexión de un vértice a
otro. Por ejemplo en un graph tenemos los vertices que están conectados
y que representan dos ciudades, el peso sería la distancia que hay entre
las mismas.
5. Graphs
Con estas definiciones podemo representar un grahp.
G = (V,E)
G es reprentación de grahp, V es representación de los vertices y la E de los
edges (la conecxión de los vertices)
6. Graphs
Analizemos la siguiente imagen.
Tenemos 6 vertices del V0 al V5. Si tomamos
un ejemplo vemos que del V3 al V4 hay un 7
el 7 sería el peso. Podemos representar también
de la siguiente manera:
E={(v0,v1,5),(v1,v2,4),(v2,v3,9),(v3,v4,7),(v4,v0,1),
(v0,v5,2),(v5,v4,8),(v3,v5,3),(v5,v2,1)}
7. Graphs
Veamos dos definiciones más.
Path: es una secuencia de vertices que estan conectados entre sí. En
nuestro ejemplo anterior el path de V3 a V1 sería {V3,V4,V0,V1}. El peso del
path sería la suma de los edges {(v3,v4,7),(v4,v0,1),(v0,v1,5)}.
Cycle: es path que empieza y termina en el mismo vértice. Por ejemplo en
la figura que analizamos enteriormente el path (V5,V2,V3,V5) es un ciclo
ya que empieza en V5 y termina en V5. Un graph sin cilclos se le llama
acyclic graph. Un graph directo sin ciclos se le llama directed acyclic
graph o DAG.
8. Graphs
An Adjacency Matrix.
Una matríz es una forma facil de representar un graph.
Una matríz de dos dimensiones es una serie de filas y
columnas que representan los vertices. El valor que se
encuentra almacenado en la celda es la conexión que
se tiene entre esos dos vertices, así mismo representa el
peso.
Cuando dos vertices estan conectados por un edge lo
llamamos adyacente.
Veamos la siguiente imagen.
Una de las desventajas que podemos apreciar es que
encontraremos muchos espacios vacios, a este tipo de
matríz se le conoce como “sparse” o escaso.
9. Graphs
An Adjacency List.
Una forma más eficiente de presentar un graph
es una lista adyacente o de proximidad. En esta
forma de representación mantenemos un listado
de los vertices y cada vértice mantine un objero
con la relación y el peso que tiene con otro
vertices.
En la imagen vemos que el objeto de relación
con los vertices es utilizado como un diccionario
donde el vértice es el key y los valores son el
peso.
En la primera posición vemos que el id = V0 y la
relación es con V1 con peso de 5 y con V5 el
peso es 2.
10. Graphs
Veamos la implementación en Python.
Se crearán dos clases.
I.
Vertex Class: representará los vertices
II.
Graph Class: representará la lista de los vertices.
La clase Vertex utiliza un diccionario de nombre connectedTo para llevar el
seguimiento de los vertices que estan conectados, del peso y del edge.
También utiliza addNeighbor que añade una conección con otro vértice.
En la clase Graph se utiliza el addEdge que realiza la conección entre
vertices. getVertex para saber el nombre del vértice.
11. Graphs
Primeramente inicializaremos la instancia de la clase Graph que en este
ejemplo será g la instancia. Adicionalmente añadiremos los vertices al listado
con un loop For utilizando la función addVertex. Será 6 vertices del 0 al 5.
12. Graphs
Una vez que tenemos creado nuestro
listado de vertices agregaremos los
edges, las relaciones que tendrán
cada uno de los vertices agregados.
Para esto utilizaremos la función
addEdge donde nuestro primer valor
será el vértice, el segundo valor será el
Segundo vértice o el neighbor (el
vértice conectado al primero) y el
tercer valor será el peso que tendrá la
relación entre los dos vertices.
En la primera línea la conección es
entre el vértice 0 y el vértice 1 con un
peso de 5
13. Graphs
Finalmente mostraremos las
conecciones que realizamos. Para
esto crearemos un loop For que
correrá el número de edges que
hicimos. Dentro de este loop
utilizaremos otro donde cada vez que
pase por una edge creado nos
devuelva en un print la conección
creada utilizando la función getId.
Para devolver lo que deseamos
utilizaremos la función getConnections.
Vemos en el resultado los vertices que
hemos relacionado.
14. Graphs
Topological Sorting
El problema de hacer bischochos. En este problema presentaremos en un
graph. Los ingredientes son:
Un huevo
Una copa de mezcla de biscochos
Una cucharada de aceite
¾ de copa de leche
15. Graphs
Para hacer pancakes debe calentar
la plancha, mezclar todos los
ingredientes y una cuchara la
mezcla sobre una plancha caliente.
Cuando los pancakes comienzan a
burbujear que darles la vuelta y
dejar cocer hasta que estén
doradas por la parte inferior. Antes
de comer los pancakes usted va a
querer calentar un poco de syrup.
Vea la imagen donde se muestra en
un graph el proceso de hacerlo.
16. Graphs
Lo que debemos tener presente es que la clave está en saber que es lo que tenémos
que hacer primero. Como hemos visto en la imagen anterior lo primero que debemos
hacer es calentar la plancha y añadiendo los ingredientes de la mezcla para
panqueques. Para ayudarnos a decidir el orden preciso en que debemos hacer cada
uno de los pasos necesarios para hacer nuestros pancakes acudimos a un algoritmo
grafh llamado topological sort.
Topological sort toma un graph acíclico dirigido y produce una ordenación lineal de
todos sus vértices de tal manera que si el gráfico G contiene un borde (V, W) a
continuación, el vértice V viene antes que el vértice w en la ordenación.