jueves, 20 de mayo de 2010

Ordenación Topológica



Algoritmo:

La ordenación topológica es un sistema de ordenamiento de un grafo acíclico, es decir, que no tiene ciclos; el cual consiste, en organizar de forma lineal ó en lista ascendente ó descendente, una serie de vértices en desorden, para lo cual primero debe de empezar de un "vértice padre" osea, un vértice sin predecesores, y después visitar a sus vecinos, después de que haya visitado a tos sus vecinos, pasa a analizar otro vértice, y de igual forma identifica todos sus vecinos, y así recursivamente, hasta que haya visitado a todos los vértices. En pocas palabras no se visitara un vértice, hasta que todos sus predecesores hayan sido visitados.
Después de que ya han sido visitados todos los vértices del grafo dirigido, se acomodan en lista ya sea d forma ascendente o descendente, según se requiera, y se acomodan en base a el coste de tiempo de los vértices.
Ejemplo: Este es un ejemplo común aplicado a la vida diaria, tan simple de como vestirse.
  • Arriba de cada vértice se muestra el coste de tiempo.
  • Distancia / Finalizacion

  • El algoritmo nos devuelve una lista enlazada, con los nodos del grafo, en orden decreciente en tiempo de finalizacion.



  • Una vez ya ordenado topologicamente se pueden ver las precedencias de las tareas:
  1. Ponerse la camisa antes que el cinturón y el jersey.
  2. Ponerse el pantalón antes que los zapatos y el cinturón.
  3. Ponerse los calcetines antes que los zapatos.

Pseudocódigo:

  1. Para cada vértice "u" que pertenezca al grafo hacer:
  2. El estado "u" No visitado, por que se comienza el algoritmo.
  3. El padre debe ser nulo, por que no tiene predecesores.
  4. El tiempo inicia de 0, obviamente por que se inicia el algoritmo.
  5. Después, si el estado = No visitado entonces: Se pone en marcha la ordenación topológica.
  6. El estado cambiara a Visitado por que ya fue visitado y analizados su s predecesores.
  7. Por lo tanto se le suma un 1 al tiempo por que es lo que tardo en ese vértice.
  8. Después para cada vértice adyacente hacer:
  9. Si el estado= No visitado entonces:
  10. El padre ahora sera ese vértice, ya que es el siguiente en orden.
  11. Cuando el estado del vértice = Terminado:
  12. Se suman los tiempos y este seria el coste total por el ordenamiento.
  13. Se inserta el resultado de la lista del algoritmo de ordenación topológico.

Análisis Asintótico:

En el análisis asintótico del algoritmo de ordenación topológica es costoso buscar vértice sin predecesores, varias veces.

La solución seria calcular previamente cuantos predecesores tiene cada vértice, almacenar el dato en un vector y actualizarlo siempre que se incorpore un nuevo vértice a la solución.

Coste de Tiempo:

  • Inicializacion:

Primer bucle: O(n) --- Quiere decir que va a depender del numero de vértices que tenga el grafo.

Segundo bucle: Examinacion de todas las aristas.

O(a+n) --- Para listas de adyacencia.

O(n^2) --- Para matriz de adyacencia.

  • Bucle Principal:

O(a+n) --- Para listas de adyacencia.

O(n^2) --- Para matriz de adyacencia.



Estructuras de datos:

  • Listas Enlazadas: Para este algoritmo de ordenación topológica, se usan las listas enlazadas, ya que la ordenación ya finalizada es una lista lineal simple con aristas que conectan de igual forma como se tenia antes.
  • Isomorfismo: Algo tiene que ver con ismorfismo, aunque no son grafos conexos y es acíclico el algoritmo permite alinear los vértices, pero conservando los enlaces entre cada uno de los vértices, es decir, solo se acomoda por prioridad, pero conserva su estructura.
  • Arboles: También se puede decir que esta relacionado con árboles ya que estos contienen nodos también llamados vértices, y los arboles pueden adoptar distintas formas de ordenamiento.
  • Búsqueda de profundidad (DFS): La ordenación topológica necesita del algoritmo de búsqueda DFS ya que necesita aplicarlo para ir explorando nodos, y al final llegar a un ordenamiento lineal.

Aplicaciones:

  • Puede ser aplicable a la reprecentacion de las fases de un proyecto , donde los vértices representen tareas, y las aristas relaciones temporales a ellas.
  • Evaluacion en la fase semántica de un compilador.
  • En la vida diaria lo podríamos aplicar en cosas simples por ejemplo, organizar los recibos de los servicios a pagar, ya que estos llegan en diferentes días, y difieren en precio y vencimiento, y al aplicarle este algoritmo, podríamos ordenarlos en orden de prioridad de vencimiento, para irlos pagando ordenadamente, sin que se nos pasen y sin que gastemos el dinero necesario para pagarlos.
  • También nos serviria para encontrar algun ciclo en un grafo e identificarlo.
  • También para encontrar algun problema o defecto de cierto algoritmo que se ordene topologicamente.

Autoevaluación

En lo personal este proyecto y los otros cuatro me han sido de gran ayuda ya que la mayoría de los temas vistos eran nuevos para mi, y me di cuenta que son de gran utilidad aplicarlos a la vida cotidiana; en lo que respecta a este de la ordenación topológica, pues me deja como enseñanza a los casos en los que puedo aplicar este algoritmo. Aprendí que para alguna tarea en particular hay una(s) antes de precedencia y otra(s) como consecuencia de esa tarea, y que al fin y al cabo están vinculadas unas con otras. En conclusión de ahora en adelante las cosas que tenga que hacer a las que se le pueda aplicar este algoritmo, me facilitara la tarea, y por lo tanto tiempo y esfuerzo.

Para cualquier duda ó pregunta que tengan dejen su comentario y yo les responderé los mas pronto posible.





martes, 18 de mayo de 2010

Puntos Extra "Algoritmo Dijkstra"



Algoritmo Dijkstra:

A Este algoritmo, tambien se le llama algoritmo del "Camino Minimo" ya que consiste en encontrar y tomar 1 de los "n" posibles caminos para llegar al objetivo, este camino elegido debe ser, el de menor costo, ya se a de tiempo, esfuerzo, distancia, etc, si s posible estas caracteristicas juntas en un solo camnino, pues el algoritmo seria más optimo aún.

Es común representar este algoritmo con un grafo, como se muestra en el ejemplo:
  • Se enumeran los vertices, para identificar cada punto.
  • Se enumeran las aristas conforme a su peso o coste.
  • Se inicia de un vertice base, o el vertice de salida.
  • Despues se fija un objetivo.
  • Luego el algoritmo empieza a reconocer todos posibles caminos a elegir, para comenzar.
  • Toma el camino de menor coste o más corto.
  • Así sucesivamente hasta llegar al punto final ó meta.
  • La suma de todo el coste total del el algoritmo, es por ende
    , el más optimo, ya que escogio la ruta que le convenia.














De que me sirve???


Si nos damos cuenta, este algoritmo es más común de lo que su nombre aparenta, ya que, lo utilizamos muy a menudo, si refleccionamos, a cualquier lado al que vamos pensamos detenidamente cual es la mejor manera de llegar a ese lugar, ya sea de como llegar mas rapido, o como llegar con menos gastos ó como llegar con el menor esfuerzo y si es posible uno solo que cumpla con todos estos requisitos.
Pero enfocado a mi carrera, este algoritmo es demaciado utlil, ya que hoy en dia podriamos decir que tiempo es dinero, es decir, el tiempo vale y mucho, entonces me es muy util dominar este algoritmo para aplicarlo a mi desarrollo laboral, ya que hay empresas que pagan muy bien por que el trabajo se haga a tiempo y que sea de calidad, y este algoritmo es una muy buena referencia para basarse en este aspecto.







Explicacion:
En el video se mustra un robot, que es una maquina deterministica que primero reconoce el lugar en el que se encuentra, despues, mediante una computadora ligada al robot, se le asignan puntos u objetivos a llegar, y el robot recorre el camino que mas le conviene en este caso el mas optimo.

lunes, 17 de mayo de 2010

Puntos Extra "Quick Sort"



Definición:


El sistema de ordenamiento rápido Quick Sort es un algoritmo que no solo nos sirve para organizar una lista de datos desorganizados, si no también, para optimizar el tiempo que se ocupa en realizar esta labor, ya que permite ordenar "n" elementos en un tiempo proporcional de O(n log n), lo cual es muy eficiente.


Algoritmo:


La función de este sistema de ordenamiento en una lista de datos desorganizada escoger un pivote, el cual puede ser elegido al azar, pero yo creo mas conveniente, escoger uno que este en medio, después se mandan todos los elementos con valor menor que el pivote al lado izquierdo y a todos los mayores del lado derecho:



elemento < pivote =" Izquierda

elemento > pivote = Derecha



Después empieza a ordenar del lado izquierdo a todos los elementos menores que el pivote de manera recursiva hasta que queden ordenados y lo mismo del lado derecho, hasta el punto en que ambos lados quedan e orden, y por consecuencia toda la lista.



Ejemplo: (Dar clic a la palabra ejemplo para verlo)



  • Es una lista desordenada la cual esta representadas por barras de diferentes tamaños.
  • El algoritmo primeramente escoje un pivote.
  • Después al resto de los elementos los evalúa, así que los que sean menores que el pivote los manda del lado izquierdo y a los mayores del lado derecho.
  • Hace de cada lado lo mismo recursivamnte hasta tenerlos en orden.
  • Y al final como cada lado del pivote esta ordenado entonces nos quedaría una lista en orden.

Para que me sirve???

Bueno a mi en lo personal, este algoritmo es muy útil, ya que me permite organizar datos de manera que puedo enlistar ordenadamente una lista de prioridades a hacer, lo cual me ahorra tiempo y esfuerzo, pero para mi carrera creo que es un algoritmo que me sera muy útil, ya que hay múltiples aplicaciones para este, como hacer programas que me organizen ciertos datos, por que depende de esos datos ordenados para obtener un resultado y si este resultado lo puedo obtener en un mejor tiempo pues me seria muy útil usarlo, un ejemplo seria, que al ingresar ciertos datos (en desorden) tenga que sacar la mediana (Estadística), entonces aquí vendría a aplicar muy bien este algoritmo.


Aplicacion a mi vida diaria:


Yo actualmente trabajo en unas cintas de música, Audio Scream, y aunque no lo creean este algoritmo "Quick Sort" es aplicable ahí, ya el equipo de aparatos con el que contamos difiere unos de otros en peso y tamaño, y los trasladamos por medio de un camión, contamos con aparatos suficientes para atender a 3 eventos al mismo tiempo:


Equipo:

*La lista del equipo esta ordenada con forme a su peso y tamaño*




Entonces, aveces es necesario bajar del camión solo los bajos ó nada mas una estructura o nada mas cable, etc. de manera que si metemos todo al camión desorganizadamente, aparte que no cabria bien, al momento de sacar algo en especifico, nos llevaría mas tiempo primero buscar donde esta y después mover todo lo que hay antes para poder sacarlo; con el algoritmo Quick Sort nos evitariamos todos esos contratiempos, de manera que antes de subir el equipo al camión, podríamos acomodarlo conforme su peso y tamaño, entre más pesado y grande más al fondo y entre entre más ligero y pequeño al frente. De esta manera sabemos que si queremos sacar un Bajo Cerwin-Vega sabríamos que esta al fondo ó si queremos sacar un rac de luces, este estará en medio, y así sabríamos que mover o bajar para poder llegar al objetivo.

Video





Explicacion:

El video muestra la comparacion del metodo Quick Sort vs. Bubble Sort (Ordenamiento Burbuja) que ambos son algoritmios de ordenamiento, pero claramente se muestra que el Quick Sort es mas eficiente, es decir, es más rapido y funcional, ya que el algoritmo Quick Sort hace la misma tarea en menos pasos, por lo que termina antes. En conclucion el Quick Sort es de los algoritmos mas optimos de ordenaminento.